From be3b5917c169a6d5e6fcdc3cca15ca78e44dfd1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Wed, 20 Mar 2019 15:27:13 +0100 Subject: [core] add generic base class for renderbuffers --- src/mbgl/gl/context.cpp | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) (limited to 'src/mbgl/gl/context.cpp') diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index a1feafbedd..fcaae59804 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -336,7 +337,8 @@ UniqueFramebuffer Context::createFramebuffer() { return UniqueFramebuffer{ std::move(id), { this } }; } -UniqueRenderbuffer Context::createRenderbuffer(const gfx::RenderbufferPixelType type, const Size size) { +std::unique_ptr +Context::createRenderbufferResource(const gfx::RenderbufferPixelType type, const Size size) { RenderbufferID id = 0; MBGL_CHECK_ERROR(glGenRenderbuffers(1, &id)); UniqueRenderbuffer renderbuffer{ std::move(id), { this } }; @@ -345,9 +347,10 @@ UniqueRenderbuffer Context::createRenderbuffer(const gfx::RenderbufferPixelType MBGL_CHECK_ERROR( glRenderbufferStorage(GL_RENDERBUFFER, Enum::to(type), size.width, size.height)); bindRenderbuffer = 0; - return renderbuffer; + return std::make_unique(std::move(renderbuffer)); } + std::unique_ptr Context::readFramebuffer(const Size size, const gfx::TexturePixelType format, const bool flip) { const size_t stride = size.width * (format == gfx::TexturePixelType::RGBA ? 4 : 1); auto data = std::make_unique(stride * size.height); @@ -417,48 +420,52 @@ void checkFramebuffer() { } void bindDepthStencilRenderbuffer( - const Renderbuffer& depthStencil) { + const gfx::Renderbuffer& depthStencil) { + auto& depthStencilResource = depthStencil.getResource(); #ifdef GL_DEPTH_STENCIL_ATTACHMENT MBGL_CHECK_ERROR(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, depthStencil.renderbuffer)); + GL_RENDERBUFFER, depthStencilResource.renderbuffer)); #else MBGL_CHECK_ERROR(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - depthStencil.renderbuffer)); + depthStencilResource.renderbuffer)); MBGL_CHECK_ERROR(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, depthStencil.renderbuffer)); + GL_RENDERBUFFER, depthStencilResource.renderbuffer)); #endif } } // namespace Framebuffer -Context::createFramebuffer(const Renderbuffer& color, - const Renderbuffer& depthStencil) { - if (color.size != depthStencil.size) { +Context::createFramebuffer(const gfx::Renderbuffer& color, + const gfx::Renderbuffer& depthStencil) { + if (color.getSize() != depthStencil.getSize()) { throw std::runtime_error("Renderbuffer size mismatch"); } auto fbo = createFramebuffer(); bindFramebuffer = fbo; + + auto& colorResource = color.getResource(); MBGL_CHECK_ERROR(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, color.renderbuffer)); + GL_RENDERBUFFER, colorResource.renderbuffer)); bindDepthStencilRenderbuffer(depthStencil); checkFramebuffer(); - return { color.size, std::move(fbo) }; + return { color.getSize(), std::move(fbo) }; } -Framebuffer Context::createFramebuffer(const Renderbuffer& color) { +Framebuffer Context::createFramebuffer(const gfx::Renderbuffer& color) { auto fbo = createFramebuffer(); bindFramebuffer = fbo; + auto& colorResource = color.getResource(); MBGL_CHECK_ERROR(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, color.renderbuffer)); + GL_RENDERBUFFER, colorResource.renderbuffer)); checkFramebuffer(); - return { color.size, std::move(fbo) }; + return { color.getSize(), std::move(fbo) }; } Framebuffer Context::createFramebuffer(const gfx::Texture& color, - const Renderbuffer& depthStencil) { - if (color.size != depthStencil.size) { + const gfx::Renderbuffer& depthStencil) { + if (color.size != depthStencil.getSize()) { throw std::runtime_error("Renderbuffer size mismatch"); } auto fbo = createFramebuffer(); @@ -483,8 +490,8 @@ Framebuffer Context::createFramebuffer(const gfx::Texture& color) { Framebuffer Context::createFramebuffer(const gfx::Texture& color, - const Renderbuffer& depthTarget) { - if (color.size != depthTarget.size) { + const gfx::Renderbuffer& depth) { + if (color.size != depth.getSize()) { throw std::runtime_error("Renderbuffer size mismatch"); } auto fbo = createFramebuffer(); @@ -492,10 +499,12 @@ Context::createFramebuffer(const gfx::Texture& color, MBGL_CHECK_ERROR(glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, reinterpret_cast(*color.resource).texture, 0)); + + auto& depthResource = depth.getResource(); MBGL_CHECK_ERROR(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - depthTarget.renderbuffer)); + depthResource.renderbuffer)); checkFramebuffer(); - return { depthTarget.size, std::move(fbo) }; + return { depth.getSize(), std::move(fbo) }; } std::unique_ptr -- cgit v1.2.1