]> git.sesse.net Git - casparcg/commitdiff
2.0. image_mixer: Refactored and reduced memory usage.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 15 Aug 2011 13:18:05 +0000 (13:18 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 15 Aug 2011 13:18:05 +0000 (13:18 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1186 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_mixer.cpp
core/video_channel.cpp

index d68113f64257ab8d962034bda8e8071e54d2e0f0..ae8fec69ddf1bee20f56f712b42ce0434cba160a 100644 (file)
@@ -64,7 +64,6 @@ struct image_mixer::implementation : boost::noncopyable
        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
@@ -81,22 +80,7 @@ public:
        {\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
@@ -145,56 +129,45 @@ public:
        \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
index 3519e2f3c5836179ce1f4d9499fcbd8d48214847..2d323e1ca08cdb8f1a1a779945f2c81d8d048ff3 100644 (file)
@@ -137,6 +137,7 @@ public:
                context_.execution().begin_invoke([=]\r
                {\r
                        stage_->clear();\r
+                       context_.ogl().gc().wait();\r
                        context_.set_format_desc(format_desc);\r
                });\r
        }\r