diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2019-04-01 16:56:24 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2019-04-05 11:49:17 +0200 |
commit | 66c020034e8260e5e071481e68ab61cd264723ba (patch) | |
tree | b5263772d72175474d91ce2daa9dc037b99fab0d /src/mbgl/gl | |
parent | a782a6d15b80dd83105604f3f779f6c83ba222e5 (diff) | |
download | qtlocation-mapboxgl-66c020034e8260e5e071481e68ab61cd264723ba.tar.gz |
[core] refactor RendererBackend
Diffstat (limited to 'src/mbgl/gl')
-rw-r--r-- | src/mbgl/gl/context.cpp | 6 | ||||
-rw-r--r-- | src/mbgl/gl/context.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/gl/renderer_backend.cpp | 71 |
3 files changed, 78 insertions, 3 deletions
diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index d33ae067f6..458bf9b649 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -1,5 +1,6 @@ #include <mbgl/gl/context.hpp> #include <mbgl/gl/enum.hpp> +#include <mbgl/gl/renderer_backend.hpp> #include <mbgl/gl/vertex_buffer_resource.hpp> #include <mbgl/gl/index_buffer_resource.hpp> #include <mbgl/gl/texture_resource.hpp> @@ -53,12 +54,12 @@ static_assert(underlying_type(UniformDataType::SamplerCube) == GL_SAMPLER_CUBE, static_assert(std::is_same<BinaryProgramFormat, GLenum>::value, "OpenGL type mismatch"); -Context::Context() +Context::Context(RendererBackend& backend_) : gfx::Context(gfx::ContextType::OpenGL, [] { GLint value; MBGL_CHECK_ERROR(glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &value)); return value; - }()) { + }()), backend(backend_) { } Context::~Context() { @@ -701,6 +702,7 @@ void Context::setColorMode(const gfx::ColorMode& color) { } std::unique_ptr<gfx::CommandEncoder> Context::createCommandEncoder() { + backend.updateAssumedState(); return std::make_unique<gl::CommandEncoder>(*this); } diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 2fb1d242ce..0fad92f3df 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -27,6 +27,7 @@ namespace gl { constexpr size_t TextureMax = 64; using ProcAddress = void (*)(); +class RendererBackend; namespace extension { class VertexArray; @@ -36,7 +37,7 @@ class ProgramBinary; class Context final : public gfx::Context { public: - Context(); + Context(RendererBackend&); ~Context() override; Context(const Context&) = delete; Context& operator=(const Context& other) = delete; @@ -136,6 +137,7 @@ public: } private: + RendererBackend& backend; bool cleanupOnDestruction = true; std::unique_ptr<extension::Debugging> debugging; diff --git a/src/mbgl/gl/renderer_backend.cpp b/src/mbgl/gl/renderer_backend.cpp new file mode 100644 index 0000000000..ed3f38193f --- /dev/null +++ b/src/mbgl/gl/renderer_backend.cpp @@ -0,0 +1,71 @@ +#include <mbgl/gl/renderer_backend.hpp> +#include <mbgl/gfx/backend_scope.hpp> +#include <mbgl/gl/context.hpp> +#include <mbgl/gl/extension.hpp> + +#include <cassert> + +namespace mbgl { +namespace gl { + +RendererBackend::RendererBackend() = default; + +std::unique_ptr<gfx::Context> RendererBackend::createContext() { + auto result = std::make_unique<gl::Context>(*this); + result->enableDebugging(); + result->initializeExtensions( + std::bind(&RendererBackend::getExtensionFunctionPointer, this, std::placeholders::_1)); + // Needs move to placate GCC 4.9 + return std::move(result); +} + +gl::Context& RendererBackend::getGLContext() { + return static_cast<gl::Context&>(getContext()); +} + +PremultipliedImage RendererBackend::readFramebuffer(const Size& size) { + return getGLContext().readFramebuffer<PremultipliedImage>(size); +} + +void RendererBackend::assumeFramebufferBinding(const gl::FramebufferID fbo) { + getGLContext().bindFramebuffer.setCurrentValue(fbo); + if (fbo != ImplicitFramebufferBinding) { + assert(gl::value::BindFramebuffer::Get() == getGLContext().bindFramebuffer.getCurrentValue()); + } +} + +void RendererBackend::assumeViewport(int32_t x, int32_t y, const Size& size) { + getGLContext().viewport.setCurrentValue({ x, y, size }); + assert(gl::value::Viewport::Get() == getGLContext().viewport.getCurrentValue()); +} + +void RendererBackend::assumeScissorTest(bool enabled) { + getGLContext().scissorTest.setCurrentValue(enabled); + assert(gl::value::ScissorTest::Get() == getGLContext().scissorTest.getCurrentValue()); +} + +bool RendererBackend::implicitFramebufferBound() { + return getGLContext().bindFramebuffer.getCurrentValue() == ImplicitFramebufferBinding; +} + +void RendererBackend::setFramebufferBinding(const gl::FramebufferID fbo) { + getGLContext().bindFramebuffer = fbo; + if (fbo != ImplicitFramebufferBinding) { + assert(gl::value::BindFramebuffer::Get() == getGLContext().bindFramebuffer.getCurrentValue()); + } +} + +void RendererBackend::setViewport(int32_t x, int32_t y, const Size& size) { + getGLContext().viewport = { x, y, size }; + assert(gl::value::Viewport::Get() == getGLContext().viewport.getCurrentValue()); +} + +void RendererBackend::setScissorTest(bool enabled) { + getGLContext().scissorTest = enabled; + assert(gl::value::ScissorTest::Get() == getGLContext().scissorTest.getCurrentValue()); +} + +RendererBackend::~RendererBackend() = default; + +} // namespace gl +} // namespace mbgl |