1
#include "renderengine.h"
2
#include <QtConcurrent/QtConcurrent>
5
RenderEngine* RenderEngine::s_instance = nullptr;
7
RenderEngine::RenderEngine():
12
int itc = QThread::idealThreadCount();
13
m_idealThreadCount = itc == -1 ? DefaultIdealThreadCount : itc;
15
// For QMetaObject::invoke.
16
qRegisterMetaType<AbstractRenderTask*>();
19
void RenderEngine::enqueueTask(AbstractRenderTask *task)
21
m_queue.enqueue(task);
25
void RenderEngine::dequeueTask(int id)
27
for (int i = 0; i < m_queue.size(); i++) {
28
auto task = m_queue.at(i);
29
if (task->id() == id) {
37
void RenderEngine::internalRenderCallback(AbstractRenderTask* task, QImage img)
41
if (!m_activeTaskCount) {
46
// Notify about result.
47
emit taskRenderFinished(task, img);
53
void RenderEngine::disposeLater(AbstractRenderTask *task)
55
m_disposedTasks.append(task);
58
void RenderEngine::doDispose()
60
for (int i = 0; i < m_disposedTasks.size(); ++i)
61
delete m_disposedTasks.at(i);
62
m_disposedTasks.clear();
65
void RenderEngine::doNextTask()
68
qDebug() << " ---- doNextTask" << m_activeTaskCount << m_queue.count();
71
// Check for too much threads or empty queue.
72
if (m_activeTaskCount >= m_idealThreadCount || !m_queue.count())
75
AbstractRenderTask* task = m_queue.head();
77
// If some tasks already in progress, we should ask task about
78
// compatibility of parallel execution with last the task.
79
if (m_activeTaskCount && !task->canBeRunInParallel(m_lastTask))
85
m_lastTask = m_queue.dequeue();
87
QtConcurrent::run( [=] {
88
QImage img = task->doWork();
89
QMetaObject::invokeMethod(this, "internalRenderCallback",
90
Q_ARG(AbstractRenderTask*, task), Q_ARG(QImage, img));