+ }\r
+ \r
+private:\r
+ safe_ptr<host_buffer> do_render(std::vector<layer>&& layers)\r
+ {\r
+ auto draw_buffer = create_device_buffer(4);\r
+\r
+ if(channel_.get_format_desc().field_mode != field_mode::progressive)\r
+ {\r
+ auto upper = layers;\r
+ auto lower = std::move(layers);\r
+\r
+ BOOST_FOREACH(auto& layer, upper)\r
+ {\r
+ boost::remove_erase_if(layer.items, [](const item& item){return !(item.transform.field_mode & field_mode::upper);});\r
+ BOOST_FOREACH(auto& item, layer.items)\r
+ item.transform.field_mode = field_mode::upper;\r
+ }\r
+\r
+ BOOST_FOREACH(auto& layer, lower)\r
+ {\r
+ boost::remove_erase_if(layer.items, [](const item& item){return !(item.transform.field_mode & field_mode::lower);});\r
+ BOOST_FOREACH(auto& item, layer.items)\r
+ item.transform.field_mode = field_mode::lower;\r
+ }\r
+\r
+ draw(std::move(upper), draw_buffer);\r
+ draw(std::move(lower), draw_buffer);\r
+ }\r
+ else\r
+ {\r
+ draw(std::move(layers), draw_buffer);\r
+ }\r
+\r
+ auto host_buffer = channel_.ogl().create_host_buffer(channel_.get_format_desc().size, host_buffer::read_only);\r
+ channel_.ogl().attach(*draw_buffer);\r
+ host_buffer->begin_read(draw_buffer->width(), draw_buffer->height(), format(draw_buffer->stride()));\r
+ \r
+ active_buffer_ = draw_buffer;\r
+\r
+ channel_.ogl().flush(); // NOTE: This is important, otherwise fences will deadlock.\r
+ \r
+ return host_buffer;\r
+ }\r
+\r
+ void draw(std::vector<layer>&& layers, \r
+ safe_ptr<device_buffer>& draw_buffer)\r
+ {\r
+ std::shared_ptr<device_buffer> layer_key_buffer;\r
+\r
+ BOOST_FOREACH(auto& layer, layers)\r
+ draw_layer(std::move(layer), draw_buffer, layer_key_buffer);\r
+ }\r
+\r
+ void draw_layer(layer&& layer, \r
+ safe_ptr<device_buffer>& draw_buffer,\r
+ std::shared_ptr<device_buffer>& layer_key_buffer)\r
+ { \r
+ if(layer.items.empty())\r
+ return;\r
+\r
+ std::shared_ptr<device_buffer> local_key_buffer;\r
+ std::shared_ptr<device_buffer> local_mix_buffer;\r
+ \r
+ if(layer.blend_mode != blend_mode::normal && layer.items.size() > 1)\r
+ {\r
+ auto layer_draw_buffer = create_device_buffer(4);\r
+\r
+ BOOST_FOREACH(auto& item, layer.items)\r
+ draw_item(std::move(item), layer_draw_buffer, layer_key_buffer, local_key_buffer, local_mix_buffer); \r