X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fmixer%2Fgpu%2Fogl_device.cpp;h=1f2698d532a412c59a2af65e88f3aa87be1305ed;hb=517174ad8f15d5b6f71cdf8bc04a158cbe4bd278;hp=1cafb65c1716330d50b1f2545bc8ac0455dd778b;hpb=54f18174cf27e096162084f91b6c8b0d4c725c34;p=casparcg diff --git a/core/mixer/gpu/ogl_device.cpp b/core/mixer/gpu/ogl_device.cpp index 1cafb65c1..1f2698d53 100644 --- a/core/mixer/gpu/ogl_device.cpp +++ b/core/mixer/gpu/ogl_device.cpp @@ -21,15 +21,28 @@ #include "ogl_device.h" +#include "shader.h" + +#include #include #include #include +#include + namespace caspar { namespace core { -ogl_device::ogl_device() : executor_(L"ogl_device") +ogl_device::ogl_device() + : executor_(L"ogl_device") + , pattern_(nullptr) + , attached_texture_(0) + , active_shader_(0) { + std::fill(binded_textures_.begin(), binded_textures_.end(), 0); + std::fill(viewport_.begin(), viewport_.end(), 0); + std::fill(scissor_.begin(), scissor_.end(), 0); + invoke([=] { context_.reset(new sf::Context()); @@ -78,7 +91,7 @@ safe_ptr ogl_device::create_device_buffer(size_t width, size_t he try { yield(); - gc().get(); + gc().wait(); // Try again buffer.reset(new device_buffer(width, height, stride)); @@ -122,7 +135,7 @@ safe_ptr ogl_device::create_host_buffer(size_t size, host_buffer::u try { yield(); - gc().get(); + gc().wait(); // Try again buffer.reset(new host_buffer(size, usage)); @@ -201,4 +214,83 @@ std::wstring ogl_device::get_version() return ver; } -}} \ No newline at end of file + +void ogl_device::enable(GLenum cap) +{ + auto& val = caps_[cap]; + if(!val) + { + glEnable(cap); + val = true; + } +} + +void ogl_device::disable(GLenum cap) +{ + auto& val = caps_[cap]; + if(val) + { + glDisable(cap); + val = false; + } +} + +void ogl_device::viewport(size_t x, size_t y, size_t width, size_t height) +{ + if(x != viewport_[0] || y != viewport_[1] || width != viewport_[2] || height != viewport_[3]) + { + glViewport(x, y, width, height); + viewport_[0] = x; + viewport_[1] = y; + viewport_[2] = width; + viewport_[3] = height; + } +} + +void ogl_device::scissor(size_t x, size_t y, size_t width, size_t height) +{ + if(x != scissor_[0] || y != scissor_[1] || width != scissor_[2] || height != scissor_[3]) + { + glScissor(x, y, width, height); + scissor_[0] = x; + scissor_[1] = y; + scissor_[2] = width; + scissor_[3] = height; + } +} + +void ogl_device::stipple_pattern(const GLubyte* pattern) +{ + if(pattern_ != pattern) + { + glPolygonStipple(pattern); + pattern_ = pattern; + } +} + +void ogl_device::attach(device_buffer& texture) +{ + if(attached_texture_ != texture.id()) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 0, GL_TEXTURE_2D, texture.id(), 0); + attached_texture_ = texture.id(); + } +} + +void ogl_device::clear(device_buffer& texture) +{ + attach(texture); + glClear(GL_COLOR_BUFFER_BIT); +} + +void ogl_device::use(shader& shader) +{ + if(active_shader_ != shader.id()) + { + glUseProgramObjectARB(shader.id()); + active_shader_ = shader.id(); + } +} + +}} +