diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-11-06 20:39:13 +0200 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-11-08 18:02:38 +0200 |
commit | d0ac12309b470eb59690ece3f15773df73a127e1 (patch) | |
tree | cfb7939f6d3ac7f1656966142b8b6f548ab6389f /platform/default | |
parent | 297c303e88416274d3d2c14b5f6abf1c850c3cf8 (diff) | |
download | qtlocation-mapboxgl-d0ac12309b470eb59690ece3f15773df73a127e1.tar.gz |
[core] Refactor HeadlessBackend
Diffstat (limited to 'platform/default')
-rw-r--r-- | platform/default/headless_backend.cpp | 24 | ||||
-rw-r--r-- | platform/default/headless_backend_osmesa.cpp | 61 |
2 files changed, 54 insertions, 31 deletions
diff --git a/platform/default/headless_backend.cpp b/platform/default/headless_backend.cpp index 279a7973c9..30ce8d2230 100644 --- a/platform/default/headless_backend.cpp +++ b/platform/default/headless_backend.cpp @@ -3,15 +3,16 @@ #include <cassert> #include <stdexcept> +#include <type_traits> namespace mbgl { -HeadlessBackend::HeadlessBackend() : display(std::make_shared<HeadlessDisplay>()) { +HeadlessBackend::HeadlessBackend() { activate(); } HeadlessBackend::HeadlessBackend(std::shared_ptr<HeadlessDisplay> display_) - : display(std::move(display_)) { + : display(std::move(display_)) { activate(); } @@ -23,8 +24,8 @@ HeadlessBackend::~HeadlessBackend() { void HeadlessBackend::activate() { active = true; - if (!glContext) { - if (!display) { + if (!hasContext()) { + if (!hasDisplay()) { throw std::runtime_error("Display is not set"); } createContext(); @@ -47,6 +48,21 @@ void HeadlessBackend::invalidate() { assert(false); } +void HeadlessBackend::destroyContext() { + assert(hasContext()); + impl.reset(); +} + +void HeadlessBackend::activateContext() { + assert(hasContext()); + impl->activateContext(); +} + +void HeadlessBackend::deactivateContext() { + assert(hasContext()); + impl->deactivateContext(); +} + void HeadlessBackend::notifyMapChange(MapChange change) { if (mapChangeCallback) { mapChangeCallback(change); diff --git a/platform/default/headless_backend_osmesa.cpp b/platform/default/headless_backend_osmesa.cpp index e0e385fcc6..04709d4a1b 100644 --- a/platform/default/headless_backend_osmesa.cpp +++ b/platform/default/headless_backend_osmesa.cpp @@ -1,47 +1,54 @@ #include <mbgl/platform/default/headless_backend.hpp> #include <mbgl/platform/log.hpp> -namespace mbgl { +#include <GL/osmesa.h> -gl::glProc HeadlessBackend::initializeExtension(const char* name) { - return OSMesaGetProcAddress(name); -} +#include <cassert> -void HeadlessBackend::createContext() { - if (glContext == nullptr) { -#if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305 - glContext = OSMesaCreateContextExt(OSMESA_RGBA, 16, 0, 0, nullptr); -#else - glContext = OSMesaCreateContext(OSMESA_RGBA, nullptr); -#endif - if (glContext == nullptr) { - Log::Error(Event::OpenGL, "failed to create OSMesa context"); - } - } +namespace mbgl { - if (glContext == nullptr) { - throw std::runtime_error("Error creating GL context object."); +struct OSMesaImpl : public HeadlessBackend::Impl { + OSMesaImpl(OSMesaContext glContext_) : glContext(glContext_) { } -} -void HeadlessBackend::destroyContext() { - if (glContext) { + ~OSMesaImpl() { if (glContext != OSMesaGetCurrentContext()) { activateContext(); } OSMesaDestroyContext(glContext); - glContext = nullptr; } -} -void HeadlessBackend::activateContext() { - if (!OSMesaMakeCurrent(glContext, &fakeBuffer, GL_UNSIGNED_BYTE, 1, 1)) { - throw std::runtime_error("Switching OpenGL context failed.\n"); + void activateContext() final { + if (!OSMesaMakeCurrent(glContext, &fakeBuffer, GL_UNSIGNED_BYTE, 1, 1)) { + throw std::runtime_error("Switching OpenGL context failed.\n"); + } } + + OSMesaContext glContext = nullptr; + GLubyte fakeBuffer = 0; +}; + +gl::glProc HeadlessBackend::initializeExtension(const char* name) { + return OSMesaGetProcAddress(name); } -void HeadlessBackend::deactivateContext() { - // no-op. +bool HeadlessBackend::hasDisplay() { + return true; +}; + +void HeadlessBackend::createContext() { + assert(!hasContext()); + +#if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305 + OSMesaContext glContext = OSMesaCreateContextExt(OSMESA_RGBA, 16, 0, 0, nullptr); +#else + OSMesaContext glContext = OSMesaCreateContext(OSMESA_RGBA, nullptr); +#endif + if (glContext == nullptr) { + throw std::runtime_error("Error creating GL context object."); + } + + impl.reset(new OSMesaImpl(glContext)); } } // namespace mbgl |