]> git.sesse.net Git - casparcg/blobdiff - core/mixer/gpu/ogl_device.cpp
2.0. - blend_modes are re-enabled.
[casparcg] / core / mixer / gpu / ogl_device.cpp
index 95beaa70e680092b762e13224a94216c5fefe42b..1f2698d532a412c59a2af65e88f3aa87be1305ed 100644 (file)
@@ -21,6 +21,8 @@
 \r
 #include "ogl_device.h"\r
 \r
+#include "shader.h"\r
+\r
 #include <common/exception/exceptions.h>\r
 #include <common/utility/assert.h>\r
 #include <common/gl/gl_check.h>\r
 \r
 namespace caspar { namespace core {\r
 \r
-ogl_device::ogl_device() : executor_(L"ogl_device")\r
+ogl_device::ogl_device() \r
+       : executor_(L"ogl_device")\r
+       , pattern_(nullptr)\r
+       , attached_texture_(0)\r
+       , active_shader_(0)\r
 {\r
+       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
+       \r
        invoke([=]\r
        {\r
                context_.reset(new sf::Context());\r
@@ -204,4 +214,83 @@ std::wstring ogl_device::get_version()
        return ver;\r
 }\r
 \r
-}}
\ No newline at end of file
+\r
+void ogl_device::enable(GLenum cap)\r
+{\r
+       auto& val = caps_[cap];\r
+       if(!val)\r
+       {\r
+               glEnable(cap);\r
+               val = true;\r
+       }\r
+}\r
+\r
+void ogl_device::disable(GLenum cap)\r
+{\r
+       auto& val = caps_[cap];\r
+       if(val)\r
+       {\r
+               glDisable(cap);\r
+               val = false;\r
+       }\r
+}\r
+\r
+void ogl_device::viewport(size_t x, size_t y, size_t width, size_t height)\r
+{\r
+       if(x != viewport_[0] || y != viewport_[1] || width != viewport_[2] || height != viewport_[3])\r
+       {               \r
+               glViewport(x, y, width, height);\r
+               viewport_[0] = x;\r
+               viewport_[1] = y;\r
+               viewport_[2] = width;\r
+               viewport_[3] = height;\r
+       }\r
+}\r
+\r
+void ogl_device::scissor(size_t x, size_t y, size_t width, size_t height)\r
+{\r
+       if(x != scissor_[0] || y != scissor_[1] || width != scissor_[2] || height != scissor_[3])\r
+       {               \r
+               glScissor(x, y, width, height);\r
+               scissor_[0] = x;\r
+               scissor_[1] = y;\r
+               scissor_[2] = width;\r
+               scissor_[3] = height;\r
+       }\r
+}\r
+\r
+void ogl_device::stipple_pattern(const GLubyte* pattern)\r
+{\r
+       if(pattern_ != pattern)\r
+       {               \r
+               glPolygonStipple(pattern);\r
+               pattern_ = pattern;\r
+       }\r
+}\r
+\r
+void ogl_device::attach(device_buffer& texture)\r
+{      \r
+       if(attached_texture_ != texture.id())\r
+       {\r
+               glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 0, GL_TEXTURE_2D, texture.id(), 0);\r
+               attached_texture_ = texture.id();\r
+       }\r
+}\r
+\r
+void ogl_device::clear(device_buffer& texture)\r
+{      \r
+       attach(texture);\r
+       glClear(GL_COLOR_BUFFER_BIT);\r
+}\r
+\r
+void ogl_device::use(shader& shader)\r
+{\r
+       if(active_shader_ != shader.id())\r
+       {               \r
+               glUseProgramObjectARB(shader.id());     \r
+               active_shader_ = shader.id();\r
+       }\r
+}\r
+\r
+}}\r
+\r