aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/context2d
diff options
context:
space:
mode:
authorCharles Yin <yinyunqiao@gmail.com>2012-05-03 23:31:17 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-04 08:47:10 +0200
commit05f7732f81abaa2d50f595d155e827501fed8d95 (patch)
tree4d565e5e8323ba4aa868006943b17d1eae630199 /src/quick/items/context2d
parent186abc1e085e4fae7631e329f44e68a810bca38b (diff)
Implement QQuickContext2DRenderThread class for threaded context2d rendering
Change-Id: I221690c730fd412b23705c0d687d1abbac38974d Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
Diffstat (limited to 'src/quick/items/context2d')
-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)