image_kernel kernel_;\r
\r
std::shared_ptr<device_buffer> draw_buffer_;\r
- std::shared_ptr<device_buffer> write_buffer_;\r
\r
std::shared_ptr<device_buffer> local_key_buffer_;\r
std::shared_ptr<device_buffer> layer_key_buffer_;\r
{\r
channel_.ogl().gc();\r
}\r
-\r
- void initialize_buffers()\r
- {\r
- write_buffer_.reset(); \r
- layer_key_buffer_.reset();\r
- draw_buffer_.reset(); \r
- local_key_buffer_.reset();\r
-\r
- channel_.ogl().gc();\r
-\r
- write_buffer_ = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);\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
-\r
+ \r
void begin(core::basic_frame& frame)\r
{\r
transform_stack_.push_back(transform_stack_.back()*frame.get_image_transform());\r
\r
safe_ptr<host_buffer> render(std::deque<layer>&& layers)\r
{\r
- if(!write_buffer_ || channel_.get_format_desc().width != write_buffer_->width() || channel_.get_format_desc().height != write_buffer_->height())\r
- initialize_buffers();\r
- \r
- channel_.ogl().clear(*layer_key_buffer_);\r
- channel_.ogl().clear(*local_key_buffer_);\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
- bool layer_key = false;\r
- \r
+ \r
BOOST_FOREACH(auto& layer, layers)\r
- draw(std::move(layer), layer_key);\r
-\r
- std::swap(draw_buffer_, write_buffer_);\r
- \r
+ draw(std::move(layer));\r
+ \r
auto host_buffer = channel_.ogl().create_host_buffer(channel_.get_format_desc().size, host_buffer::read_only);\r
- \r
- channel_.ogl().attach(*write_buffer_);\r
- host_buffer->begin_read(write_buffer_->width(), write_buffer_->height(), format(write_buffer_->stride()));\r
+ channel_.ogl().attach(*draw_buffer_);\r
+ host_buffer->begin_read(draw_buffer_->width(), draw_buffer_->height(), format(draw_buffer_->stride()));\r
\r
GL(glFlush());\r
\r
return host_buffer;\r
}\r
\r
- void draw(layer&& layer, bool& layer_key)\r
- { \r
- bool local_key = false;\r
- \r
- channel_.ogl().clear(*local_key_buffer_);\r
-\r
+ void draw(layer&& layer)\r
+ { \r
BOOST_FOREACH(auto& item, layer)\r
- draw(std::move(item), local_key, layer_key);\r
+ draw(std::move(item));\r
\r
- layer_key = local_key;\r
-\r
std::swap(local_key_buffer_, layer_key_buffer_);\r
}\r
\r
- void draw(render_item&& item, bool& local_key, bool& layer_key)\r
+ void draw(render_item&& item)\r
{ \r
if(item.transform.get_is_key())\r
{\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
+ }\r
+\r
draw(local_key_buffer_, std::move(item), nullptr, nullptr);\r
- local_key = true;\r
}\r
else\r
{\r
- draw(draw_buffer_, std::move(item), local_key ? local_key_buffer_ : nullptr, layer_key ? layer_key_buffer_ : nullptr); \r
- channel_.ogl().clear(*local_key_buffer_);\r
- local_key = false;\r
+ draw(draw_buffer_, std::move(item), local_key_buffer_, layer_key_buffer_); \r
+ local_key_buffer_.reset();\r
}\r
}\r
\r