From bb5b8d39a3cfafb98b46f180492698a195083aaa Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 12 Mar 2015 16:52:18 +0300 Subject: [PATCH] Added priorities for messages --- drape_frontend/backend_renderer.cpp | 4 ++-- drape_frontend/drape_engine.cpp | 21 ++++++++++++++++----- drape_frontend/drape_engine.hpp | 2 ++ drape_frontend/engine_context.cpp | 10 +++++----- drape_frontend/engine_context.hpp | 3 ++- drape_frontend/frontend_renderer.cpp | 14 ++++++++++---- drape_frontend/frontend_renderer.hpp | 2 ++ drape_frontend/message.hpp | 9 ++++++++- drape_frontend/message_acceptor.cpp | 4 ++-- drape_frontend/message_acceptor.hpp | 2 +- drape_frontend/message_queue.cpp | 18 ++++++++++++++++-- drape_frontend/message_queue.hpp | 6 +++--- drape_frontend/message_subclasses.hpp | 14 ++++++++++++++ drape_frontend/threads_commutator.cpp | 12 ++++++++++-- drape_frontend/threads_commutator.hpp | 6 ++++-- 15 files changed, 97 insertions(+), 30 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 5f891124b0..6b93dac786 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -64,7 +64,7 @@ void BackendRenderer::AcceptMessage(dp::RefPointer message) df::Viewport const & v = msg->GetViewport(); m_guiCacher.Resize(v.GetWidth(), v.GetHeight()); GuiLayerRecachedMessage * outputMsg = new GuiLayerRecachedMessage(m_guiCacher.Recache(m_texturesManager)); - m_commutator->PostMessage(ThreadsCommutator::RenderThread, dp::MovePointer(outputMsg)); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, dp::MovePointer(outputMsg), MessagePriority::High); break; } case Message::InvalidateReadManagerRect: @@ -161,7 +161,7 @@ void BackendRenderer::InitGLDependentResource() void BackendRenderer::FlushGeometry(dp::TransferPointer message) { GLFunctions::glFlush(); - m_commutator->PostMessage(ThreadsCommutator::RenderThread, message); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, message, MessagePriority::Normal); } } // namespace df diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index a7cf5f99a5..fae3ef30fc 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -60,31 +60,42 @@ void DrapeEngine::Resize(int w, int h) m_viewport.SetViewport(0, 0, w, h); m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - dp::MovePointer(new ResizeMessage(m_viewport))); + dp::MovePointer(new ResizeMessage(m_viewport)), + MessagePriority::High); } void DrapeEngine::UpdateCoverage(ScreenBase const & screen) { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - dp::MovePointer(new UpdateModelViewMessage(screen))); + dp::MovePointer(new UpdateModelViewMessage(screen)), + MessagePriority::Normal); } void DrapeEngine::ClearUserMarksLayer(df::TileKey const & tileKey) { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - dp::MovePointer(new ClearUserMarkLayerMessage(tileKey))); + dp::MovePointer(new ClearUserMarkLayerMessage(tileKey)), + MessagePriority::Normal); } void DrapeEngine::ChangeVisibilityUserMarksLayer(TileKey const & tileKey, bool isVisible) { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - dp::MovePointer(new ChangeUserMarkLayerVisibilityMessage(tileKey, isVisible))); + dp::MovePointer(new ChangeUserMarkLayerVisibilityMessage(tileKey, isVisible)), + MessagePriority::Normal); } void DrapeEngine::UpdateUserMarksLayer(TileKey const & tileKey, UserMarksProvider * provider) { m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - dp::MovePointer(new UpdateUserMarkLayerMessage(tileKey, provider))); + dp::MovePointer(new UpdateUserMarkLayerMessage(tileKey, provider)), + MessagePriority::Normal); +} + +void DrapeEngine::SetRenderingEnabled(bool const isEnabled) +{ + m_threadCommutator->PostMessageBroadcast(dp::MovePointer(new RenderingEnabledMessage(isEnabled)), + MessagePriority::High); } } // namespace df diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 9c1d041733..e38eba25ac 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -34,6 +34,8 @@ public: void ChangeVisibilityUserMarksLayer(TileKey const & tileKey, bool isVisible); void UpdateUserMarksLayer(TileKey const & tileKey, UserMarksProvider * provider); + void SetRenderingEnabled(bool const isEnabled); + private: dp::MasterPointer m_frontend; dp::MasterPointer m_backend; diff --git a/drape_frontend/engine_context.cpp b/drape_frontend/engine_context.cpp index 7c44cd90bd..9ffb49d12d 100644 --- a/drape_frontend/engine_context.cpp +++ b/drape_frontend/engine_context.cpp @@ -21,12 +21,12 @@ EngineContext::EngineContext(dp::RefPointer commutator) void EngineContext::BeginReadTile(TileKey const & key) { - PostMessage(new TileReadStartMessage(key)); + PostMessage(new TileReadStartMessage(key), MessagePriority::Normal); } void EngineContext::InsertShape(TileKey const & key, dp::TransferPointer shape) { - PostMessage(new MapShapeReadedMessage(key, shape)); + PostMessage(new MapShapeReadedMessage(key, shape), MessagePriority::Normal); } void EngineContext::EndReadTile(TileKey const & key) @@ -63,12 +63,12 @@ void EngineContext::EndReadTile(TileKey const & key) InsertShape(key, dp::MovePointer(new TextShape(r.Center(), tp))); #endif - PostMessage(new TileReadEndMessage(key)); + PostMessage(new TileReadEndMessage(key), MessagePriority::Normal); } -void EngineContext::PostMessage(Message * message) +void EngineContext::PostMessage(Message * message, MessagePriority priority) { - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, dp::MovePointer(message)); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, dp::MovePointer(message), priority); } } // namespace df diff --git a/drape_frontend/engine_context.hpp b/drape_frontend/engine_context.hpp index e1c338899d..436daf920d 100644 --- a/drape_frontend/engine_context.hpp +++ b/drape_frontend/engine_context.hpp @@ -8,6 +8,7 @@ namespace df { class Message; +enum class MessagePriority; class MapShape; struct TileKey; @@ -23,7 +24,7 @@ public: void EndReadTile(TileKey const & key); private: - void PostMessage(Message * message); + void PostMessage(Message * message, MessagePriority priority); private: dp::RefPointer m_commutator; diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 24ca739c03..d73e350d86 100644 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -41,6 +41,7 @@ FrontendRenderer::FrontendRenderer(dp::RefPointer commutator, , m_textureManager(textureManager) , m_gpuProgramManager(new dp::GpuProgramManager()) , m_viewport(viewport) + , m_isEnabled(true) { #ifdef DRAW_INFO m_tpf = 0,0; @@ -153,9 +154,11 @@ void FrontendRenderer::AcceptMessage(dp::RefPointer message) RefreshModelView(); ResolveTileKeys(); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - dp::MovePointer(new ResizeMessage(m_viewport))); + dp::MovePointer(new ResizeMessage(m_viewport)), + MessagePriority::Normal); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles))); + dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles)), + MessagePriority::Normal); break; } @@ -166,7 +169,8 @@ void FrontendRenderer::AcceptMessage(dp::RefPointer message) RefreshModelView(); ResolveTileKeys(); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles))); + dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles)), + MessagePriority::Normal); break; } @@ -179,7 +183,9 @@ void FrontendRenderer::AcceptMessage(dp::RefPointer message) InvalidateRenderGroups(keyStorage); Message * msgToBackend = new InvalidateReadManagerRectMessage(keyStorage); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, dp::MovePointer(msgToBackend)); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + dp::MovePointer(msgToBackend), + MessagePriority::Normal); break; } diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index a3da83a055..b8ee8b6c37 100644 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -112,6 +112,8 @@ private: set m_tiles; dp::OverlayTree m_overlayTree; + + bool m_isEnabled; }; } // namespace df diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index ec801e51e1..36adedd32c 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -21,11 +21,18 @@ public: ClearUserMarkLayer, ChangeUserMarkLayerVisibility, UpdateUserMarkLayer, - GuiLayerRecached + GuiLayerRecached, + RenderingEnabled }; virtual ~Message() {} virtual Type GetType() const { return Unknown; } }; +enum class MessagePriority +{ + Normal, + High +}; + } // namespace df diff --git a/drape_frontend/message_acceptor.cpp b/drape_frontend/message_acceptor.cpp index e11e38e7c2..b70b4d6b60 100644 --- a/drape_frontend/message_acceptor.cpp +++ b/drape_frontend/message_acceptor.cpp @@ -16,9 +16,9 @@ void MessageAcceptor::ProcessSingleMessage(unsigned maxTimeWait) message.Destroy(); } -void MessageAcceptor::PostMessage(dp::TransferPointer message) +void MessageAcceptor::PostMessage(dp::TransferPointer message, MessagePriority priority) { - m_messageQueue.PushMessage(message); + m_messageQueue.PushMessage(message, priority); } void MessageAcceptor::CloseQueue() diff --git a/drape_frontend/message_acceptor.hpp b/drape_frontend/message_acceptor.hpp index 262818035b..44fca73a14 100644 --- a/drape_frontend/message_acceptor.hpp +++ b/drape_frontend/message_acceptor.hpp @@ -24,7 +24,7 @@ protected: private: friend class ThreadsCommutator; - void PostMessage(dp::TransferPointer message); + void PostMessage(dp::TransferPointer message, MessagePriority priority); private: MessageQueue m_messageQueue; diff --git a/drape_frontend/message_queue.cpp b/drape_frontend/message_queue.cpp index 65e6bfa3b0..d67b4c68f9 100644 --- a/drape_frontend/message_queue.cpp +++ b/drape_frontend/message_queue.cpp @@ -28,12 +28,26 @@ dp::TransferPointer MessageQueue::PopMessage(unsigned maxTimeWait) return msg.Move(); } -void MessageQueue::PushMessage(dp::TransferPointer message) +void MessageQueue::PushMessage(dp::TransferPointer message, MessagePriority priority) { threads::ConditionGuard guard(m_condition); bool wasEmpty = m_messages.empty(); - m_messages.push_back(dp::MasterPointer(message)); + switch (priority) + { + case MessagePriority::Normal: + { + m_messages.push_back(dp::MasterPointer(message)); + break; + } + case MessagePriority::High: + { + m_messages.insert(m_messages.begin(), dp::MasterPointer(message)); + break; + } + default: + ASSERT(false, ("Unknown message priority type")); + } if (wasEmpty) guard.Signal(); diff --git a/drape_frontend/message_queue.hpp b/drape_frontend/message_queue.hpp index d1044a0a55..edf2485c3b 100644 --- a/drape_frontend/message_queue.hpp +++ b/drape_frontend/message_queue.hpp @@ -6,7 +6,7 @@ #include "base/condition.hpp" -#include "std/list.hpp" +#include "std/deque.hpp" namespace df { @@ -18,7 +18,7 @@ public: /// if queue is empty than return NULL dp::TransferPointer PopMessage(unsigned maxTimeWait); - void PushMessage(dp::TransferPointer message); + void PushMessage(dp::TransferPointer message, MessagePriority priority); void CancelWait(); void ClearQuery(); @@ -27,7 +27,7 @@ private: private: threads::Condition m_condition; - list > m_messages; + deque > m_messages; }; } // namespace df diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index bb2d2dfe0d..71469e0c9b 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -237,4 +237,18 @@ private: dp::TransferPointer m_renderer; }; +class RenderingEnabledMessage : public Message +{ +public: + RenderingEnabledMessage(bool const isEnabled) + : m_isEnabled(isEnabled) {} + + Type GetType() const override { return Message::RenderingEnabled; } + + bool isSuspended() const { return m_isEnabled; } + +private: + bool m_isEnabled; +}; + } // namespace df diff --git a/drape_frontend/threads_commutator.cpp b/drape_frontend/threads_commutator.cpp index 640b5f46f1..d1f55e1f32 100644 --- a/drape_frontend/threads_commutator.cpp +++ b/drape_frontend/threads_commutator.cpp @@ -12,12 +12,20 @@ void ThreadsCommutator::RegisterThread(ThreadName name, MessageAcceptor * accept VERIFY(m_acceptors.insert(make_pair(name, acceptor)).second, ()); } -void ThreadsCommutator::PostMessage(ThreadName name, dp::TransferPointer message) +void ThreadsCommutator::PostMessage(ThreadName name, dp::TransferPointer message, MessagePriority priority) { acceptors_map_t::iterator it = m_acceptors.find(name); ASSERT(it != m_acceptors.end(), ()); if (it != m_acceptors.end()) - it->second->PostMessage(message); + it->second->PostMessage(message, priority); +} + +void ThreadsCommutator::PostMessageBroadcast(dp::TransferPointer message, MessagePriority priority) +{ + for (auto it = m_acceptors.cbegin(); it != m_acceptors.cend(); ++it) + { + it->second->PostMessage(message, priority); + } } } // namespace df diff --git a/drape_frontend/threads_commutator.hpp b/drape_frontend/threads_commutator.hpp index 61658aa926..f792603655 100644 --- a/drape_frontend/threads_commutator.hpp +++ b/drape_frontend/threads_commutator.hpp @@ -7,6 +7,7 @@ namespace df { class Message; +enum class MessagePriority; class MessageAcceptor; class ThreadsCommutator @@ -19,11 +20,12 @@ public: }; void RegisterThread(ThreadName name, MessageAcceptor *acceptor); - void PostMessage(ThreadName name, dp::TransferPointer message); + void PostMessage(ThreadName name, dp::TransferPointer message, MessagePriority priority); + void PostMessageBroadcast(dp::TransferPointer message, MessagePriority priority); private: typedef map acceptors_map_t; - acceptors_map_t m_acceptors; + acceptors_map_t m_acceptors; }; } // namespace df