]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: mixer: Disabled IS_KEY. Still not working 100%. Refactored. Use global frame...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 17 May 2011 10:23:36 +0000 (10:23 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 17 May 2011 10:23:36 +0000 (10:23 +0000)
         ogl_device: Check for ogl 3.0 support directly in ogl_device.

git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@765 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/gpu/ogl_device.cpp
core/mixer/gpu/ogl_device.h
core/mixer/image/image_kernel.cpp
core/mixer/image/image_kernel.h
core/mixer/image/image_mixer.cpp
core/mixer/image/image_mixer.h
protocol/amcp/AMCPCommandsImpl.cpp

index 51be99642508fe18bf7f581b96a6fa3bde3a7a16..b86485e0747ce7fa41c7d55299d8073902e5c55a 100644 (file)
@@ -22,6 +22,7 @@
 #include "ogl_device.h"\r
 \r
 #include <common/utility/assert.h>\r
+#include <common/gl/gl_check.h>\r
 \r
 #include <Glee.h>\r
 #include <SFML/Window.hpp>\r
 \r
 namespace caspar { namespace mixer {\r
 \r
-ogl_device::ogl_device() : executor_(L"ogl_device")\r
+ogl_device::ogl_device() : executor_(L"ogl_device", true)\r
 {\r
-       executor_.start();\r
        invoke([=]\r
        {\r
                context_.reset(new sf::Context());\r
                context_->SetActive(true);\r
+                                               \r
+               if(!GLEE_VERSION_3_0)\r
+                       BOOST_THROW_EXCEPTION(not_supported() << msg_info("Missing OpenGL 3.0 support."));\r
+\r
+               GL(glGenFramebuffers(1, &fbo_));                \r
+               GL(glBindFramebuffer(GL_FRAMEBUFFER_EXT, fbo_));\r
+               GL(glReadBuffer(GL_COLOR_ATTACHMENT0_EXT));\r
        });\r
 }\r
 \r
@@ -48,6 +55,7 @@ ogl_device::~ogl_device()
                        pool.clear();\r
                BOOST_FOREACH(auto& pool, host_pools_)\r
                        pool.clear();\r
+               glDeleteFramebuffersEXT(1, &fbo_);\r
        });\r
 }\r
                                \r
index 544711ebf9b27456423771f3534fcbdfcbba6761..47bc13894d6e73722af654950c5e734e6c65b804 100644 (file)
@@ -42,6 +42,8 @@ class ogl_device
        \r
        std::array<tbb::concurrent_unordered_map<size_t, tbb::concurrent_bounded_queue<std::shared_ptr<device_buffer>>>, 4> device_pools_;\r
        std::array<tbb::concurrent_unordered_map<size_t, tbb::concurrent_bounded_queue<std::shared_ptr<host_buffer>>>, 2> host_pools_;\r
+       \r
+       unsigned int fbo_;\r
 \r
        executor executor_;\r
 \r
index 0ac999961f4c22613648d6145db195238b7a1697..7da9627e0e41cf26b0395af773930aece2d44969 100644 (file)
@@ -302,6 +302,9 @@ image_kernel::image_kernel() : impl_(new implementation()){}
 \r
 void image_kernel::draw(size_t width, size_t height, const core::pixel_format_desc& pix_desc, const core::image_transform& transform, bool has_separate_key)\r
 {\r
+       GL(glEnable(GL_TEXTURE_2D));\r
+       GL(glDisable(GL_DEPTH_TEST));   \r
+\r
        impl_->shaders()[pix_desc.pix_fmt].use();\r
 \r
        GL(glUniform1f(impl_->shaders()[pix_desc.pix_fmt].get_location("gain"), static_cast<GLfloat>(transform.get_gain())));\r
index be756f477a5e2c1b488b86b806ba8d1cc08809c1..4c07091fa877951f8629b1d8f3f930cca70fb18a 100644 (file)
@@ -19,7 +19,7 @@
 */\r
 #pragma once\r
 \r
-#include <memory>\r
+#include <common/memory/safe_ptr.h>\r
 \r
 #include <core/producer/frame/pixel_format.h>\r
 #include <core/producer/frame/image_transform.h>\r
@@ -34,7 +34,7 @@ public:
 \r
 private:\r
        struct implementation;\r
-       std::shared_ptr<implementation> impl_;\r
+       safe_ptr<implementation> impl_;\r
 };\r
 \r
 }}
