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-13 14:37:11 +0300 |
commit | b186d61d927083be83882b1d1a33eedc64c58d90 (patch) | |
tree | 02103cc7d16d5f60fa37aabb1555dde3ba658eb1 | |
parent | bcaf2f886c86fccd70f3949e7c75bc6c6b7e3e97 (diff) | |
download | qtlocation-mapboxgl-b186d61d927083be83882b1d1a33eedc64c58d90.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 73cb0a817e..6ad7872f89 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -98,14 +98,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 (renderer); - 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; + } // Activate the backend BackendScope backendGuard { *backend }; @@ -122,7 +135,7 @@ void AndroidRendererFrontend::render() { framebufferSizeChanged = false; } - rendererGuard.object().render(*updateParameters); + rendererGuard.object().render(*params); } void AndroidRendererFrontend::onLowMemory() { diff --git a/platform/android/src/android_renderer_frontend.hpp b/platform/android/src/android_renderer_frontend.hpp index ca7c27b196..36db705f2e 100644 --- a/platform/android/src/android_renderer_frontend.hpp +++ b/platform/android/src/android_renderer_frontend.hpp @@ -70,7 +70,11 @@ private: std::unique_ptr<AndroidRendererBackend> backend; std::unique_ptr<util::Thread<Renderer>> renderer; std::unique_ptr<RendererObserver> rendererObserver; + + std::mutex updateMutex; std::shared_ptr<UpdateParameters> updateParameters; + + util::AsyncTask asyncInvalidate; util::RunLoop* mapRunLoop; |