From bb00f558fb31f000eefa1bb825bb580445cedc10 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Thu, 25 Jan 2018 02:19:36 +0200 Subject: [PATCH] [qt] Make MapboxGLMapRenderer a scheduler to receive messages when rendering --- platform/qt/src/qmapboxgl_map_renderer.cpp | 26 ++++++++++++++++++++-- platform/qt/src/qmapboxgl_map_renderer.hpp | 9 +++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/platform/qt/src/qmapboxgl_map_renderer.cpp b/platform/qt/src/qmapboxgl_map_renderer.cpp index a343d5666..65fb37f09 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 mailbox) +{ + std::lock_guard lock(m_taskQueueMutex); + m_taskQueue.push(mailbox); +} + void QMapboxGLMapRenderer::updateParameters(std::shared_ptr newParameters) { std::lock_guard lock(m_updateMutex); @@ -29,8 +35,11 @@ void QMapboxGLMapRenderer::render() std::shared_ptr params; { // Lock on the parameters - std::unique_lock lock(m_updateMutex); - if (!m_updateParameters) return; + std::lock_guard 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> taskQueue; + { + std::unique_lock lock(m_taskQueueMutex); + std::swap(taskQueue, m_taskQueue); + } + + while (!taskQueue.empty()) { + mbgl::Mailbox::maybeReceive(taskQueue.front()); + taskQueue.pop(); + } } void QMapboxGLMapRenderer::setObserver(std::shared_ptr observer) diff --git a/platform/qt/src/qmapboxgl_map_renderer.hpp b/platform/qt/src/qmapboxgl_map_renderer.hpp index 5769432f0..e5ead3df3 100644 --- a/platform/qt/src/qmapboxgl_map_renderer.hpp +++ b/platform/qt/src/qmapboxgl_map_renderer.hpp @@ -11,6 +11,7 @@ #include #include +#include namespace mbgl { class Renderer; @@ -19,13 +20,16 @@ class UpdateParameters; class QMapboxGLRendererBackend; -class QMapboxGLMapRenderer +class QMapboxGLMapRenderer : public mbgl::Scheduler { public: QMapboxGLMapRenderer(qreal pixelRatio, mbgl::DefaultFileSource &, mbgl::ThreadPool &, QMapboxGLSettings::GLContextMode); virtual ~QMapboxGLMapRenderer(); + // mbgl::Scheduler implementation. + void schedule(std::weak_ptr scheduled) final; + void render(); void setObserver(std::shared_ptr); @@ -41,4 +45,7 @@ private: QMapboxGLRendererBackend m_backend; std::unique_ptr m_renderer; + + std::mutex m_taskQueueMutex; + std::queue> m_taskQueue; };