std::fill(binded_textures_.begin(), binded_textures_.end(), 0);\r
std::fill(viewport_.begin(), viewport_.end(), 0);\r
std::fill(scissor_.begin(), scissor_.end(), 0);\r
+ std::fill(blend_func_.begin(), blend_func_.end(), 0);\r
\r
invoke([=]\r
{\r
std::shared_ptr<device_buffer> buffer;\r
if(!pool->items.try_pop(buffer)) \r
{\r
- ++pool->total_count;\r
executor_.invoke([&]\r
{ \r
try\r
catch(...)\r
{\r
CASPAR_LOG(error) << L"ogl: create_device_buffer failed!";\r
- --pool->total_count;\r
throw;\r
}\r
}\r
std::shared_ptr<host_buffer> buffer;\r
if(!pool->items.try_pop(buffer))\r
{\r
- ++pool->total_count;\r
executor_.invoke([&]\r
{\r
try\r
catch(...)\r
{\r
CASPAR_LOG(error) << L"ogl: create_host_buffer failed!";\r
- --pool->total_count;\r
throw; \r
}\r
}\r
template<typename T>\r
void flush_pool(buffer_pool<T>& pool)\r
{ \r
- if(pool.flush_count.fetch_and_increment() < 3)\r
+ if(pool.flush_count.fetch_and_increment() < 16)\r
return;\r
\r
if(pool.usage_count.fetch_and_store(0) < pool.items.size())\r
{\r
std::shared_ptr<T> buffer;\r
- if(pool.items.try_pop(buffer))\r
- --pool.total_count;\r
+ pool.items.try_pop(buffer);\r
}\r
\r
pool.flush_count = 0;\r
BOOST_FOREACH(auto& pools, device_pools_)\r
{\r
BOOST_FOREACH(auto& pool, pools)\r
- {\r
- auto size = pool.second->items.size();\r
- std::shared_ptr<device_buffer> buffer;\r
- for(int n = 0; n < size && pool.second->items.try_pop(buffer); ++n)\r
- --pool.second->total_count;\r
- }\r
+ pool.second->items.clear();\r
}\r
BOOST_FOREACH(auto& pools, host_pools_)\r
{\r
BOOST_FOREACH(auto& pool, pools)\r
- {\r
- auto size = pool.second->items.size();\r
- std::shared_ptr<host_buffer> buffer;\r
- for(int n = 0; n < size && pool.second->items.try_pop(buffer); ++n)\r
- --pool.second->total_count;\r
- }\r
+ pool.second->items.clear();\r
}\r
}\r
catch(...)\r
}\r
}\r
\r
+void ogl_device::blend_func(int c1, int c2, int a1, int a2)\r
+{\r
+ std::array<int, 4> func = {c1, c2, a1, a2};\r
+\r
+ if(blend_func_ != func)\r
+ {\r
+ blend_func_ = func;\r
+ GL(glBlendFuncSeparate(c1, c2, a1, a2));\r
+ }\r
+}\r
+\r
+void ogl_device::blend_func(int c1, int c2)\r
+{\r
+ blend_func(c1, c2, c1, c2);\r
+}\r
+\r
}}\r
\r