+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+* This file is part of CasparCG.\r
+*\r
+* CasparCG is free software: you can redistribute it and/or modify\r
+* it under the terms of the GNU General Public License as published by\r
+* the Free Software Foundation, either version 3 of the License, or\r
+* (at your option) any later version.\r
+*\r
+* CasparCG is distributed in the hope that it will be useful,\r
+* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+* GNU General Public License for more details.\r
+\r
+* You should have received a copy of the GNU General Public License\r
+* along with CasparCG. If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
#pragma once\r
\r
#include "host_buffer.h"\r
#include <tbb/concurrent_unordered_map.h>\r
#include <tbb/concurrent_queue.h>\r
\r
+#include <boost/noncopyable.hpp>\r
#include <boost/thread/future.hpp>\r
\r
#include <array>\r
+#include <unordered_map>\r
+\r
+#include <gl/glew.h>\r
+\r
+#include "../../dependencies\SFML-1.6\include\SFML/Window/Context.hpp"\r
\r
namespace caspar { namespace core {\r
\r
-class ogl_device\r
-{ \r
- ogl_device();\r
-public: \r
- static safe_ptr<ogl_device> create()\r
+class shader;\r
+\r
+template<typename T>\r
+struct buffer_pool\r
+{\r
+ tbb::atomic<int> usage_count;\r
+ tbb::atomic<int> flush_count;\r
+ tbb::concurrent_bounded_queue<std::shared_ptr<T>> items;\r
+\r
+ buffer_pool()\r
{\r
- static safe_ptr<ogl_device> instance(new ogl_device());\r
- return instance;\r
+ usage_count = 0;\r
+ flush_count = 0;\r
}\r
+};\r
+\r
+class ogl_device : boost::noncopyable\r
+{ \r
+ std::unordered_map<GLenum, bool> caps_;\r
+ std::array<size_t, 4> viewport_;\r
+ std::array<size_t, 4> scissor_;\r
+ const GLubyte* pattern_;\r
+ GLint attached_texture_;\r
+ GLint active_shader_;\r
+ std::array<GLint, 16> binded_textures_;\r
+ std::array<GLint, 4> blend_func_;\r
+\r
+ std::unique_ptr<sf::Context> context_;\r
+ \r
+ std::array<tbb::concurrent_unordered_map<size_t, safe_ptr<buffer_pool<device_buffer>>>, 4> device_pools_;\r
+ std::array<tbb::concurrent_unordered_map<size_t, safe_ptr<buffer_pool<host_buffer>>>, 2> host_pools_;\r
+ \r
+ unsigned int fbo_;\r
\r
+ executor executor_;\r
+ \r
+public: \r
+ ogl_device();\r
+ ~ogl_device();\r
+\r
+ // Not thread-safe, must be called inside of context\r
+ void enable(GLenum cap);\r
+ void disable(GLenum cap);\r
+ void viewport(size_t x, size_t y, size_t width, size_t height);\r
+ void scissor(size_t x, size_t y, size_t width, size_t height);\r
+ void stipple_pattern(const GLubyte* pattern);\r
+\r
+ void attach(device_buffer& texture);\r
+ void clear(device_buffer& texture);\r
+\r
+ void begin_read(host_buffer& dest, device_buffer& source);\r
+ void begin_read(device_buffer& dest, host_buffer& source);\r
+\r
+ void blend_func(int c1, int c2, int a1, int a2);\r
+ void blend_func(int c1, int c2);\r
+ \r
+ void use(shader& shader);\r
+\r
+ void flush();\r
+\r
+ // thread-afe\r
template<typename Func>\r
- auto begin_invoke(Func&& func) -> boost::unique_future<decltype(func())> // noexcept\r
+ auto begin_invoke(Func&& func, task_priority priority = normal_priority) -> boost::unique_future<decltype(func())> // noexcept\r
{ \r
- return executor_.begin_invoke(std::forward<Func>(func));\r
+ return executor_.begin_invoke(std::forward<Func>(func), priority);\r
}\r
\r
template<typename Func>\r
- auto invoke(Func&& func) -> decltype(func())\r
+ auto invoke(Func&& func, task_priority priority = normal_priority) -> decltype(func())\r
{\r
- return executor_.invoke(std::forward<Func>(func));\r
+ return executor_.invoke(std::forward<Func>(func), priority);\r
}\r
\r
safe_ptr<device_buffer> create_device_buffer(size_t width, size_t height, size_t stride);\r
safe_ptr<host_buffer> create_host_buffer(size_t size, host_buffer::usage_t usage);\r
+ \r
+ void yield();\r
+ boost::unique_future<void> gc();\r
+\r
+ static std::wstring get_version();\r
\r
private:\r
- executor executor_;\r
- std::unique_ptr<sf::Context> context_;\r
- \r
- std::array<tbb::concurrent_unordered_map<size_t, tbb::concurrent_bounded_queue<std::shared_ptr<device_buffer>>>, 4> device_pools_;\r
- std::array<tbb::concurrent_unordered_map<size_t, tbb::concurrent_bounded_queue<std::shared_ptr<host_buffer>>>, 2> host_pools_;\r
+ safe_ptr<device_buffer> allocate_device_buffer(size_t width, size_t height, size_t stride);\r
+ safe_ptr<host_buffer> allocate_host_buffer(size_t size, host_buffer::usage_t usage);\r
};\r
\r
}}
\ No newline at end of file