summaryrefslogtreecommitdiff
path: root/platform/android/src/map_renderer.cpp
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2019-02-14 11:12:02 +0200
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2019-02-14 13:58:03 +0200
commit3802f7e922e16a18c75d66aa615094f4c62fd0b1 (patch)
tree1c3e74fcaf47ff42a023503a28503051aef11aa0 /platform/android/src/map_renderer.cpp
parentceea900578d8f31497810ef19aa7c17669e40722 (diff)
downloadqtlocation-mapboxgl-3802f7e922e16a18c75d66aa615094f4c62fd0b1.tar.gz
[android] hook into surface holder to cleanup renderer on the right thread before the surface is destroyed
Diffstat (limited to 'platform/android/src/map_renderer.cpp')
-rw-r--r--platform/android/src/map_renderer.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp
index e9eb82864d..cff021afd2 100644
--- a/platform/android/src/map_renderer.cpp
+++ b/platform/android/src/map_renderer.cpp
@@ -33,9 +33,12 @@ MapRenderer::~MapRenderer() = default;
void MapRenderer::reset() {
destroyed = true;
- // Make sure to destroy the renderer on the GL Thread
- auto self = ActorRef<MapRenderer>(*this, mailbox);
- self.ask(&MapRenderer::resetRenderer).wait();
+
+ if (renderer) {
+ // 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);
@@ -113,7 +116,6 @@ void MapRenderer::requestSnapshot(SnapshotCallback callback) {
// Called on OpenGL thread //
void MapRenderer::resetRenderer() {
- assert (renderer);
renderer.reset();
}
@@ -188,6 +190,12 @@ void MapRenderer::onSurfaceChanged(JNIEnv&, jint width, jint height) {
requestRender();
}
+void MapRenderer::onSurfaceDestroyed(JNIEnv&) {
+ // Make sure to destroy the renderer on the GL Thread
+ auto self = ActorRef<MapRenderer>(*this, mailbox);
+ self.ask(&MapRenderer::resetRenderer).wait();
+}
+
// Static methods //
void MapRenderer::registerNative(jni::JNIEnv& env) {
@@ -204,7 +212,9 @@ void MapRenderer::registerNative(jni::JNIEnv& env) {
METHOD(&MapRenderer::onSurfaceCreated,
"nativeOnSurfaceCreated"),
METHOD(&MapRenderer::onSurfaceChanged,
- "nativeOnSurfaceChanged"));
+ "nativeOnSurfaceChanged"),
+ METHOD(&MapRenderer::onSurfaceDestroyed,
+ "nativeOnSurfaceDestroyed"));
}
MapRenderer& MapRenderer::getNativePeer(JNIEnv& env, const jni::Object<MapRenderer>& jObject) {