summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2017-09-18 13:40:26 +0300
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2017-09-22 23:33:56 +0300
commit18bb6da10968872e585b6e0b787f45cb3a806b76 (patch)
tree7c55f14d89f8568f10eff93ae7239dca94fefa76
parent8b9794b1a7276d8ea2957d5aed7169fc0b40e25d (diff)
downloadqtlocation-mapboxgl-18bb6da10968872e585b6e0b787f45cb3a806b76.tar.gz
[android] reset renderer on the GL thread when map is destroyed
- ensures cleanup of resources on the right thread
-rw-r--r--platform/android/src/map_renderer.cpp10
-rw-r--r--platform/android/src/map_renderer.hpp3
2 files changed, 11 insertions, 2 deletions
diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp
index 3cf39ad3ff..7655455210 100644
--- a/platform/android/src/map_renderer.cpp
+++ b/platform/android/src/map_renderer.cpp
@@ -27,8 +27,9 @@ MapRenderer::MapRenderer(jni::JNIEnv& _env, jni::Object<MapRenderer> obj,
MapRenderer::~MapRenderer() = default;
void MapRenderer::reset() {
- assert (renderer);
- renderer.reset();
+ // Make sure to destroy the renderer on the GL Thread
+ auto self = ActorRef<MapRenderer>(*this, mailbox);
+ self.ask(&MapRenderer::resetRenderer).wait();
// Lock to make sure there is no concurrent initialisation on the gl thread
std::lock_guard<std::mutex> lock(initialisationMutex);
@@ -91,6 +92,11 @@ void MapRenderer::requestSnapshot(SnapshotCallback callback) {
// Called on OpenGL thread //
+void MapRenderer::resetRenderer() {
+ assert (renderer);
+ renderer.reset();
+}
+
void MapRenderer::scheduleSnapshot(std::unique_ptr<SnapshotCallback> callback) {
snapshotCallback = std::move(callback);
requestRender();
diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp
index 2039444457..0d614912a9 100644
--- a/platform/android/src/map_renderer.hpp
+++ b/platform/android/src/map_renderer.hpp
@@ -87,6 +87,9 @@ protected:
private:
// Called from the GL Thread //
+ // Resets the renderer
+ void resetRenderer();
+
// Renders a frame.
void render(JNIEnv&);