]> git.sesse.net Git - casparcg/blobdiff - core/mixer/gpu/ogl_device.cpp
2.0.0.2: bluefish_consumer: Refactored.
[casparcg] / core / mixer / gpu / ogl_device.cpp
index 5f9c9b952bb62b2b34ec5a13a82ad4386d9a7f2d..2431d1dabea826e0137998e6c42b4dd94d4f645d 100644 (file)
@@ -56,7 +56,7 @@ ogl_device::~ogl_device()
        });\r
 }\r
                                \r
-safe_ptr<device_buffer> ogl_device::do_create_device_buffer(size_t width, size_t height, size_t stride)\r
+safe_ptr<device_buffer> ogl_device::create_device_buffer(size_t width, size_t height, size_t stride)\r
 {\r
        CASPAR_VERIFY(stride > 0 && stride < 5);\r
        CASPAR_VERIFY(width > 0 && height > 0);\r
@@ -66,23 +66,22 @@ safe_ptr<device_buffer> ogl_device::do_create_device_buffer(size_t width, size_t
        {\r
                executor_.invoke([&]\r
                {\r
-                       buffer = std::make_shared<device_buffer>(width, height, stride);\r
-\r
-                       if(glGetError() != GL_NO_ERROR)\r
-                               BOOST_THROW_EXCEPTION(std::bad_alloc());\r
-\r
-               }, high_priority);      \r
-               executor_.begin_invoke([=]\r
-               {\r
-                       auto buffer = std::make_shared<device_buffer>(width, height, stride);\r
-                       pool->try_push(buffer);\r
+                       try\r
+                       {\r
+                               buffer = std::make_shared<device_buffer>(width, height, stride);\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               BOOST_THROW_EXCEPTION(bad_alloc()\r
+                                       << errinfo_nested_exception(std::current_exception()));\r
+                       }\r
                }, high_priority);      \r
        }\r
                        \r
        return safe_ptr<device_buffer>(buffer.get(), [=](device_buffer*){pool->push(buffer);});\r
 }\r
        \r
-safe_ptr<host_buffer> ogl_device::do_create_host_buffer(size_t size, host_buffer::usage_t usage)\r
+safe_ptr<host_buffer> ogl_device::create_host_buffer(size_t size, host_buffer::usage_t usage)\r
 {\r
        CASPAR_VERIFY(usage == host_buffer::write_only || usage == host_buffer::read_only);\r
        CASPAR_VERIFY(size > 0);\r
@@ -92,25 +91,21 @@ safe_ptr<host_buffer> ogl_device::do_create_host_buffer(size_t size, host_buffer
        {\r
                executor_.invoke([&]\r
                {\r
-                       buffer = std::make_shared<host_buffer>(size, usage);\r
-                       if(usage == host_buffer::write_only)\r
-                               buffer->map();\r
-                       else\r
-                               buffer->unmap();\r
-\r
-                       if(glGetError() != GL_NO_ERROR)\r
-                               BOOST_THROW_EXCEPTION(std::bad_alloc());\r
+                       try\r
+                       {\r
+                               buffer = std::make_shared<host_buffer>(size, usage);\r
+                               if(usage == host_buffer::write_only)\r
+                                       buffer->map();\r
+                               else\r
+                                       buffer->unmap();                        \r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               BOOST_THROW_EXCEPTION(bad_alloc()\r
+                                       << errinfo_nested_exception(std::current_exception()));\r
+                       }\r
 \r
                }, high_priority);      \r
-               executor_.begin_invoke([=]\r
-               {\r
-                       auto buffer = std::make_shared<host_buffer>(size, usage);\r
-                       if(usage == host_buffer::write_only)\r
-                               buffer->map();\r
-                       else\r
-                               buffer->unmap();\r
-                       pool->try_push(buffer);\r
-               }, high_priority);      \r
        }\r
        \r
        return safe_ptr<host_buffer>(buffer.get(), [=](host_buffer*)\r
@@ -122,16 +117,38 @@ safe_ptr<host_buffer> ogl_device::do_create_host_buffer(size_t size, host_buffer
                        else\r
                                buffer->unmap();\r
                        \r
-                       if(glGetError() == GL_NO_ERROR)\r
-                               pool->push(buffer);\r
+                       pool->push(buffer);\r
+\r
                }, high_priority);\r
        });\r
 }\r
 \r
+void ogl_device::yield()\r
+{\r
+       executor_.yield();\r
+}\r
+\r
+void ogl_device::gc()\r
+{\r
+       //begin_invoke([=]\r
+       //{             \r
+       //      BOOST_FOREACH(auto& pool, device_pools_)\r
+       //              pool.clear();\r
+       //      BOOST_FOREACH(auto& pool, host_pools_)\r
+       //              pool.clear();\r
+       //});\r
+}\r
+\r
 std::wstring ogl_device::get_version()\r
 {      \r
-       return widen(invoke([]{return std::string(reinterpret_cast<const char*>(glGetString(GL_VERSION)));})\r
-       + " "   + invoke([]{return std::string(reinterpret_cast<const char*>(glGetString(GL_VENDOR)));}));      \r
+       static std::wstring ver;\r
+       if(ver.empty())\r
+       {\r
+               ogl_device tmp;\r
+               ver = widen(tmp.invoke([]{return std::string(reinterpret_cast<const char*>(glGetString(GL_VERSION)));})\r
+               + " "   + tmp.invoke([]{return std::string(reinterpret_cast<const char*>(glGetString(GL_VENDOR)));}));  \r
+       }\r
+       return ver;\r
 }\r
 \r
 }}
\ No newline at end of file