diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-15 18:03:04 +0300 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-09-22 23:33:56 +0300 |
commit | bda6ed26c65b541b0633fcdf824f2baef30aa0cc (patch) | |
tree | 22f4e3ca1356d5f92bfcc79c8d359925eac1897d /src | |
parent | 67285f3a95f74966324fc59f271ba8b6b763b2b5 (diff) | |
download | qtlocation-mapboxgl-bda6ed26c65b541b0633fcdf824f2baef30aa0cc.tar.gz |
[core] send signal to RenderCustomLayer when gl context has been lost
- Prevents cleaning up of GL resources that no longer exist, resulting in a crash
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/renderer/layers/render_custom_layer.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_custom_layer.hpp | 5 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 11 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.hpp | 6 |
5 files changed, 27 insertions, 1 deletions
diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp index ae0c4b026b..3d19f5ef46 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -16,7 +16,7 @@ RenderCustomLayer::RenderCustomLayer(Immutable<style::CustomLayer::Impl> _impl) RenderCustomLayer::~RenderCustomLayer() { assert(BackendScope::exists()); - if (initialized && impl().deinitializeFn) { + if (initialized && !contextDestroyed && impl().deinitializeFn) { impl().deinitializeFn(impl().context); } } diff --git a/src/mbgl/renderer/layers/render_custom_layer.hpp b/src/mbgl/renderer/layers/render_custom_layer.hpp index d8e9d93811..32ed9da8da 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.hpp +++ b/src/mbgl/renderer/layers/render_custom_layer.hpp @@ -19,8 +19,13 @@ public: const style::CustomLayer::Impl& impl() const; + void markContextDestroyed() { + contextDestroyed = true; + }; + private: bool initialized = false; + bool contextDestroyed = false; }; template <> diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp index a106d6c5fa..e915f5e146 100644 --- a/src/mbgl/renderer/renderer.cpp +++ b/src/mbgl/renderer/renderer.cpp @@ -20,6 +20,10 @@ Renderer::~Renderer() { impl.reset(); } +void Renderer::markContextLost() { + impl->markContextLost(); +} + void Renderer::setObserver(RendererObserver* observer) { impl->setObserver(observer); } diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index c45295b693..1a828b80a3 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -62,6 +62,17 @@ Renderer::Impl::Impl(RendererBackend& backend_, Renderer::Impl::~Impl() { assert(BackendScope::exists()); + + if (contextLost) { + // Signal all RenderCustomLayers that the context was lost + // before cleaning up + for (const auto& entry : renderLayers) { + RenderLayer& layer = *entry.second; + if (layer.is<RenderCustomLayer>()) { + layer.as<RenderCustomLayer>()->markContextDestroyed(); + } + } + } }; void Renderer::Impl::setObserver(RendererObserver* observer_) { diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index 8bdb472442..30e7f70722 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -39,6 +39,10 @@ public: const optional<std::string> programCacheDir); ~Impl() final; + void markContextLost() { + contextLost = true; + }; + void setObserver(RendererObserver*); void render(const UpdateParameters&); @@ -100,6 +104,8 @@ private: std::unordered_map<std::string, std::unique_ptr<RenderSource>> renderSources; std::unordered_map<std::string, std::unique_ptr<RenderLayer>> renderLayers; RenderLight renderLight; + + bool contextLost = false; }; } // namespace mbgl |