From 05f7732f81abaa2d50f595d155e827501fed8d95 Mon Sep 17 00:00:00 2001 From: Charles Yin Date: Thu, 3 May 2012 23:31:17 +1000 Subject: [PATCH] Implement QQuickContext2DRenderThread class for threaded context2d rendering Change-Id: I221690c730fd412b23705c0d687d1abbac38974d Reviewed-by: Michael Brasser --- src/quick/items/context2d/qquickcanvasitem.cpp | 37 ++++++++++++++++++++++++++ src/quick/items/context2d/qquickcanvasitem_p.h | 17 ++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index 6c8c8f3..7673c39 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -53,6 +53,43 @@ QT_BEGIN_NAMESPACE +QHash 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 5238fbc..c7fce72 100644 --- a/src/quick/items/context2d/qquickcanvasitem_p.h +++ b/src/quick/items/context2d/qquickcanvasitem_p.h @@ -44,6 +44,7 @@ #include #include +#include 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 renderThreads; + static QMutex renderThreadsMutex; +}; + QT_END_NAMESPACE QML_DECLARE_TYPE(QQuickCanvasItem) -- 2.7.4