\r
image_kernel kernel_;\r
\r
- std::shared_ptr<device_buffer> draw_buffer_;\r
-\r
- std::shared_ptr<device_buffer> local_key_buffer_;\r
- std::shared_ptr<device_buffer> layer_key_buffer_;\r
- \r
+ std::shared_ptr<device_buffer> draw_buffer_; \r
public:\r
implementation(video_channel_context& video_channel) \r
: channel_(video_channel)\r
\r
safe_ptr<host_buffer> render(std::deque<layer>&& layers)\r
{\r
+ std::shared_ptr<device_buffer> layer_key_buffer;\r
+\r
draw_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4); \r
channel_.ogl().clear(*draw_buffer_);\r
\r
BOOST_FOREACH(auto& layer, layers)\r
- draw(std::move(layer));\r
+ draw(std::move(layer), layer_key_buffer);\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
return host_buffer;\r
}\r
\r
- void draw(layer&& layer)\r
+ void draw(layer&& layer, std::shared_ptr<device_buffer>& layer_key_buffer)\r
{ \r
+ std::shared_ptr<device_buffer> local_key_buffer;\r
+\r
BOOST_FOREACH(auto& item, layer)\r
- draw(std::move(item));\r
+ draw(std::move(item), local_key_buffer, layer_key_buffer);\r
\r
- std::swap(local_key_buffer_, layer_key_buffer_);\r
+ std::swap(local_key_buffer, layer_key_buffer);\r
}\r
\r
- void draw(render_item&& item)\r
+ void draw(render_item&& item, std::shared_ptr<device_buffer>& local_key_buffer, std::shared_ptr<device_buffer>& layer_key_buffer)\r
{ \r
if(item.transform.get_is_key())\r
{\r
- if(!local_key_buffer_)\r
+ if(!local_key_buffer)\r
{\r
- local_key_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
- channel_.ogl().clear(*local_key_buffer_);\r
+ local_key_buffer = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
+ channel_.ogl().clear(*local_key_buffer);\r
}\r
\r
- draw(local_key_buffer_, std::move(item), nullptr, nullptr);\r
+ draw(std::move(item), local_key_buffer, nullptr, nullptr);\r
}\r
else\r
{\r
- draw(draw_buffer_, std::move(item), local_key_buffer_, layer_key_buffer_); \r
- local_key_buffer_.reset();\r
+ draw(std::move(item), draw_buffer_, local_key_buffer, layer_key_buffer); \r
+ local_key_buffer.reset();\r
}\r
}\r
\r
- void draw(std::shared_ptr<device_buffer>& target, render_item&& item, const std::shared_ptr<device_buffer>& local_key, const std::shared_ptr<device_buffer>& layer_key)\r
+ void draw(render_item&& item, std::shared_ptr<device_buffer>& draw_buffer, const std::shared_ptr<device_buffer>& local_key, const std::shared_ptr<device_buffer>& layer_key)\r
{\r
if(!std::all_of(item.textures.begin(), item.textures.end(), std::mem_fn(&device_buffer::ready)))\r
{\r
channel_.ogl().yield(); // Try to give it some more time.\r
} \r
\r
- kernel_.draw(channel_.ogl(), std::move(item), make_safe(target), local_key, layer_key);\r
+ kernel_.draw(channel_.ogl(), std::move(item), make_safe(draw_buffer), local_key, layer_key);\r
}\r
\r
safe_ptr<write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r