]> 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>
Thu, 16 Feb 2012 17:46:19 +0000 (17:46 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 16 Feb 2012 17:46:19 +0000 (17:46 +0000)
accelerator/ogl/image/image_mixer.cpp
accelerator/ogl/util/device.cpp
shell/casparcg.config

index d2d8509bc7433e6e488dbb719bb143a1096d56ed..0688fe6154efae8e3d4bd8a5d11eaa865c8a56fd 100644 (file)
@@ -110,7 +110,7 @@ bool operator!=(const layer& lhs, const layer& rhs)
 \r
 class image_renderer\r
 {\r
-       spl::shared_ptr<device>                                                                                                                                         ogl_;\r
+       spl::shared_ptr<device>                                                                                                                                                 ogl_;\r
        image_kernel                                                                                                                                                                    kernel_;\r
        std::pair<std::vector<layer>, boost::shared_future<boost::iterator_range<const uint8_t*>>>              last_image_;    \r
 public:\r
@@ -162,9 +162,7 @@ private:
                else\r
                {       \r
                        // Start host->device transfers.\r
-\r
-                       std::map<const host_buffer*, future_texture> buffer_map;\r
-\r
+                       \r
                        BOOST_FOREACH(auto& layer, layers)\r
                        {\r
                                BOOST_FOREACH(auto& item, layer.items)\r
@@ -175,14 +173,9 @@ private:
                                        for(size_t n = 0; n < host_buffers.size(); ++n) \r
                                        {\r
                                                auto buffer     = host_buffers[n];\r
-                                               auto it         = buffer_map.find(buffer.get());\r
-                                               if(it == buffer_map.end())\r
-                                               {\r
-                                                       auto plane                      = item.pix_desc.planes[n];\r
-                                                       auto future_texture     = ogl_->copy_async(buffer, plane.width, plane.height, plane.channels);\r
-                                                       it = buffer_map.insert(std::make_pair(buffer.get(), std::move(future_texture))).first;\r
-                                               }\r
-                                               item.textures.push_back(it->second);\r
+                                               auto plane                      = item.pix_desc.planes[n];\r
+                                               auto future_texture     = ogl_->copy_async(buffer, plane.width, plane.height, plane.channels);          \r
+                                               item.textures.push_back(std::move(future_texture));\r
                                        }       \r
                                        item.buffers.clear();\r
                                }\r
@@ -377,7 +370,7 @@ private:
                \r
 struct image_mixer::impl : boost::noncopyable\r
 {      \r
-       spl::shared_ptr<device>                 ogl_;\r
+       spl::shared_ptr<device>                         ogl_;\r
        image_renderer                                          renderer_;\r
        std::vector<core::image_transform>      transform_stack_;\r
        std::vector<layer>                                      layers_; // layer/stream/items\r
index 72b4432540db68cd3942b5b78788a9fedae98616..5df73f3f0f2f20e874d7e2a95cbed38b1097e402 100644 (file)
@@ -52,6 +52,8 @@ namespace caspar { namespace accelerator { namespace ogl {
                \r
 struct device::impl : public std::enable_shared_from_this<impl>\r
 {\r
+       std::map<host_buffer*, spl::shared_ptr<device_buffer>> write_buffer_transfer_cache_;\r
+\r
        std::unique_ptr<sf::Context> device_;\r
        std::unique_ptr<sf::Context> host_alloc_device_;\r
        \r
@@ -134,17 +136,15 @@ struct device::impl : public std::enable_shared_from_this<impl>
        {\r
                return executor_.invoke([&]() -> spl::shared_ptr<device_buffer>\r
                {\r
-                       std::shared_ptr<device_buffer> buffer;\r
                        try\r
                        {\r
-                               buffer.reset(new device_buffer(width, height, stride));\r
+                               return spl::make_shared<device_buffer>(width, height, stride);\r
                        }\r
                        catch(...)\r
                        {\r
                                CASPAR_LOG(error) << L"ogl: create_device_buffer failed!";\r
                                throw;\r
                        }\r
-                       return spl::make_shared_ptr(buffer);\r
                });\r
        }\r
                                \r
@@ -170,23 +170,21 @@ struct device::impl : public std::enable_shared_from_this<impl>
        {\r
                return host_alloc_executor_.invoke([=]() -> spl::shared_ptr<host_buffer>\r
                {\r
-                       std::shared_ptr<host_buffer> buffer;\r
-\r
                        try\r
                        {\r
-                               buffer.reset(new host_buffer(size, usage));\r
+                               auto buffer = spl::make_shared<host_buffer>(size, usage);\r
                                if(usage == host_buffer::usage::write_only)\r
                                        buffer->map();\r
                                else\r
-                                       buffer->unmap();                        \r
+                                       buffer->unmap();        \r
+\r
+                               return buffer;\r
                        }\r
                        catch(...)\r
                        {\r
                                CASPAR_LOG(error) << L"ogl: create_host_buffer failed!";\r
                                throw;  \r
                        }\r
-\r
-                       return spl::make_shared_ptr(buffer);\r
                });\r
        }\r
        \r
@@ -208,13 +206,18 @@ struct device::impl : public std::enable_shared_from_this<impl>
                {\r
                        self->host_alloc_executor_.begin_invoke([=]() mutable\r
                        {               \r
-                               if(is_write)\r
-                                       buffer->map();\r
+                               if(is_write)                            \r
+                                       buffer->map();                          \r
                                else\r
                                        buffer->unmap();\r
 \r
                                pool->push(buffer);\r
                        }, task_priority::high_priority);       \r
+\r
+                       self->executor_.begin_invoke([=]\r
+                       {\r
+                               write_buffer_transfer_cache_.erase(buffer.get());                               \r
+                       }, task_priority::high_priority);       \r
                });\r
        }\r
                \r
@@ -235,9 +238,14 @@ struct device::impl : public std::enable_shared_from_this<impl>
        {\r
                return executor_.begin_invoke([=]() -> spl::shared_ptr<device_buffer>\r
                {\r
-                       auto result = create_device_buffer(width, height, stride);\r
-                       result->copy_from(*source);\r
-                       return result;\r
+                       auto buffer_it = write_buffer_transfer_cache_.find(source.get());\r
+                       if(buffer_it == write_buffer_transfer_cache_.end())\r
+                       {\r
+                               auto result = create_device_buffer(width, height, stride);\r
+                               result->copy_from(*source);\r
+                               buffer_it = write_buffer_transfer_cache_.insert(std::make_pair(source.get(), result)).first;\r
+                       }\r
+                       return buffer_it->second;\r
                }, task_priority::high_priority);\r
        }\r
 };\r
index 2431a0753e0e008b44ff98b3fb135f1f90b0d333..ecc27fc34df45805e111fe12856fc38c167bc02e 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>\r
 <configuration>\r
-  <channel-grid>true</channel-grid>\r
   <paths>\r
     <media-path>D:\casparcg\_media\</media-path>\r
     <log-path>D:\casparcg\_log\</log-path>\r
@@ -14,7 +13,7 @@
   </flash>\r
   <channels>\r
     <channel>\r
-      <video-mode>PAL</video-mode>\r
+      <video-mode>720p5000</video-mode>\r
       <consumers>\r
         <screen>\r
         </screen>\r