]> git.sesse.net Git - casparcg/blob - accelerator/accelerator.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / accelerator / accelerator.cpp
1 #include "stdafx.h"\r
2 \r
3 #include "accelerator.h"\r
4 \r
5 #include "cpu/image/image_mixer.h"\r
6 #include "ogl/image/image_mixer.h"\r
7 \r
8 #include "ogl/util/device.h"\r
9 \r
10 #include <tbb/mutex.h>\r
11 \r
12 namespace caspar { namespace accelerator {\r
13         \r
14 struct accelerator::impl\r
15 {\r
16         const std::wstring                              path_;\r
17         tbb::mutex                                              mutex_;\r
18         std::shared_ptr<ogl::device>    ogl_device_;\r
19 \r
20         impl(const std::wstring& path)\r
21                 : path_(path)\r
22         {\r
23         }\r
24 \r
25         std::unique_ptr<core::image_mixer> create_image_mixer()\r
26         {\r
27                 try\r
28                 {\r
29                         if(path_ == L"gpu" || path_ == L"ogl" || path_ == L"auto" || path_ == L"default")\r
30                         {\r
31                                 tbb::mutex::scoped_lock lock(mutex_);\r
32 \r
33                                 if(!ogl_device_)\r
34                                         ogl_device_.reset(new ogl::device());\r
35 \r
36                                 return std::unique_ptr<core::image_mixer>(new ogl::image_mixer(spl::make_shared_ptr(ogl_device_)));\r
37                         }\r
38                 }\r
39                 catch(...)\r
40                 {\r
41                         if(path_ == L"gpu" || path_ == L"ogl")\r
42                                 CASPAR_LOG_CURRENT_EXCEPTION();\r
43                 }\r
44 \r
45                 return std::unique_ptr<core::image_mixer>(new cpu::image_mixer());\r
46         }\r
47 };\r
48 \r
49 accelerator::accelerator(const std::wstring& path)\r
50         : impl_(new impl(path))\r
51 {\r
52 }\r
53 \r
54 accelerator::~accelerator()\r
55 {\r
56 }\r
57 \r
58 std::unique_ptr<core::image_mixer> accelerator::create_image_mixer()\r
59 {\r
60         return impl_->create_image_mixer();\r
61 }\r
62 \r
63 }}