Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-08-24 01:57:41 +0300
committerDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-08-25 11:15:12 +0300
commit10b22b77e2e6e5ef298fe4b1c58ac1e99ac86083 (patch)
treed6a163911c6867f9e022f609e9f9071eb4ee5d7d /drape_frontend
parent0f11b6d6302f9c4b928e982c2f838f25f676b1c8 (diff)
Filter context dependent messages.
Diffstat (limited to 'drape_frontend')
-rw-r--r--drape_frontend/backend_renderer.cpp7
-rw-r--r--drape_frontend/base_renderer.cpp7
-rw-r--r--drape_frontend/base_renderer.hpp1
-rw-r--r--drape_frontend/drape_engine.cpp15
-rw-r--r--drape_frontend/drape_engine.hpp1
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp91
-rwxr-xr-xdrape_frontend/frontend_renderer.hpp1
-rw-r--r--drape_frontend/message.hpp5
-rw-r--r--drape_frontend/message_acceptor.cpp14
-rw-r--r--drape_frontend/message_acceptor.hpp5
-rw-r--r--drape_frontend/message_queue.cpp13
-rw-r--r--drape_frontend/message_queue.hpp3
-rw-r--r--drape_frontend/message_subclasses.hpp27
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> message)
}
break;
}
+ case Message::MapShapesRecache:
+ {
+ RecacheMapShapes();
+ break;
+ }
case Message::MapShapeReaded:
{
ref_ptr<MapShapeReadedMessage> 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, [&notified] { return notified; });
}
+bool BaseRenderer::FilterGLContextDependentMessage(ref_ptr<Message> 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<bool> m_wasContextReset;
+ bool FilterGLContextDependentMessage(ref_ptr<Message> 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<UpdateMapStyleMessage>(blocker),
+ make_unique_dp<RecoverGLResourcesMessage>(),
MessagePriority::High);
- blocker.Wait();
m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread,
make_unique_dp<GuiLayerLayoutMessage>(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<MapShapesRecacheMessage>(),
+ 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<FrontendRenderer> 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> message)
break;
}
+ case Message::RecoverGLResources:
+ {
+ UpdateGLResources();
+ break;
+ }
+
case Message::UpdateMapStyle:
{
// Clear all graphics.
@@ -576,46 +582,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> 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<CacheRouteSignMessage>(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<CacheRouteSignMessage>(position, false /* isStart */,
- true /* isValid */),
- MessagePriority::High);
- }
-
- auto const & routeData = m_routeRenderer->GetRouteData();
- if (routeData != nullptr)
- {
- auto recacheRouteMsg = make_unique_dp<AddRouteMessage>(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<UpdateReadManagerMessage>(),
- MessagePriority::UberHighSingleton);
-
- m_gpsTrackRenderer->Update();
-
+ UpdateGLResources();
break;
}
@@ -753,6 +720,50 @@ unique_ptr<threads::IRoutine> FrontendRenderer::CreateRoutine()
return make_unique<Routine>(*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<CacheRouteSignMessage>(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<CacheRouteSignMessage>(position, false /* isStart */,
+ true /* isValid */),
+ MessagePriority::High);
+ }
+
+ auto const & routeData = m_routeRenderer->GetRouteData();
+ if (routeData != nullptr)
+ {
+ auto recacheRouteMsg = make_unique_dp<AddRouteMessage>(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<UpdateReadManagerMessage>(),
+ 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> & 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> && 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<bool (ref_ptr<Message>)>;
+ void EnableMessageFiltering(TFilterMessageFn needFilterMessageFn);
+ void DisableMessageFiltering();
+
private:
friend class ThreadsCommutator;
@@ -40,6 +44,7 @@ private:
MessageQueue m_messageQueue;
atomic<bool> 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> && message, MessagePriority pr
CancelWaitImpl();
}
+void MessageQueue::FilterMessages(TFilterMessageFn needFilterMessageFn)
+{
+ lock_guard<mutex> 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<bool (ref_ptr<Message>)>;
+ 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<dp::RenderBucket> && 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<gui::LayerRenderer> && 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<MyPosition> && AcceptShape() { return move(m_shape); }
drape_ptr<SelectionShape> 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<RouteData> && 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<RouteSignData> && 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<GpsTrackRenderData> && AcceptRenderData() { return move(m_renderData); }
private: