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:
authorRoman Kuznetsov <r.kuznetsow@gmail.com>2019-05-01 21:42:55 +0300
committerArsentiy Milchakov <milcars@mapswithme.com>2019-05-08 16:49:33 +0300
commitdf88571b71a322745eca23a196b108a15a5b99eb (patch)
tree028058d4cccd40beb334e68304cce91c4dc638d7 /drape_frontend
parentc40f64b1f3210fa70c2c66045f6aa03622217d05 (diff)
[drape] Fixed update map style
Diffstat (limited to 'drape_frontend')
-rw-r--r--drape_frontend/backend_renderer.cpp4
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp10
-rw-r--r--drape_frontend/message.hpp1
-rw-r--r--drape_frontend/message_acceptor.cpp5
-rw-r--r--drape_frontend/message_acceptor.hpp1
-rw-r--r--drape_frontend/message_queue.cpp9
-rw-r--r--drape_frontend/message_queue.hpp1
-rw-r--r--drape_frontend/message_subclasses.hpp6
8 files changed, 35 insertions, 2 deletions
diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp
index bf957a483f..47d7716795 100644
--- a/drape_frontend/backend_renderer.cpp
+++ b/drape_frontend/backend_renderer.cpp
@@ -350,7 +350,9 @@ void BackendRenderer::AcceptMessage(ref_ptr<Message> message)
case Message::Type::SwitchMapStyle:
{
CHECK(m_context != nullptr, ());
- m_texMng->OnSwitchMapStyle(m_context);
+ // For Vulkan rendering it must be done on FR.
+ if (m_context->GetApiVersion() != dp::ApiVersion::Vulkan)
+ m_texMng->OnSwitchMapStyle(m_context);
RecacheMapShapes();
RecacheGui(m_lastWidgetsInfo, false /* needResetOldGui */);
#ifdef RENDER_DEBUG_INFO_LABELS
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp
index 5cbb9d0dd8..c9ea5569b7 100755
--- a/drape_frontend/frontend_renderer.cpp
+++ b/drape_frontend/frontend_renderer.cpp
@@ -686,10 +686,18 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
BaseBlockingMessage::Blocker blocker;
m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread,
make_unique_dp<InvalidateReadManagerRectMessage>(blocker),
- MessagePriority::High);
+ MessagePriority::Normal);
blocker.Wait();
}
+ // Delete all messages which can contain render states (and textures references inside).
+ InstantMessageFilter([](ref_ptr<Message> msg) { return msg->ContainsRenderState(); });
+
+ // For Vulkan rendering textures must be recreated on FR, since they can be in use until
+ // nearest call of BeginRendering.
+ if (m_context->GetApiVersion() == dp::ApiVersion::Vulkan)
+ m_texMng->OnSwitchMapStyle(m_context);
+
// Notify backend renderer and wait for completion.
{
BaseBlockingMessage::Blocker blocker;
diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp
index 1a374fa6c3..25a2d03e7c 100644
--- a/drape_frontend/message.hpp
+++ b/drape_frontend/message.hpp
@@ -103,6 +103,7 @@ public:
virtual ~Message() = default;
virtual Type GetType() const { return Type::Unknown; }
virtual bool IsGraphicsContextDependent() const { return false; }
+ virtual bool ContainsRenderState() const { return false; }
};
enum class MessagePriority
diff --git a/drape_frontend/message_acceptor.cpp b/drape_frontend/message_acceptor.cpp
index 7640c848b4..74532548b6 100644
--- a/drape_frontend/message_acceptor.cpp
+++ b/drape_frontend/message_acceptor.cpp
@@ -31,6 +31,11 @@ void MessageAcceptor::DisableMessageFiltering()
m_messageQueue.DisableMessageFiltering();
}
+void MessageAcceptor::InstantMessageFilter(MessageQueue::FilterMessageFn && filter)
+{
+ m_messageQueue.InstantFilter(std::move(filter));
+}
+
void MessageAcceptor::PostMessage(drape_ptr<Message> && message, MessagePriority priority)
{
m_messageQueue.PushMessage(std::move(message), priority);
diff --git a/drape_frontend/message_acceptor.hpp b/drape_frontend/message_acceptor.hpp
index 0d168e9b7d..9f7b974463 100644
--- a/drape_frontend/message_acceptor.hpp
+++ b/drape_frontend/message_acceptor.hpp
@@ -36,6 +36,7 @@ protected:
void EnableMessageFiltering(MessageQueue::FilterMessageFn && filter);
void DisableMessageFiltering();
+ void InstantMessageFilter(MessageQueue::FilterMessageFn && filter);
private:
friend class ThreadsCommutator;
diff --git a/drape_frontend/message_queue.cpp b/drape_frontend/message_queue.cpp
index 5d6b1c27f8..fa5e1eeb55 100644
--- a/drape_frontend/message_queue.cpp
+++ b/drape_frontend/message_queue.cpp
@@ -125,6 +125,15 @@ void MessageQueue::DisableMessageFiltering()
m_filter = nullptr;
}
+void MessageQueue::InstantFilter(FilterMessageFn && filter)
+{
+ std::lock_guard<std::mutex> lock(m_mutex);
+ CHECK(m_filter == nullptr, ());
+ m_filter = std::move(filter);
+ FilterMessagesImpl();
+ m_filter = nullptr;
+}
+
#ifdef DEBUG_MESSAGE_QUEUE
bool MessageQueue::IsEmpty() const
{
diff --git a/drape_frontend/message_queue.hpp b/drape_frontend/message_queue.hpp
index 7cab89ca78..bdb63429db 100644
--- a/drape_frontend/message_queue.hpp
+++ b/drape_frontend/message_queue.hpp
@@ -29,6 +29,7 @@ public:
using FilterMessageFn = std::function<bool(ref_ptr<Message>)>;
void EnableMessageFiltering(FilterMessageFn && filter);
void DisableMessageFiltering();
+ void InstantFilter(FilterMessageFn && filter);
#ifdef DEBUG_MESSAGE_QUEUE
bool IsEmpty() const;
diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp
index 7d5368e400..3b39737f1b 100644
--- a/drape_frontend/message_subclasses.hpp
+++ b/drape_frontend/message_subclasses.hpp
@@ -132,6 +132,7 @@ public:
Type GetType() const override { return Type::FlushTile; }
bool IsGraphicsContextDependent() const override { return true; }
+ bool ContainsRenderState() const override { return true; }
dp::RenderState const & GetState() const { return m_state; }
drape_ptr<dp::RenderBucket> && AcceptBuffer() { return std::move(m_buffer); }
@@ -149,6 +150,7 @@ public:
Type GetType() const override { return MessageType; }
bool IsGraphicsContextDependent() const override { return true; }
+ bool ContainsRenderState() const override { return true; }
RenderDataType && AcceptRenderData() { return std::move(m_data); }
@@ -302,6 +304,7 @@ public:
Type GetType() const override { return Type::GuiLayerRecached; }
bool IsGraphicsContextDependent() const override { return true; }
+ bool ContainsRenderState() const override { return true; }
drape_ptr<gui::LayerRenderer> && AcceptRenderer() { return std::move(m_renderer); }
bool NeedResetOldGui() const { return m_needResetOldGui; }
@@ -1142,6 +1145,9 @@ public:
Type GetType() const override { return Type::DrapeApiFlush; }
+ bool IsGraphicsContextDependent() const override { return true; }
+ bool ContainsRenderState() const override { return true; }
+
TProperties && AcceptProperties() { return std::move(m_properties); }
private: