]> git.sesse.net Git - casparcg/blob - core/mixer/gpu/ogl_device.cpp
2.0.0.2: More missing files.
[casparcg] / core / mixer / gpu / ogl_device.cpp
1 #include "../../stdafx.h"\r
2 \r
3 #include "ogl_device.h"\r
4 \r
5 #include <Glee.h>\r
6 #include <SFML/Window.hpp>\r
7 \r
8 namespace caspar { namespace core {\r
9 \r
10 ogl_device::ogl_device()\r
11 {\r
12         executor_.start();\r
13         invoke([=]\r
14         {\r
15                 context_.reset(new sf::Context());\r
16                 context_->SetActive(true);\r
17         });\r
18 }\r
19                                 \r
20 safe_ptr<device_buffer> ogl_device::create_device_buffer(size_t width, size_t height, size_t stride)\r
21 {\r
22         auto pool = &device_pools_[stride][((width << 16) & 0xFFFF0000) | (height & 0x0000FFFF)];\r
23         std::shared_ptr<device_buffer> buffer;\r
24         if(!pool->try_pop(buffer))              \r
25         {\r
26                 executor_.invoke([&]\r
27                 {\r
28                         buffer = std::make_shared<device_buffer>(width, height, stride);\r
29                 });     \r
30         }\r
31                 \r
32         return safe_ptr<device_buffer>(buffer.get(), [=](device_buffer*){pool->push(buffer);});\r
33 }\r
34         \r
35 safe_ptr<host_buffer> ogl_device::create_host_buffer(size_t size, host_buffer::usage_t usage)\r
36 {\r
37         auto pool = &host_pools_[usage][size];\r
38         std::shared_ptr<host_buffer> buffer;\r
39         if(!pool->try_pop(buffer))\r
40         {\r
41                 executor_.invoke([&]\r
42                 {\r
43                         buffer = std::make_shared<host_buffer>(size, usage);\r
44                         if(usage == host_buffer::write_only)\r
45                                 buffer->map();\r
46                         else\r
47                                 buffer->unmap();\r
48                 });     \r
49         }\r
50 \r
51         return safe_ptr<host_buffer>(buffer.get(), [=](host_buffer*)\r
52         {\r
53                 executor_.begin_invoke([=]\r
54                 {\r
55                         if(usage == host_buffer::write_only)\r
56                                 buffer->map();\r
57                         else\r
58                                 buffer->unmap();\r
59                         pool->push(buffer);\r
60                 });\r
61         });\r
62 }\r
63 \r
64 }}