summaryrefslogtreecommitdiff
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
parenta062f3e17b6f42252a283b50bd36de3411571b7d (diff)
downloadqtlocation-mapboxgl-bb00f558fb31f000eefa1bb825bb580445cedc10.tar.gz
[qt] Make MapboxGLMapRenderer a scheduler to receive messages when rendering
-rw-r--r--platform/qt/src/qmapboxgl_map_renderer.cpp26
-rw-r--r--platform/qt/src/qmapboxgl_map_renderer.hpp9
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 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)
diff --git a/platform/qt/src/qmapboxgl_map_renderer.hpp b/platform/qt/src/qmapboxgl_map_renderer.hpp
index 5769432f0f..e5ead3df32 100644
--- a/platform/qt/src/qmapboxgl_map_renderer.hpp
+++ b/platform/qt/src/qmapboxgl_map_renderer.hpp
@@ -11,6 +11,7 @@
#include <memory>
#include <mutex>
+#include <queue>
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<mbgl::Mailbox> scheduled) final;
+
void render();
void setObserver(std::shared_ptr<mbgl::RendererObserver>);
@@ -41,4 +45,7 @@ private:
QMapboxGLRendererBackend m_backend;
std::unique_ptr<mbgl::Renderer> m_renderer;
+
+ std::mutex m_taskQueueMutex;
+ std::queue<std::weak_ptr<mbgl::Mailbox>> m_taskQueue;
};