#include #include #include #include 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(); } } // namespace mbgl