From 10b22b77e2e6e5ef298fe4b1c58ac1e99ac86083 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 24 Aug 2016 01:57:41 +0300 Subject: [PATCH] Filter context dependent messages. --- drape_frontend/backend_renderer.cpp | 7 ++- drape_frontend/base_renderer.cpp | 7 +++ drape_frontend/base_renderer.hpp | 1 + drape_frontend/drape_engine.cpp | 15 ++++- drape_frontend/drape_engine.hpp | 1 + drape_frontend/frontend_renderer.cpp | 91 +++++++++++++++------------ drape_frontend/frontend_renderer.hpp | 1 + drape_frontend/message.hpp | 5 +- drape_frontend/message_acceptor.cpp | 14 +++++ drape_frontend/message_acceptor.hpp | 5 ++ drape_frontend/message_queue.cpp | 13 ++++ drape_frontend/message_queue.hpp | 3 + drape_frontend/message_subclasses.hpp | 27 ++++++++ 13 files changed, 145 insertions(+), 45 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index b959923619..eba5ceb3bb 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -176,6 +176,11 @@ void BackendRenderer::AcceptMessage(ref_ptr message) } break; } + case Message::MapShapesRecache: + { + RecacheMapShapes(); + break; + } case Message::MapShapeReaded: { ref_ptr msg = message; @@ -374,7 +379,7 @@ void BackendRenderer::InitGLDependentResource() m_texMng->Init(params); - RecacheMapShapes(); + //RecacheMapShapes(); } void BackendRenderer::RecacheMapShapes() diff --git a/drape_frontend/base_renderer.cpp b/drape_frontend/base_renderer.cpp index 725c43b7a5..c751902de6 100644 --- a/drape_frontend/base_renderer.cpp +++ b/drape_frontend/base_renderer.cpp @@ -92,6 +92,11 @@ void BaseRenderer::SetRenderingEnabled(bool const isEnabled) completionCondition.wait(lock, [¬ified] { return notified; }); } +bool BaseRenderer::FilterGLContextDependentMessage(ref_ptr msg) +{ + return msg->IsGLContextDependent(); +} + void BaseRenderer::CheckRenderingEnabled() { if (!m_isEnabled) @@ -100,6 +105,7 @@ void BaseRenderer::CheckRenderingEnabled() if (m_wasContextReset) { + EnableMessageFiltering(bind(&BaseRenderer::FilterGLContextDependentMessage, this, _1)); OnContextDestroy(); } else @@ -124,6 +130,7 @@ void BaseRenderer::CheckRenderingEnabled() if (m_wasContextReset) { m_wasContextReset = false; + DisableMessageFiltering(); OnContextCreate(); } else diff --git a/drape_frontend/base_renderer.hpp b/drape_frontend/base_renderer.hpp index d0e446d7c3..b56a9c21a8 100644 --- a/drape_frontend/base_renderer.hpp +++ b/drape_frontend/base_renderer.hpp @@ -74,6 +74,7 @@ private: atomic m_wasContextReset; + bool FilterGLContextDependentMessage(ref_ptr msg); void SetRenderingEnabled(bool const isEnabled); void Notify(); void WakeUp(); diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 5b2d4be1dc..b0413f6359 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -68,6 +68,7 @@ DrapeEngine::DrapeEngine(Params && params) m_widgetsInfo = move(params.m_info); RecacheGui(false); + RecacheMapShapes(); if (params.m_showChoosePositionMark) EnableChoosePositionMode(true, move(params.m_boundAreaTriangles), false, m2::PointD()); @@ -97,16 +98,17 @@ void DrapeEngine::Update(int w, int h) LOG(LWARNING, (w, h)); RecacheGui(false); + RecacheMapShapes(); - UpdateMapStyleMessage::Blocker blocker; m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(blocker), + make_unique_dp(), MessagePriority::High); - blocker.Wait(); m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(m_widgetsLayout), MessagePriority::Normal); + + ResizeImpl(w, h); } @@ -213,6 +215,13 @@ void DrapeEngine::UpdateMapStyle() } } +void DrapeEngine::RecacheMapShapes() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(), + MessagePriority::Normal); +} + void DrapeEngine::RecacheGui(bool needResetOldGui) { m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 2b64b79eaf..d887b2b974 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -169,6 +169,7 @@ private: void ResizeImpl(int w, int h); void RecacheGui(bool needResetOldGui); + void RecacheMapShapes(); private: drape_ptr m_frontend; diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index dbf559fbb0..9754984a18 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -549,6 +549,12 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) break; } + case Message::RecoverGLResources: + { + UpdateGLResources(); + break; + } + case Message::UpdateMapStyle: { // Clear all graphics. @@ -576,46 +582,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) blocker.Wait(); } - // Invalidate route. - if (m_routeRenderer->GetStartPoint()) - { - m2::PointD const & position = m_routeRenderer->GetStartPoint()->m_position; - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(position, true /* isStart */, - true /* isValid */), - MessagePriority::High); - } - if (m_routeRenderer->GetFinishPoint()) - { - m2::PointD const & position = m_routeRenderer->GetFinishPoint()->m_position; - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(position, false /* isStart */, - true /* isValid */), - MessagePriority::High); - } - - auto const & routeData = m_routeRenderer->GetRouteData(); - if (routeData != nullptr) - { - auto recacheRouteMsg = make_unique_dp(routeData->m_sourcePolyline, - routeData->m_sourceTurns, - routeData->m_color, - routeData->m_pattern); - m_routeRenderer->Clear(true /* keepDistanceFromBegin */); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, move(recacheRouteMsg), - MessagePriority::Normal); - } - - // Request new tiles. - ScreenBase screen = m_userEventStream.GetCurrentScreen(); - m_lastReadedModelView = screen; - m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), ResolveTileKeys(screen)); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(), - MessagePriority::UberHighSingleton); - - m_gpsTrackRenderer->Update(); - + UpdateGLResources(); break; } @@ -753,6 +720,50 @@ unique_ptr FrontendRenderer::CreateRoutine() return make_unique(*this); } +void FrontendRenderer::UpdateGLResources() +{ + // Invalidate route. + if (m_routeRenderer->GetStartPoint()) + { + m2::PointD const & position = m_routeRenderer->GetStartPoint()->m_position; + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(position, true /* isStart */, + true /* isValid */), + MessagePriority::High); + } + + if (m_routeRenderer->GetFinishPoint()) + { + m2::PointD const & position = m_routeRenderer->GetFinishPoint()->m_position; + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(position, false /* isStart */, + true /* isValid */), + MessagePriority::High); + } + + auto const & routeData = m_routeRenderer->GetRouteData(); + if (routeData != nullptr) + { + auto recacheRouteMsg = make_unique_dp(routeData->m_sourcePolyline, + routeData->m_sourceTurns, + routeData->m_color, + routeData->m_pattern); + m_routeRenderer->Clear(true /* keepDistanceFromBegin */); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, move(recacheRouteMsg), + MessagePriority::Normal); + } + + // Request new tiles. + ScreenBase screen = m_userEventStream.GetCurrentScreen(); + m_lastReadedModelView = screen; + m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), ResolveTileKeys(screen)); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(), + MessagePriority::UberHighSingleton); + + m_gpsTrackRenderer->Update(); +} + void FrontendRenderer::FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom) { diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 54267771ce..6152e408f1 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -215,6 +215,7 @@ private: }; void ReleaseResources(); + void UpdateGLResources(); void BeginUpdateOverlayTree(ScreenBase const & modelView); void UpdateOverlayTree(ScreenBase const & modelView, drape_ptr & renderGroup); diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index 7319c255b6..bdc97bc437 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -26,6 +26,7 @@ public: GuiLayerRecached, GuiRecache, GuiLayerLayout, + MapShapesRecache, MapShapes, ChangeMyPostitionMode, CompassInfo, @@ -60,11 +61,13 @@ public: SetAddNewPlaceMode, SetDisplacementMode, AllowAutoZoom, - RequestSymbolsSize + RequestSymbolsSize, + RecoverGLResources }; virtual ~Message() {} virtual Type GetType() const { return Unknown; } + virtual bool IsGLContextDependent() const { return false; } }; enum class MessagePriority diff --git a/drape_frontend/message_acceptor.cpp b/drape_frontend/message_acceptor.cpp index 322b6158c4..db070f5790 100644 --- a/drape_frontend/message_acceptor.cpp +++ b/drape_frontend/message_acceptor.cpp @@ -23,8 +23,22 @@ bool MessageAcceptor::ProcessSingleMessage(bool waitForMessage) return true; } +void MessageAcceptor::EnableMessageFiltering(TFilterMessageFn needFilterMessageFn) +{ + m_needFilterMessageFn = needFilterMessageFn; + m_messageQueue.FilterMessages(needFilterMessageFn); +} + +void MessageAcceptor::DisableMessageFiltering() +{ + m_needFilterMessageFn = nullptr; +} + void MessageAcceptor::PostMessage(drape_ptr && message, MessagePriority priority) { + if (m_needFilterMessageFn != nullptr && m_needFilterMessageFn(make_ref(message))) + return; + m_messageQueue.PushMessage(move(message), priority); } diff --git a/drape_frontend/message_acceptor.hpp b/drape_frontend/message_acceptor.hpp index 24ab837497..d2e2f14e86 100644 --- a/drape_frontend/message_acceptor.hpp +++ b/drape_frontend/message_acceptor.hpp @@ -33,6 +33,10 @@ protected: size_t GetQueueSize() const; #endif + using TFilterMessageFn = function)>; + void EnableMessageFiltering(TFilterMessageFn needFilterMessageFn); + void DisableMessageFiltering(); + private: friend class ThreadsCommutator; @@ -40,6 +44,7 @@ private: MessageQueue m_messageQueue; atomic m_infinityWaiting; + TFilterMessageFn m_needFilterMessageFn; }; } // namespace df diff --git a/drape_frontend/message_queue.cpp b/drape_frontend/message_queue.cpp index 69f9edbdc3..ff7595c8c9 100644 --- a/drape_frontend/message_queue.cpp +++ b/drape_frontend/message_queue.cpp @@ -80,6 +80,19 @@ void MessageQueue::PushMessage(drape_ptr && message, MessagePriority pr CancelWaitImpl(); } +void MessageQueue::FilterMessages(TFilterMessageFn needFilterMessageFn) +{ + lock_guard lock(m_mutex); + auto iter = m_messages.begin(); + while (iter != m_messages.end()) + { + if (needFilterMessageFn(make_ref(iter->first))) + iter = m_messages.erase(iter); + else + ++iter; + } +} + #ifdef DEBUG_MESSAGE_QUEUE bool MessageQueue::IsEmpty() const diff --git a/drape_frontend/message_queue.hpp b/drape_frontend/message_queue.hpp index 2562d4954c..6caaa1f292 100644 --- a/drape_frontend/message_queue.hpp +++ b/drape_frontend/message_queue.hpp @@ -27,6 +27,9 @@ public: void CancelWait(); void ClearQuery(); + using TFilterMessageFn = function)>; + void FilterMessages(TFilterMessageFn needFilterMessageFn); + #ifdef DEBUG_MESSAGE_QUEUE bool IsEmpty() const; size_t GetSize() const; diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index a8bfb5b336..5fc9412856 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -121,6 +121,7 @@ public: {} Type GetType() const override { return Message::FlushTile; } + bool IsGLContextDependent() const override { return true; } dp::GLState const & GetState() const { return m_state; } drape_ptr && AcceptBuffer() { return move(m_buffer); } @@ -136,6 +137,8 @@ public: FlushOverlaysMessage(TOverlaysRenderData && data) : m_data(move(data)) {} Type GetType() const override { return Message::FlushOverlays; } + bool IsGLContextDependent() const override { return true; } + TOverlaysRenderData && AcceptRenderData() { return move(m_data); } private: @@ -265,6 +268,7 @@ public: {} Type GetType() const override { return Message::GuiLayerRecached; } + bool IsGLContextDependent() const override { return true; } drape_ptr && AcceptRenderer() { return move(m_renderer); } bool NeedResetOldGui() const { return m_needResetOldGui; } @@ -292,6 +296,14 @@ private: bool const m_needResetOldGui; }; +class MapShapesRecacheMessage : public Message +{ +public: + MapShapesRecacheMessage() = default; + + Type GetType() const override { return Message::MapShapesRecache; } +}; + class GuiLayerLayoutMessage : public Message { public: @@ -380,6 +392,7 @@ public: {} Type GetType() const override { return Message::MapShapes; } + bool IsGLContextDependent() const override { return true; } drape_ptr && AcceptShape() { return move(m_shape); } drape_ptr AcceptSelection() { return move(m_selection); } @@ -630,6 +643,8 @@ public: {} Type GetType() const override { return Message::FlushRoute; } + bool IsGLContextDependent() const override { return true; } + drape_ptr && AcceptRouteData() { return move(m_routeData); } private: @@ -658,6 +673,8 @@ public: {} Type GetType() const override { return Message::FlushRouteSign; } + bool IsGLContextDependent() const override { return true; } + drape_ptr && AcceptRouteSignData() { return move(m_routeSignData); } private: @@ -712,6 +729,14 @@ public: Type GetType() const override { return Message::Invalidate; } }; +class RecoverGLResourcesMessage : public Message +{ +public: + RecoverGLResourcesMessage(){} + + Type GetType() const override { return Message::RecoverGLResources; } +}; + class DeactivateRouteFollowingMessage : public Message { public: @@ -792,6 +817,8 @@ public: {} Type GetType() const override { return Message::FlushGpsTrackPoints; } + bool IsGLContextDependent() const override { return true; } + drape_ptr && AcceptRenderData() { return move(m_renderData); } private: