diff options
Diffstat (limited to 'platform/default/src/mbgl/gl/headless_backend_osmesa.cpp')
-rw-r--r-- | platform/default/src/mbgl/gl/headless_backend_osmesa.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/platform/default/src/mbgl/gl/headless_backend_osmesa.cpp b/platform/default/src/mbgl/gl/headless_backend_osmesa.cpp new file mode 100644 index 0000000000..0da1caf9af --- /dev/null +++ b/platform/default/src/mbgl/gl/headless_backend_osmesa.cpp @@ -0,0 +1,47 @@ +#include <mbgl/gl/headless_backend.hpp> +#include <mbgl/util/logging.hpp> + +#include <GL/osmesa.h> + +#include <cassert> + +namespace mbgl { + +class OSMesaBackendImpl : public HeadlessBackend::Impl { +public: + OSMesaBackendImpl() { +#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) { + throw std::runtime_error("Error creating GL context object."); + } + } + + ~OSMesaBackendImpl() final { + OSMesaDestroyContext(glContext); + } + + gl::ProcAddress getExtensionFunctionPointer(const char* name) final { + return OSMesaGetProcAddress(name); + } + + void activateContext() final { + if (!OSMesaMakeCurrent(glContext, &fakeBuffer, GL_UNSIGNED_BYTE, 1, 1)) { + throw std::runtime_error("Switching OpenGL context failed.\n"); + } + } + +private: + OSMesaContext glContext = nullptr; + GLubyte fakeBuffer = 0; +}; + +void HeadlessBackend::createImpl() { + assert(!impl); + impl = std::make_unique<OSMesaBackendImpl>(); +} + +} // namespace mbgl |