\r
std::shared_ptr<device_buffer> local_key_buffer_;\r
std::shared_ptr<device_buffer> layer_key_buffer_;\r
+\r
+ std::shared_ptr<host_buffer> empty_buffer_;\r
\r
public:\r
implementation(video_channel_context& video_channel) \r
layer_key_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
draw_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\r
local_key_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 1);\r
+\r
+ empty_buffer_ = channel_.ogl().create_host_buffer(channel_.get_format_desc().size, host_buffer::write_only);\r
+ memset(empty_buffer_->data(), 0, empty_buffer_->size());\r
+\r
channel_.ogl().gc();\r
}\r
\r
\r
auto& layer = layers_.back();\r
\r
- auto it = boost::range::find(layer, item);\r
- if(it == layer.end())\r
+ if(boost::range::find(layer, item) == layer.end())\r
layer.push_back(item);\r
}\r
\r
\r
safe_ptr<host_buffer> render(std::deque<layer>&& layers)\r
{\r
+ if(layers.empty())\r
+ return make_safe(empty_buffer_);\r
+\r
if(channel_.get_format_desc().width != write_buffer_->width() || channel_.get_format_desc().height != write_buffer_->height())\r
initialize_buffers();\r
\r
host_buffer->begin_read(write_buffer_->width(), write_buffer_->height(), format(write_buffer_->stride()));\r
\r
GL(glFlush());\r
-\r
+ \r
return host_buffer;\r
}\r
\r
channel_.ogl().yield(); // Try to give it some more time.\r
} \r
\r
- channel_.ogl().attach(*target);\r
kernel_.draw(channel_.ogl(), std::move(item), make_safe(target), local_key, layer_key);\r
}\r
\r