]> 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>
Sat, 11 Feb 2012 02:03:37 +0000 (02:03 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 11 Feb 2012 02:03:37 +0000 (02:03 +0000)
19 files changed:
accelerator/accelerator.cpp [new file with mode: 0644]
accelerator/accelerator.h [new file with mode: 0644]
accelerator/accelerator.vcxproj
accelerator/accelerator.vcxproj.filters
accelerator/cpu/factory.cpp [deleted file]
accelerator/cpu/factory.h [deleted file]
accelerator/cpu/image/image_mixer.cpp
accelerator/factory.h [deleted file]
accelerator/ogl/factory.cpp [deleted file]
accelerator/ogl/factory.h [deleted file]
accelerator/ogl/image/image_mixer.cpp
common/spl/memory.h
core/mixer/image/image_mixer.h
core/mixer/mixer.cpp
core/mixer/mixer.h
core/video_channel.cpp
core/video_channel.h
shell/casparcg.config
shell/server.cpp

diff --git a/accelerator/accelerator.cpp b/accelerator/accelerator.cpp
new file mode 100644 (file)
index 0000000..19d93ca
--- /dev/null
@@ -0,0 +1,63 @@
+#include "stdafx.h"\r
+\r
+#include "accelerator.h"\r
+\r
+#include "cpu/image/image_mixer.h"\r
+#include "ogl/image/image_mixer.h"\r
+\r
+#include "ogl/util/context.h"\r
+\r
+#include <tbb/mutex.h>\r
+\r
+namespace caspar { namespace accelerator {\r
+       \r
+struct accelerator::impl\r
+{\r
+       const std::wstring                              path_;\r
+       tbb::mutex                                              mutex_;\r
+       std::shared_ptr<ogl::context>   ogl_context_;\r
+\r
+       impl(const std::wstring& path)\r
+               : path_(path)\r
+       {\r
+       }\r
+\r
+       spl::unique_ptr<core::image_mixer> create_image_mixer()\r
+       {\r
+               try\r
+               {\r
+                       if(path_ == L"gpu" || path_ == L"ogl" || path_ == L"auto" || path_ == L"default")\r
+                       {\r
+                               tbb::mutex::scoped_lock lock(mutex_);\r
+\r
+                               if(!ogl_context_)\r
+                                       ogl_context_.reset(new ogl::context());\r
+\r
+                               return spl::make_unique<ogl::image_mixer>(spl::make_shared_ptr(ogl_context_));\r
+                       }\r
+               }\r
+               catch(...)\r
+               {\r
+                       if(path_ == L"gpu" || path_ == L"ogl")\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+               }\r
+\r
+               return spl::make_unique<cpu::image_mixer>();\r
+       }\r
+};\r
+\r
+accelerator::accelerator(const std::wstring& path)\r
+       : impl_(new impl(path))\r
+{\r
+}\r
+\r
+accelerator::~accelerator()\r
+{\r
+}\r
+\r
+spl::unique_ptr<core::image_mixer> accelerator::create_image_mixer()\r
+{\r
+       return impl_->create_image_mixer();\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/accelerator/accelerator.h b/accelerator/accelerator.h
new file mode 100644 (file)
index 0000000..5bdad25
--- /dev/null
@@ -0,0 +1,24 @@
+#pragma once\r
+\r
+#include <common/forward.h>\r
+#include <common/spl/memory.h>\r
+\r
+#include <core/mixer/image/image_mixer.h>\r
+\r
+#include <boost/noncopyable.hpp>\r
+\r
+namespace caspar { namespace accelerator {\r
+       \r
+class accelerator : boost::noncopyable\r
+{\r
+public:\r
+       accelerator(const std::wstring& path);\r
+       ~accelerator();\r
+\r
+       spl::unique_ptr<core::image_mixer> create_image_mixer();\r
+private:\r
+       struct impl;\r
+       spl::unique_ptr<impl> impl_;\r
+};\r
+\r
+}}
\ No newline at end of file
index 792bfef666ddcc89787cbe699aec0e3f517cf81c..c7cf81999913854fb6cfbe9506cd975faa902ba5 100644 (file)
     </Lib>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
-    <ClInclude Include="cpu\factory.h" />\r
     <ClInclude Include="cpu\image\image_mixer.h" />\r
     <ClInclude Include="cpu\util\xmm.h" />\r
     <ClInclude Include="cpu\util\write_frame.h" />\r
-    <ClInclude Include="factory.h" />\r
-    <ClInclude Include="ogl\factory.h" />\r
+    <ClInclude Include="accelerator.h" />\r
     <ClInclude Include="ogl\image\blending_glsl.h" />\r
     <ClInclude Include="ogl\image\image_kernel.h" />\r
     <ClInclude Include="ogl\image\image_mixer.h" />\r
     </ProjectReference>\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <ClCompile Include="cpu\factory.cpp">\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
-    </ClCompile>\r
+    <ClCompile Include="accelerator.cpp" />\r
     <ClCompile Include="cpu\image\image_mixer.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
     </ClCompile>\r
-    <ClCompile Include="ogl\factory.cpp">\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
-    </ClCompile>\r
     <ClCompile Include="ogl\image\image_kernel.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
index 74a5d1d3b570ae45d1d441eab6038b16420b1a7f..3b078b2acf3fac00b848bff8bc78002d7993a9cd 100644 (file)
     <ClInclude Include="cpu\util\write_frame.h">\r
       <Filter>source\cpu\util</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="factory.h">\r
-      <Filter>source</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="cpu\factory.h">\r
-      <Filter>source\cpu</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ogl\factory.h">\r
-      <Filter>source\ogl</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="cpu\util\xmm.h">\r
       <Filter>source\cpu\util</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="accelerator.h">\r
+      <Filter>source</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="StdAfx.cpp" />\r
     <ClCompile Include="cpu\util\write_frame.cpp">\r
       <Filter>source\cpu\util</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="cpu\factory.cpp">\r
-      <Filter>source\cpu</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="ogl\factory.cpp">\r
-      <Filter>source\ogl</Filter>\r
+    <ClCompile Include="accelerator.cpp">\r
+      <Filter>source</Filter>\r
     </ClCompile>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
diff --git a/accelerator/cpu/factory.cpp b/accelerator/cpu/factory.cpp
deleted file mode 100644 (file)
index 1bd3b61..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "../StdAfx.h"\r
-\r
-#include "factory.h"\r
-\r
-#include "image/image_mixer.h"\r
-\r
-namespace caspar { namespace accelerator { namespace cpu {\r
-       \r
-spl::shared_ptr<core::image_mixer> factory::create_image_mixer()\r
-{\r
-       return spl::shared_ptr<cpu::image_mixer>();\r
-}\r
-\r
-}}}
\ No newline at end of file
diff --git a/accelerator/cpu/factory.h b/accelerator/cpu/factory.h
deleted file mode 100644 (file)
index b57c2de..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#pragma once\r
-\r
-#include "../factory.h"\r
-\r
-namespace caspar { namespace accelerator { namespace cpu {\r
-       \r
-class factory : public accelerator::factory\r
-{\r
-public:\r
-       virtual spl::shared_ptr<core::image_mixer> create_image_mixer() override;\r
-};\r
-\r
-}}}
\ No newline at end of file
index b8e7605f02c8e99652b225c8c7db48ccd80a4d9c..214710d71bb737d56285c02ceb71fac60e9409ee 100644 (file)
@@ -282,7 +282,7 @@ public:
        impl() \r
                : transform_stack_(1)   \r
        {\r
-               CASPAR_LOG(info) << L"Initialized CPU Accelerated Image Mixer";\r
+               CASPAR_LOG(info) << L"Initialized Streaming SIMD Extensions Accelerated CPU Image Mixer";\r
        }\r
 \r
        void begin_layer(core::blend_mode blend_mode)\r
diff --git a/accelerator/factory.h b/accelerator/factory.h
deleted file mode 100644 (file)
index c3b9f14..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once\r
-\r
-#include <common/forward.h>\r
-#include <common/spl/memory.h>\r
-\r
-#include <boost/noncopyable.hpp>\r
-\r
-FORWARD2(caspar, core, struct image_mixer);\r
-\r
-namespace caspar { namespace accelerator {\r
-       \r
-struct factory : boost::noncopyable\r
-{\r
-       virtual spl::shared_ptr<core::image_mixer> create_image_mixer() = 0;\r
-};\r
-\r
-}}
\ No newline at end of file
diff --git a/accelerator/ogl/factory.cpp b/accelerator/ogl/factory.cpp
deleted file mode 100644 (file)
index 54322d3..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "../StdAfx.h"\r
-\r
-#include "factory.h"\r
-\r
-#include "image/image_mixer.h"\r
-#include "util/context.h"\r
-\r
-namespace caspar { namespace accelerator { namespace ogl {\r
-       \r
-struct factory::impl\r
-{\r
-       spl::shared_ptr<context> ogl_;\r
-       \r
-       spl::shared_ptr<core::image_mixer> create_image_mixer()\r
-       {\r
-               return spl::make_shared<ogl::image_mixer>(ogl_);\r
-       }\r
-};\r
-\r
-factory::factory(){}\r
-spl::shared_ptr<core::image_mixer> factory::create_image_mixer(){return impl_->create_image_mixer();}\r
-\r
-}}}
\ No newline at end of file
diff --git a/accelerator/ogl/factory.h b/accelerator/ogl/factory.h
deleted file mode 100644 (file)
index 65e7447..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once\r
-\r
-#include "../factory.h"\r
-\r
-#include <common/spl/memory.h>\r
-\r
-namespace caspar { namespace accelerator { namespace ogl {\r
-       \r
-class factory : public accelerator::factory\r
-{\r
-public:\r
-       factory();\r
-\r
-       virtual spl::shared_ptr<core::image_mixer> create_image_mixer() override;\r
-private:\r
-       struct impl;\r
-       spl::shared_ptr<impl> impl_;\r
-};\r
-\r
-}}}
\ No newline at end of file
index d243d611af22376bd2b6c422f6fd1fec6f8ed4bd..198006d68ccef56d21ab8d93a507620d549c5029 100644 (file)
@@ -117,7 +117,6 @@ public:
                : ogl_(ogl)\r
                , kernel_(ogl_)\r
        {\r
-               CASPAR_LOG(info) << L"Initialized OpenGL GPU Accelerated Image Mixer";\r
        }\r
        \r
        boost::shared_future<boost::iterator_range<const uint8_t*>> operator()(std::vector<layer> layers, const core::video_format_desc& format_desc)\r
@@ -371,6 +370,7 @@ public:
                , renderer_(ogl)\r
                , transform_stack_(1)   \r
        {\r
+               CASPAR_LOG(info) << L"Initialized OpenGL Accelerated GPU Image Mixer";\r
        }\r
 \r
        void begin_layer(core::blend_mode blend_mode)\r
index c6601cf2f8f04990dc4305bb80c8a3787a7ecf00..ca68391e3e1e628e808460d32f2847215e6397a1 100644 (file)
@@ -417,7 +417,7 @@ public:
        \r
     template<typename T2, typename D2>    \r
     unique_ptr(unique_ptr<T2, D2>&& p, typename std::enable_if<std::is_convertible<T2*, T*>::value, void*>::type = 0) \r
-        : p_(std::move(p))\r
+               : p_(p.p_.release(), p.p_.get_deleter())\r
     {\r
     }\r
                        \r
index 4a1faf7f3a84881ac57f0acc22c83a1afef90e38..75fe3f4fcf632561b77244025aab1c066ed8345a 100644 (file)
@@ -32,7 +32,7 @@
 \r
 #include <stdint.h>\r
 \r
-FORWARD1(boost, template<typename> class unique_future);\r
+FORWARD1(boost, template<typename> class shared_future);\r
 FORWARD2(caspar, core, struct write_frame);\r
 FORWARD2(caspar, core, struct pixel_format_desc);\r
 \r
index 9a2aa78a05f452d33ad01124cf5d87ae2698ab06..6739eeaa2d260626b5577953cd617abb6be5045c 100644 (file)
@@ -122,14 +122,14 @@ struct mixer::impl : boost::noncopyable
 {                              \r
        spl::shared_ptr<diagnostics::graph> graph_;\r
        audio_mixer                                                     audio_mixer_;\r
-       spl::shared_ptr<image_mixer>            image_mixer_;\r
+       spl::unique_ptr<image_mixer>            image_mixer_;\r
        \r
        std::unordered_map<int, blend_mode>     blend_modes_;\r
                        \r
        executor executor_;\r
 \r
 public:\r
-       impl(spl::shared_ptr<diagnostics::graph> graph, spl::shared_ptr<image_mixer> image_mixer) \r
+       impl(spl::shared_ptr<diagnostics::graph> graph, spl::unique_ptr<image_mixer> image_mixer) \r
                : graph_(std::move(graph))\r
                , audio_mixer_()\r
                , image_mixer_(std::move(image_mixer))\r
@@ -192,7 +192,7 @@ public:
        }\r
 };\r
        \r
-mixer::mixer(spl::shared_ptr<diagnostics::graph> graph, spl::shared_ptr<image_mixer> image_mixer) \r
+mixer::mixer(spl::shared_ptr<diagnostics::graph> graph, spl::unique_ptr<image_mixer> image_mixer) \r
        : impl_(new impl(std::move(graph), std::move(image_mixer))){}\r
 void mixer::set_blend_mode(int index, blend_mode value){impl_->set_blend_mode(index, value);}\r
 boost::unique_future<boost::property_tree::wptree> mixer::info() const{return impl_->info();}\r
index 70b4c36785d932526b103485982e13a300596656..e6c96eaf3895bb2325155c0b129a51d52beebb75 100644 (file)
@@ -40,7 +40,7 @@ namespace caspar { namespace core {
 class mixer sealed : boost::noncopyable\r
 {\r
 public:        \r
-       explicit mixer(spl::shared_ptr<diagnostics::graph> graph, spl::shared_ptr<struct image_mixer> image_mixer);\r
+       explicit mixer(spl::shared_ptr<diagnostics::graph> graph, spl::unique_ptr<struct image_mixer> image_mixer);\r
                                        \r
        spl::shared_ptr<const struct data_frame> operator()(std::map<int, spl::shared_ptr<class draw_frame>> frames, const struct video_format_desc& format_desc);\r
        \r
index 46c80c1beb9334b5646fac047966a7332756af74..a3222d2867789963eec9b3b171c92b498b92841f 100644 (file)
@@ -36,6 +36,8 @@
 #include <common/concurrency/lock.h>\r
 #include <common/concurrency/executor.h>\r
 \r
+#include <core/mixer/image/image_mixer.h>\r
+\r
 #include <tbb/spin_mutex.h>\r
 \r
 #include <boost/property_tree/ptree.hpp>\r
@@ -62,7 +64,7 @@ struct video_channel::impl sealed : public frame_factory
 \r
        executor                                                                                executor_;\r
 public:\r
-       impl(int index, const core::video_format_desc& format_desc, spl::shared_ptr<image_mixer> image_mixer)  \r
+       impl(int index, const core::video_format_desc& format_desc, spl::unique_ptr<image_mixer> image_mixer)  \r
                : event_subject_(new monitor::subject(monitor::path() % "channel" % index))\r
                , index_(index)\r
                , format_desc_(format_desc)\r
@@ -164,7 +166,7 @@ public:
        }\r
 };\r
 \r
-video_channel::video_channel(int index, const core::video_format_desc& format_desc, spl::shared_ptr<image_mixer> image_mixer) : impl_(new impl(index, format_desc, image_mixer)){}\r
+video_channel::video_channel(int index, const core::video_format_desc& format_desc, spl::unique_ptr<image_mixer> image_mixer) : impl_(new impl(index, format_desc, std::move(image_mixer))){}\r
 const stage& video_channel::stage() const { return impl_->stage_;} \r
 stage& video_channel::stage() { return impl_->stage_;} \r
 const mixer& video_channel::mixer() const{ return impl_->mixer_;} \r
index 92921e3224b00d3014675e05092dcd29e5c3b3dc..915766e824467e38de5b05e515a52b9ab24fcd8a 100644 (file)
@@ -47,7 +47,7 @@ class video_channel sealed : public frame_observable
        video_channel(const video_channel&);\r
        video_channel& operator=(const video_channel&);\r
 public:\r
-       explicit video_channel(int index, const video_format_desc& format_desc, spl::shared_ptr<image_mixer> image_mixer);\r
+       explicit video_channel(int index, const video_format_desc& format_desc, spl::unique_ptr<image_mixer> image_mixer);\r
        \r
        const core::stage&      stage() const;\r
        core::stage&            stage();\r
index 77ca4ba401cf31aa0929ff7fad83a90a4eb150fa..dc5b87e64ffbf834f94efaf8708a7fc910b99263 100644 (file)
@@ -6,6 +6,7 @@
     <data-path>D:\casparcg\_data\</data-path>\r
     <template-path>D:\casparcg\_templates\</template-path>\r
   </paths>\r
+  <accelerator>auto [cpu|gpu|auto]</accelerator>\r
   <log-level>trace</log-level>\r
   <channels>\r
     <channel>\r
index b7964cccfd64743973268193b39dfba2b7f8266a..8bae804d63eb5aafd6ed9bd5dad982fae6e5d9c4 100644 (file)
@@ -22,9 +22,7 @@
 \r
 #include "server.h"\r
 \r
-#include <accelerator/factory.h>\r
-#include <accelerator/ogl/factory.h>\r
-#include <accelerator/cpu/factory.h>\r
+#include <accelerator/accelerator.h>\r
 \r
 #include <common/env.h>\r
 #include <common/except.h>\r
@@ -68,29 +66,13 @@ using namespace protocol;
 struct server::impl : boost::noncopyable\r
 {\r
        spl::shared_ptr<monitor::subject>                                       event_subject_;\r
-       std::unique_ptr<accelerator::factory>                           accel_factory_;\r
+       accelerator::accelerator                                                        accelerator_;\r
        std::vector<spl::shared_ptr<IO::AsyncEventServer>>      async_servers_; \r
        std::vector<spl::shared_ptr<video_channel>>                     channels_;\r
 \r
        impl()          \r
+               : accelerator_(env::properties().get(L"configuration.accelerator", L"auto"))\r
        {       \r
-               auto accel_str = env::properties().get(L"configuration.accelerator", L"auto");\r
-\r
-               if(accel_str == L"cpu")\r
-                       accel_factory_.reset(new accelerator::cpu::factory());\r
-               else\r
-               {\r
-                       try\r
-                       {\r
-                               accel_factory_.reset(new accelerator::ogl::factory());\r
-                       }\r
-                       catch(...)\r
-                       {\r
-                               CASPAR_LOG_CURRENT_EXCEPTION();\r
-                               accel_factory_.reset(new accelerator::cpu::factory());\r
-                               CASPAR_LOG(warning) << L"Using fallback CPU mixer.";\r
-                       }\r
-               }\r
 \r
                ffmpeg::init();\r
                CASPAR_LOG(info) << L"Initialized ffmpeg module.";\r
@@ -138,7 +120,7 @@ struct server::impl : boost::noncopyable
                        if(format_desc.format == video_format::invalid)\r
                                BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Invalid video-mode."));\r
                        \r
-                       auto channel = spl::make_shared<video_channel>(static_cast<int>(channels_.size()+1), format_desc, accel_factory_->create_image_mixer());\r
+                       auto channel = spl::make_shared<video_channel>(static_cast<int>(channels_.size()+1), format_desc, accelerator_.create_image_mixer());\r
                        \r
                        BOOST_FOREACH(auto& xml_consumer, xml_channel.second.get_child(L"consumers"))\r
                        {\r
@@ -170,7 +152,7 @@ struct server::impl : boost::noncopyable
 \r
                // Dummy diagnostics channel\r
                if(env::properties().get(L"configuration.channel-grid", false))\r
-                       channels_.push_back(spl::make_shared<video_channel>(static_cast<int>(channels_.size()+1), core::video_format_desc(core::video_format::x576p2500), accel_factory_->create_image_mixer()));\r
+                       channels_.push_back(spl::make_shared<video_channel>(static_cast<int>(channels_.size()+1), core::video_format_desc(core::video_format::x576p2500), accelerator_.create_image_mixer()));\r
        }\r
                \r
        void setup_controllers(const boost::property_tree::wptree& pt)\r