+template<typename T>\r
+void flush_pool(buffer_pool<T>& pool)\r
+{ \r
+ if(pool.flush_count.fetch_and_increment() < 3)\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
+ }\r
+\r
+ pool.flush_count = 0;\r
+ pool.usage_count = 0;\r
+}\r
+\r
+void ogl_device::flush()\r
+{\r
+ GL(glFlush()); \r
+ \r
+ try\r
+ {\r
+ BOOST_FOREACH(auto& pools, device_pools_)\r
+ {\r
+ BOOST_FOREACH(auto& pool, pools)\r
+ flush_pool(*pool.second);\r
+ }\r
+ BOOST_FOREACH(auto& pools, host_pools_)\r
+ {\r
+ BOOST_FOREACH(auto& pool, pools)\r
+ flush_pool(*pool.second);\r
+ }\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ }\r
+}\r
+\r