{\r
pixel_format_desc desc;\r
std::vector<safe_ptr<device_buffer>> textures;\r
+ int tag;\r
core::image_transform transform;\r
};\r
\r
\r
void visit(core::write_frame& frame)\r
{ \r
- render_item item = {frame.get_pixel_format_desc(), frame.get_textures(), transform_stack_.top()*frame.get_image_transform()}; \r
+ render_item item = {frame.get_pixel_format_desc(), frame.get_textures(), frame.tag(), transform_stack_.top()*frame.get_image_transform()}; \r
render_queue_.back().push(item);\r
}\r
\r
render_queue.pop();\r
\r
draw_buffer_->attach(); \r
-\r
+ \r
while(!layer.empty())\r
{\r
- auto frame = layer.front();\r
- layer.pop();\r
+ // Split layer into streams\r
+ std::vector<render_item> stream;\r
+ do\r
+ {\r
+ stream.push_back(layer.front());\r
+ layer.pop();\r
+ }\r
+ while(!layer.empty() && layer.front().tag == stream.front().tag);\r
+\r
+ draw(stream);\r
\r
- draw(frame);\r
channel_.ogl().yield(); // Allow quick buffer allocation to execute.\r
}\r
\r
return std::move(result.get());\r
}\r
\r
- void draw(const render_item& item)\r
- { \r
- // Bind textures\r
-\r
- for(size_t n = 0; n < item.textures.size(); ++n)\r
- item.textures[n]->bind(n); \r
-\r
- // Setup key and kernel\r
-\r
- bool local_key = false;\r
- bool layer_key = false;\r
+ void draw(const std::vector<render_item>& stream)\r
+ { \r
+ if(stream.empty())\r
+ return; \r
\r
- if(item.transform.get_is_key()) // This is a key frame, render it to the local_key buffer for later use.\r
+ BOOST_FOREACH(auto item, stream)\r
{\r
- if(!local_key_) // Initialize local-key if it is not active.\r
- {\r
- local_key_buffer_->clear();\r
- local_key_buffer_->attach();\r
- local_key_ = true;\r
- }\r
- } \r
- else // This is a normal frame. Use key buffers if they are active.\r
- { \r
- local_key = local_key_;\r
- layer_key = layer_key_;\r
+ bool local_key = false;\r
+ bool layer_key = false;\r
\r
- if(local_key_) // Use local key if we have it.\r
+ // Setup key and kernel\r
+ \r
+ if(item.transform.get_is_key()) // This is a key frame, render it to the local_key buffer for later use.\r
{\r
- local_key_buffer_->bind(LOCAL_KEY_INDEX);\r
- draw_buffer_->attach(); \r
- local_key_ = false; // Use it only one time.\r
+ if(!local_key_) // Initialize local-key if it is not active.\r
+ {\r
+ local_key_buffer_->clear();\r
+ local_key_buffer_->attach();\r
+ local_key_ = true;\r
+ }\r
} \r
+ else // This is a normal frame. Use key buffers if they are active.\r
+ { \r
+ local_key = local_key_;\r
+ layer_key = layer_key_;\r
+\r
+ if(local_key_) // Use local key if we have it.\r
+ {\r
+ local_key_buffer_->bind(LOCAL_KEY_INDEX);\r
+ draw_buffer_->attach(); \r
+ } \r
+\r
+ if(layer_key_) // Use layer key if we have it.\r
+ layer_key_buffer_->bind(LAYER_KEY_INDEX);\r
+ } \r
\r
- if(layer_key_) // Use layer key if we have it.\r
- layer_key_buffer_->bind(LAYER_KEY_INDEX);\r
- } \r
+ // Bind textures\r
+\r
+ for(size_t n = 0; n < item.textures.size(); ++n)\r
+ item.textures[n]->bind(n); \r
+ \r
+ // Draw\r
\r
- // Draw\r
+ kernel_.draw(channel_.get_format_desc().width, channel_.get_format_desc().height, item.desc, item.transform, local_key, layer_key); \r
+ }\r
\r
- kernel_.draw(channel_.get_format_desc().width, channel_.get_format_desc().height, item.desc, item.transform, local_key, layer_key); \r
+ local_key_ = stream.back().transform.get_is_key(); // Keep for next layer if last frame is key\r
}\r
\r
safe_ptr<write_frame> create_frame(void* tag, const core::pixel_format_desc& desc)\r