\ No newline at end of file
index b16e42fc25c8939cc8c2c21b9f043d3c4ab0ba9e..a3b68a257a6c17a4ce48cbe058bccd4dd0408942 100644 (file)
 namespace caspar { namespace mixer {\r
                \r
 struct image_mixer::implementation : boost::noncopyable\r
-{                      \r
+{      \r
+       struct render_item\r
+       {\r
+               core::pixel_format_desc desc;\r
+               std::vector<safe_ptr<device_buffer>> textures;\r
+               core::image_transform transform;\r
+       };\r
+\r
        const core::video_format_desc format_desc_;\r
        \r
        std::stack<core::image_transform> transform_stack_;\r
 \r
-       GLuint fbo_;\r
-       std::array<std::shared_ptr<device_buffer>, 2> render_targets_;\r
-       std::shared_ptr<device_buffer> key_target_;\r
        bool is_key_;\r
 \r
-       std::shared_ptr<host_buffer> reading_;\r
+       safe_ptr<device_buffer> front_target_;\r
+       safe_ptr<device_buffer> back_target_;\r
+       safe_ptr<device_buffer> key_target_;\r
 \r
-       image_kernel kernel_;\r
+       safe_ptr<host_buffer>   reading_;\r
 \r
-       struct render_item\r
-       {\r
-               core::pixel_format_desc desc;\r
-               std::vector<safe_ptr<device_buffer>> textures;\r
-               core::image_transform transform;\r
-       };\r
-       \r
+       image_kernel kernel_;\r
+               \r
        std::vector<render_item> waiting_queue_;\r
        std::vector<render_item> render_queue_;\r
 \r
@@ -74,38 +75,14 @@ public:
        implementation(const core::video_format_desc& format_desc) \r
                : format_desc_(format_desc)\r
                , is_key_(false)\r
+               , back_target_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
+               , front_target_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
+               , key_target_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
+               , reading_(ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only))\r
        {\r
-               ogl_device::invoke([]\r
-               {\r
-                       if(!GLEE_VERSION_3_0)\r
-                               BOOST_THROW_EXCEPTION(not_supported() << msg_info("Missing OpenGL 3.0 support."));\r
-               });\r
-               \r
-               ogl_device::begin_invoke([=]\r
-               {\r
-                       transform_stack_.push(core::image_transform());\r
-                       transform_stack_.top().set_mode(core::video_mode::progressive);\r
-\r
-                       GL(glEnable(GL_TEXTURE_2D));\r
-                       GL(glDisable(GL_DEPTH_TEST));           \r
-                       \r
-                       key_target_ = ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4);\r
-                       render_targets_[0] = ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4);\r
-                       render_targets_[1] = ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4);\r
-                       \r
-                       GL(glGenFramebuffers(1, &fbo_));                \r
-                       GL(glBindFramebuffer(GL_FRAMEBUFFER_EXT, fbo_));\r
-                       GL(glReadBuffer(GL_COLOR_ATTACHMENT0_EXT));\r
-\r
-                       reading_ = ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only);\r
-               });\r
-       }\r
-\r
-       ~implementation()\r
-       {\r
-               glDeleteFramebuffersEXT(1, &fbo_);\r
+               transform_stack_.push(core::image_transform());\r
        }\r
-\r
+       \r
        void begin(const core::basic_frame& frame)\r
        {\r
                transform_stack_.push(transform_stack_.top()*frame.get_image_transform());\r
@@ -150,7 +127,7 @@ public:
                auto result = ogl_device::begin_invoke([=]() -> safe_ptr<const host_buffer>\r
                {\r
                        reading_->map(); // Might block.\r
-                       return make_safe(reading_);\r
+                       return reading_;\r
                });\r
                        \r
                ogl_device::begin_invoke([=]\r
@@ -162,7 +139,7 @@ public:
                        key_target_->attach();\r
                        GL(glClear(GL_COLOR_BUFFER_BIT));       \r
 \r
-                       render_targets_[0]->attach();\r
+                       front_target_->attach();\r
                        GL(glClear(GL_COLOR_BUFFER_BIT));\r
 \r
                        // Render items.\r
@@ -177,9 +154,9 @@ public:
                        // Start read-back.\r
 \r
                        reading_ = ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only);\r
-                       render_targets_[0]->attach();\r
-                       render_targets_[0]->write(*reading_);\r
-                       std::swap(render_targets_[0], render_targets_[1]);\r
+                       front_target_->attach();\r
+                       front_target_->write(*reading_);\r
+                       std::swap(front_target_, back_target_);\r
                });\r
 \r
                return std::move(result);\r
@@ -219,7 +196,7 @@ public:
                                has_separate_key = true;\r
                                is_key_ = false;\r
 \r
-                               render_targets_[0]->attach();                   \r
+                               front_target_->attach();                        \r
                                GL(glActiveTexture(GL_TEXTURE0+3));\r
                                key_target_->bind();\r
                        }       \r
index 263963bb086faaf26f3bc0eced4d903542330b22..537ac6eabca45be6859d88734dcba0c0fa20fe62 100644 (file)
@@ -19,6 +19,8 @@
 */\r
 #pragma once\r
 \r
+#include <common/memory/safe_ptr.h>\r
+\r
 #include <core/video_format.h>\r
 #include <core/producer/frame/frame_visitor.h>\r
 #include <core/producer/frame/pixel_format.h>\r
@@ -28,7 +30,6 @@
 #include <boost/noncopyable.hpp>\r
 #include <boost/thread/future.hpp>\r
 \r
-#include <memory>\r
 #include <vector>\r
 \r
 namespace caspar { namespace mixer {\r
@@ -48,7 +49,7 @@ public:
 \r
 private:\r
        struct implementation;\r
-       std::shared_ptr<implementation> impl_;\r
+       safe_ptr<implementation> impl_;\r
 };\r
 \r
 }}
\ No newline at end of file
index d6620ffb015837fba398de7a070cd33b79e51d50..2c5c402915149481ac2758004f5e03980441411a 100644 (file)
@@ -204,18 +204,18 @@ bool MixerCommand::DoExecute()
                {\r
                        if(_parameters[1] == L"IS_KEY")\r
                        {\r
-                               bool value = lexical_cast_or_default(_parameters.at(2), false);\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_is_key(value);\r
-                                       return transform;                                       \r
-                               };\r
-\r
-                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
-                               if(layer != std::numeric_limits<int>::min())                                    \r
-                                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0);\r
-                               else\r
-                                       GetChannel()->mixer()->apply_image_transform(transform, 0);\r
+                               //bool value = lexical_cast_or_default(_parameters.at(2), false);\r
+                               //auto transform = [=](image_transform transform) -> image_transform\r
+                               //{\r
+                               //      transform.set_is_key(value);\r
+                               //      return transform;                                       \r
+                               //};\r
+\r
+                               //int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               //if(layer != std::numeric_limits<int>::min())                                  \r
+                               //      GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0);\r
+                               //else\r
+                               //      GetChannel()->mixer()->apply_image_transform(transform, 0);\r
                        }\r
                        else if(_parameters[1] == L"OPACITY")\r
                        {\r