summaryrefslogtreecommitdiff
path: root/src/mbgl/gl
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2019-04-01 16:56:24 +0200
committerKonstantin Käfer <mail@kkaefer.com>2019-04-05 11:49:17 +0200
commit66c020034e8260e5e071481e68ab61cd264723ba (patch)
treeb5263772d72175474d91ce2daa9dc037b99fab0d /src/mbgl/gl
parenta782a6d15b80dd83105604f3f779f6c83ba222e5 (diff)
downloadqtlocation-mapboxgl-66c020034e8260e5e071481e68ab61cd264723ba.tar.gz
[core] refactor RendererBackend
Diffstat (limited to 'src/mbgl/gl')
-rw-r--r--src/mbgl/gl/context.cpp6
-rw-r--r--src/mbgl/gl/context.hpp4
-rw-r--r--src/mbgl/gl/renderer_backend.cpp71
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