1 #include <mbgl/renderer/renderer_backend.hpp>
2 #include <mbgl/renderer/backend_scope.hpp>
3 #include <mbgl/gl/context.hpp>
4 #include <mbgl/gl/extension.hpp>
5 #include <mbgl/gl/debugging.hpp>
6 
7 #include <cassert>
8 
9 namespace mbgl {
10 
11 RendererBackend::RendererBackend() = default;
12 
getContext()13 gl::Context& RendererBackend::getContext() {
14     assert(BackendScope::exists());
15     std::call_once(initialized, [this] {
16         context = std::make_unique<gl::Context>();
17         context->enableDebugging();
18         context->initializeExtensions(
19             std::bind(&RendererBackend::getExtensionFunctionPointer, this, std::placeholders::_1));
20     });
21     return *context;
22 }
23 
readFramebuffer(const Size & size) const24 PremultipliedImage RendererBackend::readFramebuffer(const Size& size) const {
25     assert(context);
26     return context->readFramebuffer<PremultipliedImage>(size);
27 }
28 
assumeFramebufferBinding(const gl::FramebufferID fbo)29 void RendererBackend::assumeFramebufferBinding(const gl::FramebufferID fbo) {
30     getContext().bindFramebuffer.setCurrentValue(fbo);
31     if (fbo != ImplicitFramebufferBinding) {
32         assert(gl::value::BindFramebuffer::Get() == getContext().bindFramebuffer.getCurrentValue());
33     }
34 }
35 
assumeViewport(int32_t x,int32_t y,const Size & size)36 void RendererBackend::assumeViewport(int32_t x, int32_t y, const Size& size) {
37     getContext().viewport.setCurrentValue({ x, y, size });
38     assert(gl::value::Viewport::Get() == getContext().viewport.getCurrentValue());
39 }
40 
assumeScissorTest(bool enabled)41 void RendererBackend::assumeScissorTest(bool enabled) {
42     getContext().scissorTest.setCurrentValue(enabled);
43     assert(gl::value::ScissorTest::Get() == getContext().scissorTest.getCurrentValue());
44 }
45 
implicitFramebufferBound()46 bool RendererBackend::implicitFramebufferBound() {
47     return getContext().bindFramebuffer.getCurrentValue() == ImplicitFramebufferBinding;
48 }
49 
setFramebufferBinding(const gl::FramebufferID fbo)50 void RendererBackend::setFramebufferBinding(const gl::FramebufferID fbo) {
51     getContext().bindFramebuffer = fbo;
52     if (fbo != ImplicitFramebufferBinding) {
53         assert(gl::value::BindFramebuffer::Get() == getContext().bindFramebuffer.getCurrentValue());
54     }
55 }
56 
setViewport(int32_t x,int32_t y,const Size & size)57 void RendererBackend::setViewport(int32_t x, int32_t y, const Size& size) {
58     getContext().viewport = { x, y, size };
59     assert(gl::value::Viewport::Get() == getContext().viewport.getCurrentValue());
60 }
61 
setScissorTest(bool enabled)62 void RendererBackend::setScissorTest(bool enabled) {
63     getContext().scissorTest = enabled;
64     assert(gl::value::ScissorTest::Get() == getContext().scissorTest.getCurrentValue());
65 }
66 
67 RendererBackend::~RendererBackend() = default;
68 
69 } // namespace mbgl
70