summaryrefslogtreecommitdiff
path: root/include/mbgl/renderer/renderer_backend.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/renderer/renderer_backend.hpp')
-rw-r--r--include/mbgl/renderer/renderer_backend.hpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/include/mbgl/renderer/renderer_backend.hpp b/include/mbgl/renderer/renderer_backend.hpp
new file mode 100644
index 0000000000..9d967fd51b
--- /dev/null
+++ b/include/mbgl/renderer/renderer_backend.hpp
@@ -0,0 +1,84 @@
+#pragma once
+
+#include <mbgl/map/view.hpp>
+#include <mbgl/renderer/backend_scope.hpp>
+#include <mbgl/util/image.hpp>
+#include <mbgl/util/size.hpp>
+
+#include <memory>
+#include <mutex>
+
+namespace mbgl {
+
+namespace gl {
+class Context;
+using ProcAddress = void (*)();
+using FramebufferID = uint32_t;
+} // namespace gl
+
+// The RendererBackend is used by the Renderer to facilitate
+// the actual rendering.
+class RendererBackend {
+public:
+ RendererBackend();
+ virtual ~RendererBackend();
+
+ // Returns the backend's context which manages OpenGL state.
+ gl::Context& getContext();
+
+ // Called prior to rendering to update the internally assumed OpenGL state.
+ virtual void updateAssumedState() = 0;
+
+ virtual BackendScope::ScopeType getScopeType() const {
+ return BackendScope::ScopeType::Explicit;
+ }
+
+protected:
+ // Called with the name of an OpenGL extension that should be loaded. RendererBackend implementations
+ // must call the API-specific version that obtains the function pointer for this function,
+ // or a null pointer if unsupported/unavailable.
+ virtual gl::ProcAddress initializeExtension(const char*) = 0;
+
+ // Called when the backend's GL context needs to be made active or inactive. These are called,
+ // as a matched pair, exclusively through BackendScope, in two situations:
+ //
+ // 1. When releasing GL resources during Renderer destruction
+ // (Including calling CustomLayerDeinitializeFunction during RenderCustomLayer destruction)
+ // 2. When renderering through Renderer::render()
+ // (Including calling CustomLayerDeinitializeFunction for newly added custom layers and
+ // CustomLayerDeinitializeFunction on layer removal)
+ virtual void activate() = 0;
+ virtual void deactivate() = 0;
+
+ // Reads the color pixel data from the currently bound framebuffer.
+ PremultipliedImage readFramebuffer(const Size&) const;
+
+ // A constant to signal that a framebuffer is bound, but with an unknown ID.
+ static constexpr const gl::FramebufferID ImplicitFramebufferBinding =
+ std::numeric_limits<gl::FramebufferID>::max();
+
+ // Tells the renderer that OpenGL state has already been set by the windowing toolkit.
+ // It sets the internal assumed state to the supplied values.
+ void assumeFramebufferBinding(gl::FramebufferID fbo);
+ void assumeViewport(int32_t x, int32_t y, const Size&);
+ void assumeScissorTest(bool);
+
+ // Returns true when assumed framebuffer binding hasn't changed from the implicit binding.
+ bool implicitFramebufferBound();
+
+ // Triggers an OpenGL state update if the internal assumed state doesn't match the
+ // supplied values.
+ void setFramebufferBinding(gl::FramebufferID fbo);
+ void setViewport(int32_t x, int32_t y, const Size&);
+ void setScissorTest(bool);
+
+protected:
+ std::unique_ptr<gl::Context> context;
+
+private:
+ std::once_flag initialized;
+
+ friend class BackendScope;
+};
+
+} // namespace mbgl