summaryrefslogtreecommitdiff
path: root/platform/default/mbgl/gl/headless_backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/mbgl/gl/headless_backend.cpp')
-rw-r--r--platform/default/mbgl/gl/headless_backend.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/platform/default/mbgl/gl/headless_backend.cpp b/platform/default/mbgl/gl/headless_backend.cpp
new file mode 100644
index 0000000000..0bfdf11c98
--- /dev/null
+++ b/platform/default/mbgl/gl/headless_backend.cpp
@@ -0,0 +1,72 @@
+#include <mbgl/gl/headless_backend.hpp>
+#include <mbgl/gl/headless_display.hpp>
+
+#include <cassert>
+#include <stdexcept>
+#include <type_traits>
+
+namespace mbgl {
+
+HeadlessBackend::HeadlessBackend() {
+ activate();
+}
+
+HeadlessBackend::HeadlessBackend(std::shared_ptr<HeadlessDisplay> display_)
+ : display(std::move(display_)) {
+ activate();
+}
+
+HeadlessBackend::~HeadlessBackend() {
+ deactivate();
+ destroyContext();
+}
+
+void HeadlessBackend::activate() {
+ active = true;
+
+ if (!hasContext()) {
+ if (!hasDisplay()) {
+ throw std::runtime_error("Display is not set");
+ }
+ createContext();
+ }
+
+ activateContext();
+
+ if (!extensionsLoaded) {
+ gl::InitializeExtensions(initializeExtension);
+ extensionsLoaded = true;
+ }
+}
+
+void HeadlessBackend::deactivate() {
+ deactivateContext();
+ active = false;
+}
+
+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);
+ }
+}
+
+} // namespace mbgl