});\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
{\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
{\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
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