From bf95fc2419c7fddf557de3ac4a9c4ee5327f4bb2 Mon Sep 17 00:00:00 2001 From: Mark Tehver Date: Wed, 11 Oct 2017 15:17:26 +0300 Subject: [PATCH] Fixed MapRenderer.captureRendering sometimes failing to respond due to internal synchronisation issues --- all/native/renderers/MapRenderer.cpp | 11 +++++++++-- all/native/renderers/MapRenderer.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/all/native/renderers/MapRenderer.cpp b/all/native/renderers/MapRenderer.cpp index 2d210f68d..8ba92efaa 100644 --- a/all/native/renderers/MapRenderer.cpp +++ b/all/native/renderers/MapRenderer.cpp @@ -596,7 +596,7 @@ namespace carto { } handleRenderThreadCallbacks(); - handleRenderCaptureCallbacks(); + handleRendererCaptureCallbacks(); // Call listener to inform we are idle now, if no redraw request is pending if (!_redrawPending) { @@ -819,7 +819,7 @@ namespace carto { } } - void MapRenderer::handleRenderCaptureCallbacks() { + void MapRenderer::handleRendererCaptureCallbacks() { int width, height; { std::lock_guard lock(_mutex); @@ -833,6 +833,8 @@ namespace carto { std::lock_guard lock(_rendererCaptureListenersMutex); _rendererCaptureListeners.swap(rendererCaptureListeners); } + + bool callbacksPending = false; for (std::size_t i = 0; i < rendererCaptureListeners.size(); i++) { const DirectorPtr& listener = rendererCaptureListeners[i].first; bool waitWhileUpdating = rendererCaptureListeners[i].second; @@ -845,7 +847,9 @@ namespace carto { } } if (_redrawPending || layersUpdating || !_cullWorker->isIdle() || !_billboardPlacementWorker->isIdle()) { + std::lock_guard lock(_rendererCaptureListenersMutex); _rendererCaptureListeners.push_back(rendererCaptureListeners[i]); + callbacksPending = true; continue; } } @@ -858,6 +862,9 @@ namespace carto { listener->onMapRendered(captureBitmap); } + if (callbacksPending) { + requestRedraw(); + } } MapRenderer::OptionsListener::OptionsListener(const std::shared_ptr& mapRenderer) : _mapRenderer(mapRenderer) diff --git a/all/native/renderers/MapRenderer.h b/all/native/renderers/MapRenderer.h index 1ffca0566..af98ca26c 100644 --- a/all/native/renderers/MapRenderer.h +++ b/all/native/renderers/MapRenderer.h @@ -169,7 +169,7 @@ namespace carto { void drawLayers(float deltaSeconds, const ViewState& viewState); void handleRenderThreadCallbacks(); - void handleRenderCaptureCallbacks(); + void handleRendererCaptureCallbacks(); static const int BILLBOARD_PLACEMENT_TASK_DELAY;