diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-15 18:03:04 +0300 |
---|---|---|
committer | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-18 10:07:05 +0300 |
commit | 5459954ff46c8dbec3b7c48b4cdb1efbdc21a7e3 (patch) | |
tree | 06da03a9a03bf605488fa2e12bc00e4f7cd764a3 | |
parent | 3f80093acf21230c9085b29bd8a43d1dffa09029 (diff) | |
download | qtlocation-mapboxgl-5459954ff46c8dbec3b7c48b4cdb1efbdc21a7e3.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
-rw-r--r-- | include/mbgl/renderer/renderer.hpp | 2 | ||||
-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 |
6 files changed, 29 insertions, 1 deletions
diff --git a/include/mbgl/renderer/renderer.hpp b/include/mbgl/renderer/renderer.hpp index 95828a1b79..be8abb2c29 100644 --- a/include/mbgl/renderer/renderer.hpp +++ b/include/mbgl/renderer/renderer.hpp @@ -28,6 +28,8 @@ public: const optional<std::string> programCacheDir = {}); ~Renderer(); + void markContextLost(); + void setObserver(RendererObserver*); void render(const UpdateParameters&); 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 a5d23333ac..94ce172a81 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -61,6 +61,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 |