- Guards against duplicate activations by checking wether the backend of the prior scope is the same as the current ones - Makes sure that only the most outer backend scope deactivates by tracking activation state
67 lines
1.6 KiB
C++
67 lines
1.6 KiB
C++
#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
|