]> git.sesse.net Git - casparcg/blobdiff - core/mixer/image/image_mixer.cpp
2.0. - Removed alpha-mode.
[casparcg] / core / mixer / image / image_mixer.cpp
index f9676e068aeafd413f80362e35cc09655588d9fd..a144b5de9614faf7bca63be480960693d741871f 100644 (file)
@@ -68,6 +68,8 @@ struct image_mixer::implementation : boost::noncopyable
 \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
@@ -89,6 +91,10 @@ public:
                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
@@ -110,8 +116,7 @@ public:
 \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
@@ -138,6 +143,9 @@ public:
        \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
@@ -158,7 +166,7 @@ public:
                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
@@ -199,7 +207,6 @@ public:
                        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