summaryrefslogtreecommitdiff
path: root/platform/qt/src/qmapboxgl_map_renderer.cpp
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <tmpsantos@gmail.com>2018-01-25 02:19:36 +0200
committerThiago Marcos P. Santos <tmpsantos@gmail.com>2018-02-09 20:28:54 +0200
commitbb00f558fb31f000eefa1bb825bb580445cedc10 (patch)
treed16f76e2a2b96f23133ca0b0edaf24031416da80 /platform/qt/src/qmapboxgl_map_renderer.cpp
parenta062f3e17b6f42252a283b50bd36de3411571b7d (diff)
downloadqtlocation-mapboxgl-bb00f558fb31f000eefa1bb825bb580445cedc10.tar.gz
[qt] Make MapboxGLMapRenderer a scheduler to receive messages when rendering
Diffstat (limited to 'platform/qt/src/qmapboxgl_map_renderer.cpp')
-rw-r--r--platform/qt/src/qmapboxgl_map_renderer.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/platform/qt/src/qmapboxgl_map_renderer.cpp b/platform/qt/src/qmapboxgl_map_renderer.cpp
index a343d56668..65fb37f094 100644
--- a/platform/qt/src/qmapboxgl_map_renderer.cpp
+++ b/platform/qt/src/qmapboxgl_map_renderer.cpp
@@ -12,6 +12,12 @@ QMapboxGLMapRenderer::~QMapboxGLMapRenderer()
{
}
+void QMapboxGLMapRenderer::schedule(std::weak_ptr<mbgl::Mailbox> mailbox)
+{
+ std::lock_guard<std::mutex> lock(m_taskQueueMutex);
+ m_taskQueue.push(mailbox);
+}
+
void QMapboxGLMapRenderer::updateParameters(std::shared_ptr<mbgl::UpdateParameters> newParameters)
{
std::lock_guard<std::mutex> lock(m_updateMutex);
@@ -29,8 +35,11 @@ void QMapboxGLMapRenderer::render()
std::shared_ptr<mbgl::UpdateParameters> params;
{
// Lock on the parameters
- std::unique_lock<std::mutex> lock(m_updateMutex);
- if (!m_updateParameters) return;
+ std::lock_guard<std::mutex> lock(m_updateMutex);
+
+ if (!m_updateParameters) {
+ return;
+ }
// Hold on to the update parameters during render
params = m_updateParameters;
@@ -39,7 +48,20 @@ void QMapboxGLMapRenderer::render()
// The OpenGL implementation automatically enables the OpenGL context for us.
mbgl::BackendScope scope(m_backend, mbgl::BackendScope::ScopeType::Implicit);
+ Scheduler::SetCurrent(this);
+
m_renderer->render(*params);
+
+ std::queue<std::weak_ptr<mbgl::Mailbox>> taskQueue;
+ {
+ std::unique_lock<std::mutex> lock(m_taskQueueMutex);
+ std::swap(taskQueue, m_taskQueue);
+ }
+
+ while (!taskQueue.empty()) {
+ mbgl::Mailbox::maybeReceive(taskQueue.front());
+ taskQueue.pop();
+ }
}
void QMapboxGLMapRenderer::setObserver(std::shared_ptr<mbgl::RendererObserver> observer)