]> git.sesse.net Git - casparcg/commitdiff
2.0.2: ogl_device life-time fixed.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 14 Nov 2011 08:53:19 +0000 (08:53 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 14 Nov 2011 08:53:19 +0000 (08:53 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.2@1567 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

16 files changed:
common/memory/memcpy.h
core/mixer/gpu/ogl_device.cpp
core/mixer/gpu/ogl_device.h
core/mixer/image/image_mixer.cpp
core/mixer/image/image_mixer.h
core/mixer/read_frame.cpp
core/mixer/read_frame.h
core/mixer/write_frame.cpp
core/mixer/write_frame.h
core/video_channel.cpp
core/video_channel.h
core/video_channel_context.cpp
core/video_channel_context.h
protocol/amcp/AMCPCommandsImpl.cpp
shell/casparcg.config
shell/server.cpp

index 82040c02c5f3b0df5fb5b7c6e7c7c7625f99fa18..40504be35dc95d149f2387c21cbcbeea0f4d9479 100644 (file)
@@ -150,10 +150,11 @@ static void* fast_memcpy_aligned(void* dest, const void* source, size_t count)
        size_t rest = count & 2047;\r
        count &= ~2047;\r
                \r
+       tbb::affinity_partitioner ap;\r
        tbb::parallel_for(tbb::blocked_range<size_t>(0, count/128), [&](const tbb::blocked_range<size_t>& r)\r
        {       \r
                fast_memcpy_aligned_impl(reinterpret_cast<char*>(dest) + r.begin()*128, reinterpret_cast<const char*>(source) + r.begin()*128, r.size()*128);   \r
-       });\r
+       }, ap);\r
        \r
        return fast_memcpy_small_aligned(dest8+count, source8+count, rest);\r
 }\r
@@ -166,10 +167,11 @@ static void* fast_memcpy_unaligned(void* dest, const void* source, size_t count)
        size_t rest = count & 2047;\r
        count &= ~2047;\r
                \r
+       tbb::affinity_partitioner ap;\r
        tbb::parallel_for(tbb::blocked_range<size_t>(0, count/128), [&](const tbb::blocked_range<size_t>& r)\r
        {       \r
                fast_memcpy_unaligned_impl(reinterpret_cast<char*>(dest) + r.begin()*128, reinterpret_cast<const char*>(source) + r.begin()*128, r.size()*128);   \r
-       });\r
+       }, ap);\r
        \r
        return fast_memcpy_small_unaligned(dest8+count, source8+count, rest);\r
 }\r
index b916d5a266b21aa637bf606b79d3cd2ad2d26740..0688e3f7bd11c2016dbb54c9d08d925467e7039e 100644 (file)
@@ -166,9 +166,10 @@ safe_ptr<host_buffer> ogl_device::create_host_buffer(size_t size, host_buffer::u
        \r
        //++pool->usage_count;\r
 \r
+       auto self = shared_from_this();\r
        return safe_ptr<host_buffer>(buffer.get(), [=](host_buffer*) mutable\r
        {\r
-               executor_.begin_invoke([=]() mutable\r
+               self->executor_.begin_invoke([=]() mutable\r
                {               \r
                        if(usage == host_buffer::write_only)\r
                                buffer->map();\r
@@ -180,6 +181,11 @@ safe_ptr<host_buffer> ogl_device::create_host_buffer(size_t size, host_buffer::u
        });\r
 }\r
 \r
+safe_ptr<ogl_device> ogl_device::create()\r
+{\r
+       return safe_ptr<ogl_device>(new ogl_device());\r
+}\r
+\r
 //template<typename T>\r
 //void flush_pool(buffer_pool<T>& pool)\r
 //{    \r
index 872046c0b3b46072f26ef5cd782750622af8c3f2..aff7faa1295b1b72edc9b94ad630664c1e3c3402 100644 (file)
@@ -56,7 +56,7 @@ struct buffer_pool
        }\r
 };\r
 \r
-class ogl_device : boost::noncopyable\r
+class ogl_device : public std::enable_shared_from_this<ogl_device>, boost::noncopyable\r
 {      \r
        std::unordered_map<GLenum, bool> caps_;\r
        std::array<size_t, 4>                    viewport_;\r
@@ -76,8 +76,9 @@ class ogl_device : boost::noncopyable
 \r
        executor executor_;\r
                                \r
-public:                \r
        ogl_device();\r
+public:                \r
+       static safe_ptr<ogl_device> create();\r
        ~ogl_device();\r
 \r
        // Not thread-safe, must be called inside of context\r
index d81c9f798156bafa03ee97777246e5998fb96895..015819833d84a843c495bf6d4003d6f63f6bcfe2 100644 (file)
@@ -59,12 +59,12 @@ typedef std::pair<blend_mode::type, std::vector<item>> layer;
 \r
 class image_renderer\r
 {\r
-       ogl_device&                                                             ogl_;\r
+       safe_ptr<ogl_device>                                    ogl_;\r
        const video_format_desc                                 format_desc_;\r
        image_kernel                                                    kernel_;        \r
        std::shared_ptr<device_buffer>                  transferring_buffer_;\r
 public:\r
-       image_renderer(ogl_device& ogl, const video_format_desc& format_desc)\r
+       image_renderer(const safe_ptr<ogl_device>& ogl, const video_format_desc& format_desc)\r
                : ogl_(ogl)\r
                , format_desc_(format_desc)\r
        {\r
@@ -73,7 +73,7 @@ public:
        boost::unique_future<safe_ptr<host_buffer>> operator()(std::vector<layer>&& layers)\r
        {               \r
                auto layers2 = make_move_on_copy(std::move(layers));\r
-               return ogl_.begin_invoke([=]\r
+               return ogl_->begin_invoke([=]\r
                {\r
                        return do_render(std::move(layers2.value));\r
                });\r
@@ -109,13 +109,13 @@ private:
                        draw(std::move(layers), draw_buffer);\r
                }\r
 \r
-               auto host_buffer = ogl_.create_host_buffer(format_desc_.size, host_buffer::read_only);\r
-               ogl_.attach(*draw_buffer);\r
+               auto host_buffer = ogl_->create_host_buffer(format_desc_.size, host_buffer::read_only);\r
+               ogl_->attach(*draw_buffer);\r
                host_buffer->begin_read(draw_buffer->width(), draw_buffer->height(), format(draw_buffer->stride()));\r
                \r
                transferring_buffer_ = std::move(draw_buffer);\r
 \r
-               ogl_.flush(); // NOTE: This is important, otherwise fences will deadlock.\r
+               ogl_->flush(); // NOTE: This is important, otherwise fences will deadlock.\r
                        \r
                return host_buffer;\r
        }\r
@@ -181,7 +181,7 @@ private:
                        draw_params.local_key                   = nullptr;\r
                        draw_params.layer_key                   = nullptr;\r
 \r
-                       kernel_.draw(ogl_, std::move(draw_params));\r
+                       kernel_.draw(*ogl_, std::move(draw_params));\r
                }\r
                else if(item.transform.is_mix)\r
                {\r
@@ -193,7 +193,7 @@ private:
 \r
                        draw_params.keyer                               = keyer::additive;\r
 \r
-                       kernel_.draw(ogl_, std::move(draw_params));\r
+                       kernel_.draw(*ogl_, std::move(draw_params));\r
                }\r
                else\r
                {\r
@@ -203,7 +203,7 @@ private:
                        draw_params.local_key                   = std::move(local_key_buffer);\r
                        draw_params.layer_key                   = layer_key_buffer;\r
 \r
-                       kernel_.draw(ogl_, std::move(draw_params));\r
+                       kernel_.draw(*ogl_, std::move(draw_params));\r
                }       \r
        }\r
 \r
@@ -222,25 +222,25 @@ private:
                draw_params.blend_mode                  = blend_mode;\r
                draw_params.background                  = draw_buffer;\r
 \r
-               kernel_.draw(ogl_, std::move(draw_params));\r
+               kernel_.draw(*ogl_, std::move(draw_params));\r
        }\r
                        \r
        safe_ptr<device_buffer> create_mixer_buffer(size_t stride)\r
        {\r
-               auto buffer = ogl_.create_device_buffer(format_desc_.width, format_desc_.height, stride);\r
-               ogl_.clear(*buffer);\r
+               auto buffer = ogl_->create_device_buffer(format_desc_.width, format_desc_.height, stride);\r
+               ogl_->clear(*buffer);\r
                return buffer;\r
        }\r
 };\r
                \r
 struct image_mixer::implementation : boost::noncopyable\r
 {      \r
-       ogl_device&                                             ogl_;\r
+       safe_ptr<ogl_device>                    ogl_;\r
        image_renderer                                  renderer_;\r
        std::vector<frame_transform>    transform_stack_;\r
        std::vector<layer>                              layers_; // layer/stream/items\r
 public:\r
-       implementation(ogl_device& ogl, const video_format_desc& format_desc) \r
+       implementation(const safe_ptr<ogl_device>& ogl, const video_format_desc& format_desc) \r
                : ogl_(ogl)\r
                , renderer_(ogl, format_desc)\r
                , transform_stack_(1)   \r
@@ -287,7 +287,7 @@ public:
        }\r
 };\r
 \r
-image_mixer::image_mixer(ogl_device& ogl, const video_format_desc& format_desc) : impl_(new implementation(ogl, format_desc)){}\r
+image_mixer::image_mixer(const safe_ptr<ogl_device>& ogl, const video_format_desc& format_desc) : impl_(new implementation(ogl, format_desc)){}\r
 void image_mixer::begin(basic_frame& frame){impl_->begin(frame);}\r
 void image_mixer::visit(write_frame& frame){impl_->visit(frame);}\r
 void image_mixer::end(){impl_->end();}\r
index 266c3d43b8f923fc376561663bc3c203916fc9b4..6b968cd9466c63faf62289b4ea72b8719d4779df 100644 (file)
@@ -40,7 +40,7 @@ struct pixel_format_desc;
 class image_mixer : public core::frame_visitor, boost::noncopyable\r
 {\r
 public:\r
-       image_mixer(ogl_device& ogl, const video_format_desc& format_desc);\r
+       image_mixer(const safe_ptr<ogl_device>& ogl, const video_format_desc& format_desc);\r
        \r
        virtual void begin(core::basic_frame& frame);\r
        virtual void visit(core::write_frame& frame);\r
index 13a97b10bb461b79f8547eaaf49743cc12d0dd06..947f04ee17f167549a13f447ae6788a497ed53db 100644 (file)
@@ -31,14 +31,14 @@ namespace caspar { namespace core {
                                                                                                                                                                                                                                                                                                                        \r
 struct read_frame::implementation : boost::noncopyable\r
 {\r
-       ogl_device&                                     ogl_;\r
+       safe_ptr<ogl_device>            ogl_;\r
        size_t                                          size_;\r
        safe_ptr<host_buffer>           image_data_;\r
        tbb::mutex                                      mutex_;\r
        audio_buffer                            audio_data_;\r
 \r
 public:\r
-       implementation(ogl_device& ogl, size_t size, safe_ptr<host_buffer>&& image_data, audio_buffer&& audio_data) \r
+       implementation(const safe_ptr<ogl_device>& ogl, size_t size, safe_ptr<host_buffer>&& image_data, audio_buffer&& audio_data) \r
                : ogl_(ogl)\r
                , size_(size)\r
                , image_data_(std::move(image_data))\r
@@ -51,8 +51,8 @@ public:
 \r
                        if(!image_data_->data())\r
                        {\r
-                               image_data_.get()->wait(ogl_);\r
-                               ogl_.invoke([=]{image_data_.get()->map();}, high_priority);\r
+                               image_data_.get()->wait(*ogl_);\r
+                               ogl_->invoke([=]{image_data_.get()->map();}, high_priority);\r
                        }\r
                }\r
 \r
@@ -65,7 +65,7 @@ public:
        }\r
 };\r
 \r
-read_frame::read_frame(ogl_device& ogl, size_t size, safe_ptr<host_buffer>&& image_data, audio_buffer&& audio_data) \r
+read_frame::read_frame(const safe_ptr<ogl_device>& ogl, size_t size, safe_ptr<host_buffer>&& image_data, audio_buffer&& audio_data) \r
        : impl_(new implementation(ogl, size, std::move(image_data), std::move(audio_data))){}\r
 read_frame::read_frame(){}\r
 const boost::iterator_range<const uint8_t*> read_frame::image_data()\r
index 976ca39f90d42517d52a2af045cc87470fe21267..e8438991121c921764baebeb6f2d8ead7cc3e901 100644 (file)
@@ -39,7 +39,7 @@ class read_frame : boost::noncopyable
 {\r
 public:\r
        read_frame();\r
-       read_frame(ogl_device& ogl, size_t size, safe_ptr<host_buffer>&& image_data, audio_buffer&& audio_data);\r
+       read_frame(const safe_ptr<ogl_device>& ogl, size_t size, safe_ptr<host_buffer>&& image_data, audio_buffer&& audio_data);\r
 \r
        virtual const boost::iterator_range<const uint8_t*> image_data();\r
        virtual const boost::iterator_range<const int32_t*> audio_data();\r
index d1bf4cbaa30b587e79045d28775a685b4fcd1389..1be65550a179ea459c0172db8ba1506d46a1c58d 100644 (file)
@@ -34,7 +34,7 @@ namespace caspar { namespace core {
                                                                                                                                                                                                                                                                                                                        \r
 struct write_frame::implementation\r
 {                              \r
-       ogl_device*                                                                     ogl_;\r
+       std::shared_ptr<ogl_device>                                     ogl_;\r
        std::vector<std::shared_ptr<host_buffer>>       buffers_;\r
        std::vector<safe_ptr<device_buffer>>            textures_;\r
        audio_buffer                                                            audio_data_;\r
@@ -47,8 +47,8 @@ struct write_frame::implementation
        {\r
        }\r
 \r
-       implementation(ogl_device& ogl, const void* tag, const core::pixel_format_desc& desc) \r
-               : ogl_(&ogl)\r
+       implementation(const safe_ptr<ogl_device>& ogl, const void* tag, const core::pixel_format_desc& desc) \r
+               : ogl_(ogl)\r
                , desc_(desc)\r
                , tag_(tag)\r
                , mode_(core::field_mode::progressive)\r
@@ -123,7 +123,7 @@ struct write_frame::implementation
 };\r
        \r
 write_frame::write_frame(const void* tag) : impl_(new implementation(tag)){}\r
-write_frame::write_frame(ogl_device& ogl, const void* tag, const core::pixel_format_desc& desc) \r
+write_frame::write_frame(const safe_ptr<ogl_device>& ogl, const void* tag, const core::pixel_format_desc& desc) \r
        : impl_(new implementation(ogl, tag, desc)){}\r
 write_frame::write_frame(const write_frame& other) : impl_(new implementation(*other.impl_)){}\r
 write_frame::write_frame(write_frame&& other) : impl_(std::move(other.impl_)){}\r
index cf95d1728c5a05c2c9c269dabb53ea718a7c6381..d2fef8d7bbd24f92c2f9db3bd03e6f14dbcfd1aa 100644 (file)
@@ -42,7 +42,7 @@ class write_frame : public core::basic_frame, boost::noncopyable
 {\r
 public:        \r
        explicit write_frame(const void* tag);\r
-       explicit write_frame(ogl_device& ogl, const void* tag, const core::pixel_format_desc& desc);\r
+       explicit write_frame(const safe_ptr<ogl_device>& ogl, const void* tag, const core::pixel_format_desc& desc);\r
 \r
        write_frame(const write_frame& other);\r
        write_frame(write_frame&& other);\r
index 29a2153352b566584588a29762d774807f05703b..41228c69b41fccc57d3d159ad73de7762aa2ed96 100644 (file)
@@ -56,7 +56,7 @@ struct video_channel::implementation : boost::noncopyable
        boost::timer                                    output_timer_;\r
        \r
 public:\r
-       implementation(int index, const video_format_desc& format_desc, ogl_device& ogl)  \r
+       implementation(int index, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl)  \r
                : context_(index, ogl, format_desc)\r
                , output_(new caspar::core::output(context_, [this]{restart();}))\r
                , mixer_(new caspar::core::mixer(context_))\r
@@ -126,7 +126,7 @@ public:
        void restart()\r
        {\r
                stage_->clear();\r
-               context_.ogl().gc().wait();\r
+               context_.ogl()->gc().wait();\r
 \r
                mixer_ = nullptr;\r
                mixer_.reset(new caspar::core::mixer(context_));\r
@@ -142,13 +142,13 @@ public:
                context_.execution().begin_invoke([=]\r
                {\r
                        stage_->clear();\r
-                       context_.ogl().gc().wait();\r
+                       context_.ogl()->gc().wait();\r
                        context_.set_format_desc(format_desc);\r
                });\r
        }\r
 };\r
 \r
-video_channel::video_channel(int index, const video_format_desc& format_desc, ogl_device& ogl) : impl_(new implementation(index, format_desc, ogl)){}\r
+video_channel::video_channel(int index, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl) : impl_(new implementation(index, format_desc, ogl)){}\r
 video_channel::video_channel(video_channel&& other) : impl_(std::move(other.impl_)){}\r
 safe_ptr<stage> video_channel::stage() { return impl_->stage_;} \r
 safe_ptr<mixer> video_channel::mixer() { return make_safe_ptr(impl_->mixer_);} \r
index 7a0225b6b0395d99281ebd3a558b2564b5da654c..21bbe66e7fa1b967fab1a84c636507d815408426 100644 (file)
@@ -36,7 +36,7 @@ class video_channel_context;
 class video_channel : boost::noncopyable\r
 {\r
 public:\r
-       explicit video_channel(int index, const video_format_desc& format_desc, ogl_device& ogl);\r
+       explicit video_channel(int index, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl);\r
        video_channel(video_channel&& other);\r
 \r
        safe_ptr<stage> stage();\r
index 16fa73531bb75714f6aed0f74d0de14eac215a8f..5294da7c8aee8b449550ceb69ee4a74e108816e0 100644 (file)
@@ -10,9 +10,9 @@ struct video_channel_context::implementation
        const int                                       index_;\r
        video_format_desc                       format_desc_;\r
        executor                                        execution_;\r
-       ogl_device&                                     ogl_;\r
+       safe_ptr<ogl_device>            ogl_;\r
 \r
-       implementation(int index, ogl_device& ogl, const video_format_desc& format_desc)\r
+       implementation(int index, const safe_ptr<ogl_device>& ogl, const video_format_desc& format_desc)\r
                : index_(index)\r
                , format_desc_(format_desc)\r
                , execution_(print() + L"/execution")\r
@@ -27,7 +27,7 @@ struct video_channel_context::implementation
        }\r
 };\r
 \r
-video_channel_context::video_channel_context(int index, ogl_device& ogl, const video_format_desc& format_desc) \r
+video_channel_context::video_channel_context(int index, const safe_ptr<ogl_device>& ogl, const video_format_desc& format_desc) \r
        : impl_(new implementation(index, ogl, format_desc))\r
 {\r
 }\r
@@ -47,7 +47,7 @@ void video_channel_context::set_format_desc(const video_format_desc& format_desc
 }\r
 \r
 executor& video_channel_context::execution() {return impl_->execution_;}\r
-ogl_device& video_channel_context::ogl() { return impl_->ogl_;}\r
+safe_ptr<ogl_device> video_channel_context::ogl() { return impl_->ogl_;}\r
 \r
 std::wstring video_channel_context::print() const\r
 {\r
index 97812952f086e662487dbe70ab55c81fbffb37e1..39b27fa8b63f6d79a61789cff2a71221660fc0f8 100644 (file)
@@ -23,14 +23,14 @@ class video_channel_context
 {\r
 \r
 public:\r
-       video_channel_context(int index, ogl_device& ogl, const video_format_desc& format_desc);\r
-\r
-       const int                       index() const;\r
-       video_format_desc       get_format_desc();\r
-       void                            set_format_desc(const video_format_desc& format_desc);\r
-       executor&                       execution();\r
-       ogl_device&                     ogl();\r
-       std::wstring            print() const;\r
+       video_channel_context(int index, const safe_ptr<ogl_device>& ogl, const video_format_desc& format_desc);\r
+\r
+       const int                               index() const;\r
+       video_format_desc               get_format_desc();\r
+       void                                    set_format_desc(const video_format_desc& format_desc);\r
+       executor&                               execution();\r
+       safe_ptr<ogl_device>    ogl();\r
+       std::wstring                    print() const;\r
 private:\r
        struct implementation;\r
        std::shared_ptr<implementation> impl_;\r
index 3a7e2a305693f7e21ddfce9d4c0dbbfec79cedd9..53a3a3d1c8a1a00b2adf23e030592b0a4c9d2d7a 100644 (file)
@@ -201,7 +201,7 @@ bool DiagnosticsCommand::DoExecute()
 {      \r
        try\r
        {\r
-               diagnostics::show_graphs(boost::lexical_cast<bool>(_parameters.at(0)));\r
+               diagnostics::show_graphs(true);\r
 \r
                SetReplyString(TEXT("202 DIAG OK\r\n"));\r
 \r
index c229cba896c6710d2db19f918be32335b8018f49..655cefb3aa70554e001c3efc57af3e7e82709724 100644 (file)
@@ -14,7 +14,7 @@
   </producers>\r
   <channels>\r
     <channel>\r
-      <video-mode>PAL</video-mode>\r
+      <video-mode>720p5000</video-mode>\r
       <consumers>\r
         <screen></screen>\r
       </consumers>\r
index 21e747305939c374f3fdca125d0a35efc3a4a1c3..c1e91ad9d257720386fbf751bb19b1b64f3a8d27 100644 (file)
@@ -62,11 +62,12 @@ using namespace protocol;
 \r
 struct server::implementation : boost::noncopyable\r
 {\r
-       ogl_device                                                                      ogl_;\r
+       safe_ptr<ogl_device>                                            ogl_;\r
        std::vector<safe_ptr<IO::AsyncEventServer>> async_servers_;     \r
        std::vector<safe_ptr<video_channel>>            channels_;\r
 \r
-       implementation()                                                                                                \r
+       implementation()                \r
+               : ogl_(ogl_device::create())\r
        {                       \r
                ffmpeg::init();\r
                CASPAR_LOG(info) << L"Initialized ffmpeg module.";\r