[qt] Make MapboxGLMapRenderer a scheduler to receive messages when rendering

This commit is contained in:
Thiago Marcos P. Santos
2018-01-25 02:19:36 +02:00
parent a062f3e17b
commit bb00f558fb
2 changed files with 32 additions and 3 deletions

View File

@@ -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)

View File

@@ -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;
};