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 --- platform/default/src/mbgl/gl/headless_backend.cpp | 4 +- src/core-files.json | 3 +- src/mbgl/gfx/context.hpp | 12 +++++ src/mbgl/gfx/renderbuffer.hpp | 52 ++++++++++++++++++++++ src/mbgl/gl/context.cpp | 49 +++++++++++--------- src/mbgl/gl/context.hpp | 23 +++------- src/mbgl/gl/renderbuffer.hpp | 33 -------------- src/mbgl/gl/renderbuffer_resource.hpp | 19 ++++++++ .../layers/render_fill_extrusion_layer.cpp | 2 +- src/mbgl/renderer/render_static_data.hpp | 4 +- src/mbgl/renderer/renderer_impl.cpp | 6 +-- src/mbgl/util/offscreen_texture.cpp | 6 +-- src/mbgl/util/offscreen_texture.hpp | 5 +-- 13 files changed, 134 insertions(+), 84 deletions(-) create mode 100644 src/mbgl/gfx/renderbuffer.hpp delete mode 100644 src/mbgl/gl/renderbuffer.hpp create mode 100644 src/mbgl/gl/renderbuffer_resource.hpp diff --git a/platform/default/src/mbgl/gl/headless_backend.cpp b/platform/default/src/mbgl/gl/headless_backend.cpp index 2073c90751..b4814acb5c 100644 --- a/platform/default/src/mbgl/gl/headless_backend.cpp +++ b/platform/default/src/mbgl/gl/headless_backend.cpp @@ -16,8 +16,8 @@ public: framebuffer(context.createFramebuffer(color, depthStencil)) { } - gl::Renderbuffer color; - gl::Renderbuffer depthStencil; + gfx::Renderbuffer color; + gfx::Renderbuffer depthStencil; gl::Framebuffer framebuffer; }; diff --git a/src/core-files.json b/src/core-files.json index b257666e3e..7ba2bd51e2 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -519,6 +519,7 @@ "mbgl/gfx/index_buffer.hpp": "src/mbgl/gfx/index_buffer.hpp", "mbgl/gfx/index_vector.hpp": "src/mbgl/gfx/index_vector.hpp", "mbgl/gfx/program.hpp": "src/mbgl/gfx/program.hpp", + "mbgl/gfx/renderbuffer.hpp": "src/mbgl/gfx/renderbuffer.hpp", "mbgl/gfx/stencil_mode.hpp": "src/mbgl/gfx/stencil_mode.hpp", "mbgl/gfx/texture.hpp": "src/mbgl/gfx/texture.hpp", "mbgl/gfx/types.hpp": "src/mbgl/gfx/types.hpp", @@ -540,7 +541,7 @@ "mbgl/gl/object.hpp": "src/mbgl/gl/object.hpp", "mbgl/gl/program.hpp": "src/mbgl/gl/program.hpp", "mbgl/gl/program_binary_extension.hpp": "src/mbgl/gl/program_binary_extension.hpp", - "mbgl/gl/renderbuffer.hpp": "src/mbgl/gl/renderbuffer.hpp", + "mbgl/gl/renderbuffer_resource.hpp": "src/mbgl/gl/renderbuffer_resource.hpp", "mbgl/gl/state.hpp": "src/mbgl/gl/state.hpp", "mbgl/gl/texture.hpp": "src/mbgl/gl/texture.hpp", "mbgl/gl/texture_resource.hpp": "src/mbgl/gl/texture_resource.hpp", diff --git a/src/mbgl/gfx/context.hpp b/src/mbgl/gfx/context.hpp index e898006ff5..f9b7789696 100644 --- a/src/mbgl/gfx/context.hpp +++ b/src/mbgl/gfx/context.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -120,6 +121,17 @@ protected: virtual void updateTextureResourceSub(const TextureResource&, uint16_t xOffset, uint16_t yOffset, Size, const void* data, TexturePixelType, TextureChannelDataType) = 0; +public: + template + Renderbuffer + createRenderbuffer(const Size size) { + return { size, createRenderbufferResource(pixelType, size) }; + } + +protected: + virtual std::unique_ptr + createRenderbufferResource(RenderbufferPixelType, Size) = 0; + public: DrawScope createDrawScope() { return { createDrawScopeResource() }; diff --git a/src/mbgl/gfx/renderbuffer.hpp b/src/mbgl/gfx/renderbuffer.hpp new file mode 100644 index 0000000000..209b7ed3f9 --- /dev/null +++ b/src/mbgl/gfx/renderbuffer.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { +namespace gfx { + +class RenderbufferResource { +protected: + RenderbufferResource() = default; + +public: + virtual ~RenderbufferResource() = default; +}; + +template +class Renderbuffer final { +public: + Renderbuffer(const Size size_, std::unique_ptr resource_) + : size(size_), resource(std::move(resource_)) { + } + + void setShouldClear(bool clear) { + dirty = clear; + } + + bool needsClearing() const { + return dirty; + } + + const Size& getSize() const { + return size; + } + + template + T& getResource() const { + assert(resource); + return static_cast(*resource); + } + +protected: + Size size; + bool dirty = false; + std::unique_ptr resource; +}; + +} // namespace gfx +} // namespace mbgl 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 diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index b16a9994bf..a676c72f06 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -60,23 +59,14 @@ public: #endif optional> getBinaryProgram(ProgramID) const; - template - Renderbuffer createRenderbuffer(const Size size) { - static_assert(type == gfx::RenderbufferPixelType::RGBA || - type == gfx::RenderbufferPixelType::DepthStencil || - type == gfx::RenderbufferPixelType::Depth, - "invalid renderbuffer type"); - return { size, createRenderbuffer(type, size) }; - } - - Framebuffer createFramebuffer(const Renderbuffer&, - const Renderbuffer&); - Framebuffer createFramebuffer(const Renderbuffer&); + Framebuffer createFramebuffer(const gfx::Renderbuffer&, + const gfx::Renderbuffer&); + Framebuffer createFramebuffer(const gfx::Renderbuffer&); Framebuffer createFramebuffer(const gfx::Texture&, - const Renderbuffer&); + const gfx::Renderbuffer&); Framebuffer createFramebuffer(const gfx::Texture&); Framebuffer createFramebuffer(const gfx::Texture&, - const Renderbuffer&); + const gfx::Renderbuffer&); template createRenderbufferResource(gfx::RenderbufferPixelType, Size size) override; + std::unique_ptr createDrawScopeResource() override; UniqueFramebuffer createFramebuffer(); - UniqueRenderbuffer createRenderbuffer(gfx::RenderbufferPixelType, Size size); std::unique_ptr readFramebuffer(Size, gfx::TexturePixelType, bool flip); #if not MBGL_USE_GLES2 void drawPixels(Size size, const void* data, gfx::TexturePixelType); diff --git a/src/mbgl/gl/renderbuffer.hpp b/src/mbgl/gl/renderbuffer.hpp deleted file mode 100644 index a761d17241..0000000000 --- a/src/mbgl/gl/renderbuffer.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace mbgl { -namespace gl { - -template -class Renderbuffer { -public: - Renderbuffer(Size size_, UniqueRenderbuffer renderbuffer_, bool dirty_ = false) - : size(std::move(size_)), renderbuffer(std::move(renderbuffer_)), dirty(dirty_) { - } - - using type = std::integral_constant; - Size size; - UniqueRenderbuffer renderbuffer; - - void shouldClear(bool clear) { - dirty = clear; - } - bool needsClearing() { - return dirty; - } - -private: - bool dirty; -}; - -} // namespace gl -} // namespace mbgl diff --git a/src/mbgl/gl/renderbuffer_resource.hpp b/src/mbgl/gl/renderbuffer_resource.hpp new file mode 100644 index 0000000000..52865b42f7 --- /dev/null +++ b/src/mbgl/gl/renderbuffer_resource.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace gl { + +class RenderbufferResource final : public gfx::RenderbufferResource { +public: + explicit RenderbufferResource(UniqueRenderbuffer renderbuffer_) + : renderbuffer(std::move(renderbuffer_)) { + } + + UniqueRenderbuffer renderbuffer; +}; + +} // namespace gl +} // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 13ef84f169..c261e9048f 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -70,7 +70,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* optional depthClearValue = {}; if (parameters.staticData.depthRenderbuffer->needsClearing()) depthClearValue = 1.0; // Flag the depth buffer as no longer needing to be cleared for the remainder of this pass. - parameters.staticData.depthRenderbuffer->shouldClear(false); + parameters.staticData.depthRenderbuffer->setShouldClear(false); glContext.setStencilMode(gfx::StencilMode::disabled()); glContext.clear(Color{ 0.0f, 0.0f, 0.0f, 0.0f }, depthClearValue, {}); diff --git a/src/mbgl/renderer/render_static_data.hpp b/src/mbgl/renderer/render_static_data.hpp index b57139b783..f6c40163ee 100644 --- a/src/mbgl/renderer/render_static_data.hpp +++ b/src/mbgl/renderer/render_static_data.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -32,7 +32,7 @@ public: SegmentVector rasterSegments; SegmentVector extrusionTextureSegments; - optional> depthRenderbuffer; + optional> depthRenderbuffer; bool has3D = false; Size backendSize; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index ea493b49eb..00e40ae485 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -398,11 +398,11 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { parameters.pass = RenderPass::Pass3D; if (!parameters.staticData.depthRenderbuffer || - parameters.staticData.depthRenderbuffer->size != parameters.staticData.backendSize) { + parameters.staticData.depthRenderbuffer->getSize() != parameters.staticData.backendSize) { parameters.staticData.depthRenderbuffer = - glContext.createRenderbuffer(parameters.staticData.backendSize); + parameters.context.createRenderbuffer(parameters.staticData.backendSize); } - parameters.staticData.depthRenderbuffer->shouldClear(true); + parameters.staticData.depthRenderbuffer->setShouldClear(true); uint32_t i = static_cast(renderItems.size()) - 1; for (auto it = renderItems.begin(); it != renderItems.end(); ++it, --i) { diff --git a/src/mbgl/util/offscreen_texture.cpp b/src/mbgl/util/offscreen_texture.cpp index be17aa06aa..d7d5c55564 100644 --- a/src/mbgl/util/offscreen_texture.cpp +++ b/src/mbgl/util/offscreen_texture.cpp @@ -17,7 +17,7 @@ public: } Impl(gl::Context& context_, const Size size_, - gl::Renderbuffer& depth_, + gfx::Renderbuffer& depth_, const gfx::TextureChannelDataType type_) : context(context_), size(std::move(size_)), depth(&depth_), type(type_) { assert(!size.isEmpty()); @@ -58,7 +58,7 @@ private: const Size size; optional framebuffer; optional texture; - gl::Renderbuffer* depth = nullptr; + gfx::Renderbuffer* depth = nullptr; const gfx::TextureChannelDataType type; }; @@ -72,7 +72,7 @@ OffscreenTexture::OffscreenTexture(gfx::Context& context, OffscreenTexture::OffscreenTexture(gfx::Context& context, const Size size, - gl::Renderbuffer& renderbuffer, + gfx::Renderbuffer& renderbuffer, const gfx::TextureChannelDataType type) // TODO: remove cast : impl(std::make_unique(reinterpret_cast(context), std::move(size), renderbuffer, type)) { diff --git a/src/mbgl/util/offscreen_texture.hpp b/src/mbgl/util/offscreen_texture.hpp index 1f470bd1b0..db8cfac559 100644 --- a/src/mbgl/util/offscreen_texture.hpp +++ b/src/mbgl/util/offscreen_texture.hpp @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include #include namespace mbgl { @@ -18,7 +17,7 @@ public: gfx::TextureChannelDataType type = gfx::TextureChannelDataType::UnsignedByte); OffscreenTexture(gfx::Context&, Size size, - gl::Renderbuffer&, + gfx::Renderbuffer&, gfx::TextureChannelDataType type = gfx::TextureChannelDataType::UnsignedByte); ~OffscreenTexture(); OffscreenTexture(OffscreenTexture&&); -- cgit v1.2.1