1 #pragma once
2 
3 #include <mbgl/renderer/backend_scope.hpp>
4 #include <mbgl/util/image.hpp>
5 #include <mbgl/util/size.hpp>
6 #include <mbgl/util/util.hpp>
7 
8 #include <memory>
9 #include <mutex>
10 
11 namespace mbgl {
12 
13 namespace gl {
14 class Context;
15 using ProcAddress = void (*)();
16 using FramebufferID = uint32_t;
17 } // namespace gl
18 
19 // The RendererBackend is used by the Renderer to facilitate
20 // the actual rendering.
21 class RendererBackend {
22 public:
23     RendererBackend();
24     virtual ~RendererBackend();
25 
26     // Returns the backend's context which manages OpenGL state.
27     gl::Context& getContext();
28 
29     // Called prior to rendering to update the internally assumed OpenGL state.
30     virtual void updateAssumedState() = 0;
31 
32     // Called when this backend is used for rendering. Implementations should ensure that a renderable
33     // object is bound and glClear/glDraw* calls can be done. They should also make sure that
34     // calling .bind() repeatedly is a no-op and that the appropriate gl::Context values are
35     // set to the current state.
36     virtual void bind() = 0;
37 
38     virtual Size getFramebufferSize() const = 0;
39 
40 protected:
41     // Called with the name of an OpenGL extension that should be loaded. RendererBackend implementations
42     // must call the API-specific version that obtains the function pointer for this function,
43     // or a null pointer if unsupported/unavailable.
44     virtual gl::ProcAddress getExtensionFunctionPointer(const char*) = 0;
45 
46     // Called when the backend's GL context needs to be made active or inactive. These are called,
47     // as a matched pair, exclusively through BackendScope, in two situations:
48     //
49     //   1. When releasing GL resources during Renderer destruction
50     //      (Including calling CustomLayerHost::deinitialize during RenderCustomLayer destruction)
51     //   2. When renderering through Renderer::render()
52     //      (Including calling CustomLayerHost::initialize for newly added custom layers and
53     //       CustomLayerHost::deinitialize on layer removal)
54     virtual void activate() = 0;
55     virtual void deactivate() = 0;
56 
57     // Reads the color pixel data from the currently bound framebuffer.
58     PremultipliedImage readFramebuffer(const Size&) const;
59 
60     // A constant to signal that a framebuffer is bound, but with an unknown ID.
61     static constexpr const gl::FramebufferID ImplicitFramebufferBinding =
62         std::numeric_limits<gl::FramebufferID>::max();
63 
64     // Tells the renderer that OpenGL state has already been set by the windowing toolkit.
65     // It sets the internal assumed state to the supplied values.
66     void assumeFramebufferBinding(gl::FramebufferID fbo);
67     void assumeViewport(int32_t x, int32_t y, const Size&);
68     void assumeScissorTest(bool);
69 
70     // Returns true when assumed framebuffer binding hasn't changed from the implicit binding.
71     bool implicitFramebufferBound();
72 
73     // Triggers an OpenGL state update if the internal assumed state doesn't match the
74     // supplied values.
75     void setFramebufferBinding(gl::FramebufferID fbo);
76     void setViewport(int32_t x, int32_t y, const Size&);
77     void setScissorTest(bool);
78 
79 protected:
80     std::unique_ptr<gl::Context> context;
81 
82 private:
83     std::once_flag initialized;
84 
85     friend class BackendScope;
86 };
87 
operator ==(const RendererBackend & a,const RendererBackend & b)88 MBGL_CONSTEXPR bool operator==(const RendererBackend& a, const RendererBackend& b) {
89     return &a == &b;
90 }
91 
92 } // namespace mbgl
93