]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 15 Aug 2011 13:47:47 +0000 (13:47 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 15 Aug 2011 13:47:47 +0000 (13:47 +0000)
core/mixer/image/image_mixer.cpp

index ad296cb4b7c4279bba5ee89a0b9c76ef3785c521..7d1d595e0e60313cbf1fcd25f5276461a0e8147f 100644 (file)
@@ -63,11 +63,7 @@ struct image_mixer::implementation : boost::noncopyable
        \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
@@ -129,11 +125,13 @@ public:
        \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
@@ -144,36 +142,36 @@ public:
                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
-               local_key_buffer_.reset();\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
@@ -181,7 +179,7 @@ public:
                        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