summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/backend_scope.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/backend_scope.cpp')
-rw-r--r--src/mbgl/renderer/backend_scope.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/mbgl/renderer/backend_scope.cpp b/src/mbgl/renderer/backend_scope.cpp
new file mode 100644
index 0000000000..fafeaabb39
--- /dev/null
+++ b/src/mbgl/renderer/backend_scope.cpp
@@ -0,0 +1,66 @@
+#include <mbgl/renderer/backend_scope.hpp>
+#include <mbgl/renderer/renderer_backend.hpp>
+#include <mbgl/util/thread_local.hpp>
+
+#include <cassert>
+
+namespace mbgl {
+
+static util::ThreadLocal<BackendScope> currentScope;
+
+BackendScope::BackendScope(RendererBackend& backend_, ScopeType scopeType_)
+ : priorScope(currentScope.get()),
+ nextScope(nullptr),
+ backend(backend_),
+ scopeType(scopeType_) {
+ if (priorScope) {
+ assert(priorScope->nextScope == nullptr);
+ priorScope->nextScope = this;
+ priorScope->deactivate();
+ }
+
+ activate();
+
+ currentScope.set(this);
+}
+
+BackendScope::~BackendScope() {
+ assert(nextScope == nullptr);
+ deactivate();
+
+ if (priorScope) {
+ priorScope->activate();
+ currentScope.set(priorScope);
+ assert(priorScope->nextScope == this);
+ priorScope->nextScope = nullptr;
+ } else {
+ currentScope.set(nullptr);
+ }
+}
+
+void BackendScope::activate() {
+ if (scopeType == ScopeType::Explicit &&
+ !(priorScope && this->backend == priorScope->backend) &&
+ !(nextScope && this->backend == nextScope->backend)) {
+ // Only activate when set to Explicit and
+ // only once per RenderBackend
+ backend.activate();
+ activated = true;
+ }
+}
+
+void BackendScope::deactivate() {
+ if (activated &&
+ !(nextScope && this->backend == nextScope->backend)) {
+ // Only deactivate when set to Explicit and
+ // only once per RenderBackend
+ backend.deactivate();
+ activated = false;
+ }
+}
+
+bool BackendScope::exists() {
+ return currentScope.get();
+}
+
+} // namespace mbgl