aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/context2d/qquickcanvasitem.cpp37
-rw-r--r--src/quick/items/context2d/qquickcanvasitem_p.h17
2 files changed, 54 insertions, 0 deletions
diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp
index 6c8c8f3f53..7673c39400 100644
--- a/src/quick/items/context2d/qquickcanvasitem.cpp
+++ b/src/quick/items/context2d/qquickcanvasitem.cpp
@@ -53,6 +53,43 @@
QT_BEGIN_NAMESPACE
+QHash<QQmlEngine *,QQuickContext2DRenderThread*> QQuickContext2DRenderThread::renderThreads;
+QMutex QQuickContext2DRenderThread::renderThreadsMutex;
+
+QQuickContext2DRenderThread::QQuickContext2DRenderThread(QQmlEngine *eng)
+ : QThread(eng), m_engine(eng), m_eventLoopQuitHack(0)
+{
+ Q_ASSERT(eng);
+ m_eventLoopQuitHack = new QObject;
+ m_eventLoopQuitHack->moveToThread(this);
+ connect(m_eventLoopQuitHack, SIGNAL(destroyed(QObject*)), SLOT(quit()), Qt::DirectConnection);
+ start(QThread::IdlePriority);
+}
+
+QQuickContext2DRenderThread::~QQuickContext2DRenderThread()
+{
+ renderThreadsMutex.lock();
+ renderThreads.remove(m_engine);
+ renderThreadsMutex.unlock();
+
+ m_eventLoopQuitHack->deleteLater();
+ wait();
+}
+
+QQuickContext2DRenderThread *QQuickContext2DRenderThread::instance(QQmlEngine *engine)
+{
+ QQuickContext2DRenderThread *thread = 0;
+ renderThreadsMutex.lock();
+ if (renderThreads.contains(engine))
+ thread = renderThreads.value(engine);
+ else {
+ thread = new QQuickContext2DRenderThread(engine);
+ renderThreads.insert(engine, thread);
+ }
+ renderThreadsMutex.unlock();
+ return thread;
+}
+
class QQuickCanvasItemPrivate : public QQuickItemPrivate
{
public:
diff --git a/src/quick/items/context2d/qquickcanvasitem_p.h b/src/quick/items/context2d/qquickcanvasitem_p.h
index 5238fbcf6d..c7fce7299e 100644
--- a/src/quick/items/context2d/qquickcanvasitem_p.h
+++ b/src/quick/items/context2d/qquickcanvasitem_p.h
@@ -44,6 +44,7 @@
#include <QtQuick/qquickitem.h>
#include <private/qv8engine_p.h>
+#include <QtCore/QThread>
QT_BEGIN_HEADER
@@ -161,6 +162,22 @@ private:
bool isPaintConnected();
};
+class QQuickContext2DRenderThread : public QThread
+{
+ Q_OBJECT
+public:
+ QQuickContext2DRenderThread(QQmlEngine *eng);
+ ~QQuickContext2DRenderThread();
+
+ static QQuickContext2DRenderThread *instance(QQmlEngine *engine);
+
+private:
+ QQmlEngine *m_engine;
+ QObject *m_eventLoopQuitHack;
+ static QHash<QQmlEngine *,QQuickContext2DRenderThread*> renderThreads;
+ static QMutex renderThreadsMutex;
+};
+
QT_END_NAMESPACE
QML_DECLARE_TYPE(QQuickCanvasItem)