diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-08 14:36:59 +0300 |
---|---|---|
committer | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-18 10:07:04 +0300 |
commit | 9ff0b739c8bbdf53aa3369e83f2551288bcb7f1c (patch) | |
tree | 2545f754e02b878642c29db7a3a106ab0686be88 | |
parent | cf0600694f2a8d2d78b3ca10d4b2f60464fbc692 (diff) | |
download | qtlocation-mapboxgl-9ff0b739c8bbdf53aa3369e83f2551288bcb7f1c.tar.gz |
[android] renderer frontend - add mutex to guard update parameters
- solves a bunch of crashes
- solves the flikkering issue when zooming with pinch gestures
-rw-r--r-- | platform/android/src/android_renderer_frontend.cpp | 19 | ||||
-rw-r--r-- | platform/android/src/android_renderer_frontend.hpp | 4 |
2 files changed, 20 insertions, 3 deletions
diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index 443492fae7..fdda8f6f89 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -97,14 +97,27 @@ void AndroidRendererFrontend::setObserver(RendererObserver& observer) { } void AndroidRendererFrontend::update(std::shared_ptr<UpdateParameters> params) { - updateParameters = std::move(params); + { + // Lock on the parameters + std::lock_guard<std::mutex> lock(updateMutex); + updateParameters = std::move(params); + } asyncInvalidate.send(); } // Called on OpenGL thread void AndroidRendererFrontend::render() { assert (glThread); - if (!updateParameters) return; + + std::shared_ptr<UpdateParameters> params; + { + // Lock on the parameters + std::unique_lock<std::mutex> lock(updateMutex); + if (!updateParameters) return; + + // Hold on to the update parameters during render + params = updateParameters; + } // Process the gl thread mailbox glThread->process(); @@ -121,7 +134,7 @@ void AndroidRendererFrontend::render() { framebufferSizeChanged = false; } - glThread->renderer->render(*updateParameters); + glThread->renderer->render(*params); } void AndroidRendererFrontend::onLowMemory() { diff --git a/platform/android/src/android_renderer_frontend.hpp b/platform/android/src/android_renderer_frontend.hpp index 55cbf8c0b1..f2e951bd05 100644 --- a/platform/android/src/android_renderer_frontend.hpp +++ b/platform/android/src/android_renderer_frontend.hpp @@ -67,7 +67,11 @@ private: std::unique_ptr<AndroidRendererBackend> backend; std::unique_ptr<AndroidGLThread> glThread; std::unique_ptr<RendererObserver> rendererObserver; + + std::mutex updateMutex; std::shared_ptr<UpdateParameters> updateParameters; + + util::AsyncTask asyncInvalidate; util::RunLoop* mapRunLoop; |