+ // TODO: We might have more overlaps for opacity transitions\r
+ // TODO: What about blending modes, are they ok? Maybe only overlap detection is required for opacity?\r
+ void draw(layer&& layer, const safe_ptr<device_buffer>& draw_buffer, std::shared_ptr<device_buffer>& layer_key_buffer)\r
+ { \r
+ if(layer.empty())\r
+ return;\r
+\r
+ std::pair<int, std::shared_ptr<device_buffer>> local_key_buffer;\r
+ \r
+ //if(has_overlapping_items(layer, layer.front().transform.get_blend_mode()))\r
+ //{\r
+ // auto local_draw_buffer = create_device_buffer(4); \r
+\r
+ // auto local_blend_mode = layer.front().transform.get_blend_mode();\r
+\r
+ // int fields = 0;\r
+ // BOOST_FOREACH(auto& item, layer)\r
+ // {\r
+ // if(fields & item.mode)\r
+ // item.transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack.\r
+ // else\r
+ // {\r
+ // item.transform.set_blend_mode(image_transform::blend_mode::replace); // Target field is empty, no blending, just copy\r
+ // fields |= item.mode;\r
+ // }\r
+\r
+ // draw_item(std::move(item), local_draw_buffer, local_key_buffer, layer_key_buffer); \r
+ // }\r
+\r
+ // kernel_.draw(channel_.ogl(), create_render_item(local_draw_buffer, local_blend_mode), draw_buffer, nullptr, nullptr);\r
+ //}\r
+ //else // fast path\r
+ //{\r
+ BOOST_FOREACH(auto& item, layer) \r
+ draw_item(std::move(item), draw_buffer, local_key_buffer, layer_key_buffer); \r
+ //} \r
+\r
+ CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::video_mode::progressive);\r
+\r
+ std::swap(local_key_buffer.second, layer_key_buffer);\r
+ }\r
+\r
+ void draw_item(render_item&& item, \r
+ const safe_ptr<device_buffer>& draw_buffer, \r
+ std::pair<int, std::shared_ptr<device_buffer>>& local_key_buffer, \r
+ std::shared_ptr<device_buffer>& layer_key_buffer)\r
+ { \r
+ if(item.transform.get_is_key())\r
+ {\r
+ if(!local_key_buffer.second)\r