diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp index 92a422a56d5b72fe0400d86d5d181b7f99ba213a..3d10d556386b9ea9e99bc252d395d53d8763cdbb 100644 --- a/src/quick/items/qquickcanvas.cpp +++ b/src/quick/items/qquickcanvas.cpp @@ -166,7 +166,7 @@ QQuickRootItem::QQuickRootItem() void QQuickCanvas::exposeEvent(QExposeEvent *) { Q_D(QQuickCanvas); - d->windowManager->paint(this); + d->windowManager->exposureChanged(this); } void QQuickCanvas::resizeEvent(QResizeEvent *) diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp index 5de8ad12796892ac018cc75c3a0d57003f789f54..12c5dbd9321b6cbcac44b1dd1e87d593544bdf6c 100644 --- a/src/quick/items/qquickwindowmanager.cpp +++ b/src/quick/items/qquickwindowmanager.cpp @@ -188,7 +188,7 @@ public: void canvasDestroyed(QQuickCanvas *canvas); - void paint(QQuickCanvas *canvas); + void exposureChanged(QQuickCanvas *canvas); QImage grab(QQuickCanvas *canvas); void resize(QQuickCanvas *canvas, const QSize &size); void handleDeferredUpdate(); @@ -297,7 +297,7 @@ public: void initializeGL(); void renderCanvas(QQuickCanvas *canvas); - void paint(QQuickCanvas *canvas); + void exposureChanged(QQuickCanvas *canvas); QImage grab(QQuickCanvas *canvas); void resize(QQuickCanvas *canvas, const QSize &size); void wakeup(); @@ -333,14 +333,21 @@ QQuickWindowManager *QQuickWindowManager::instance() static QQuickWindowManager *theInstance; if (!theInstance) { - bool fancy = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL); + + theInstance = QSGContext::createWindowManager(); + + bool fancy = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::BufferQueueingOpenGL); if (qmlNoThreadedRenderer()) fancy = false; + if (qmlFixedAnimationStep()) QUnifiedTimer::instance(true)->setConsistentTiming(true); - theInstance = fancy - ? (QQuickWindowManager*) new QQuickRenderThreadSingleContextWindowManager - : (QQuickWindowManager*) new QQuickTrivialWindowManager; + + if (!theInstance) { + theInstance = fancy + ? (QQuickWindowManager*) new QQuickRenderThreadSingleContextWindowManager + : (QQuickWindowManager*) new QQuickTrivialWindowManager; + } } return theInstance; } @@ -932,26 +939,15 @@ void QQuickRenderThreadSingleContextWindowManager::animationStopped() } -void QQuickRenderThreadSingleContextWindowManager::paint(QQuickCanvas *canvas) +void QQuickRenderThreadSingleContextWindowManager::exposureChanged(QQuickCanvas *canvas) { Q_UNUSED(canvas); #ifdef THREAD_DEBUG - printf("GUI: paint called: %p\n", canvas); + printf("GUI: exposure changed: %p\n", canvas); #endif - lockInGui(); - exhaustSyncEvent(); - - isPaintCompleted = false; - while (isRunning() && !isPaintCompleted) { - if (isRenderBlocked) - wake(); - wait(); - } - unlockInGui(); - #ifdef THREAD_DEBUG - printf("GUI: paint done: %p\n", canvas); + printf("GUI: exposure changed done: %p\n", canvas); #endif } @@ -1234,13 +1230,8 @@ void QQuickTrivialWindowManager::renderCanvas(QQuickCanvas *canvas) maybeUpdate(canvas); } -void QQuickTrivialWindowManager::paint(QQuickCanvas *canvas) +void QQuickTrivialWindowManager::exposureChanged(QQuickCanvas *canvas) { - if (!m_windows.contains(canvas)) - return; - - m_windows[canvas].updatePending = true; - renderCanvas(canvas); } QImage QQuickTrivialWindowManager::grab(QQuickCanvas *canvas) diff --git a/src/quick/items/qquickwindowmanager_p.h b/src/quick/items/qquickwindowmanager_p.h index 9372e90f5e70e2c6d6579022119b81a72a425e1d..eb877d4756cfc6cb8387fa74f78f202058b00295 100644 --- a/src/quick/items/qquickwindowmanager_p.h +++ b/src/quick/items/qquickwindowmanager_p.h @@ -43,13 +43,14 @@ #define QQUICKWINDOWMANAGER_P_H #include <QtGui/QImage> +#include <qtquickglobal.h> QT_BEGIN_NAMESPACE class QQuickCanvas; class QSGContext; -class QQuickWindowManager +class Q_QUICK_EXPORT QQuickWindowManager { public: virtual ~QQuickWindowManager(); @@ -59,7 +60,7 @@ public: virtual void canvasDestroyed(QQuickCanvas *canvas) = 0; - virtual void paint(QQuickCanvas *canvas) = 0; + virtual void exposureChanged(QQuickCanvas *canvas) = 0; virtual QImage grab(QQuickCanvas *canvas) = 0; virtual void resize(QQuickCanvas *canvas, const QSize &size) = 0; diff --git a/src/quick/scenegraph/qsgcontext_p.h b/src/quick/scenegraph/qsgcontext_p.h index 0f8b5ae1decae9c7a2398170c76d1135ce9eb5e1..dfb960f420af746fb6e1b2c123b6bd3396938059 100644 --- a/src/quick/scenegraph/qsgcontext_p.h +++ b/src/quick/scenegraph/qsgcontext_p.h @@ -68,6 +68,7 @@ class QSGTexture; class QSGMaterial; class QSGMaterialShader; class QSGEngine; +class QQuickWindowManager; class QOpenGLContext; class QOpenGLFramebufferObject; @@ -122,6 +123,7 @@ public: virtual QAnimationDriver *createAnimationDriver(QObject *parent); static QQuickTextureFactory *createTextureFactoryFromImage(const QImage &image); + static QQuickWindowManager *createWindowManager(); public slots: diff --git a/src/quick/scenegraph/qsgcontextplugin.cpp b/src/quick/scenegraph/qsgcontextplugin.cpp index b8a66fd0c09f18ec6ce428278bbfd8351dad7985..bd1c4cece8544001eb1aa7c3042eb4aad8695c5f 100644 --- a/src/quick/scenegraph/qsgcontextplugin.cpp +++ b/src/quick/scenegraph/qsgcontextplugin.cpp @@ -152,5 +152,23 @@ QQuickTextureFactory *QSGContext::createTextureFactoryFromImage(const QImage &im } +/*! + \fn QQuickWindowManager *createWindowManager() + + Calls into the scene graph adaptation if available and creates a hardware + specific window manager. + */ + +QQuickWindowManager *QSGContext::createWindowManager() +{ + QSGAdaptionPluginData *plugin = contextFactory(); + if (plugin->factory) + return plugin->factory->createWindowManager(); + return 0; +} + + + + QT_END_NAMESPACE diff --git a/src/quick/scenegraph/qsgcontextplugin_p.h b/src/quick/scenegraph/qsgcontextplugin_p.h index d0d8ea143bd81cab4f76ed7e89cd7aa993e25a9f..cc7761a0951bb8a6f50cb65ef7847d7889695606 100644 --- a/src/quick/scenegraph/qsgcontextplugin_p.h +++ b/src/quick/scenegraph/qsgcontextplugin_p.h @@ -54,11 +54,14 @@ QT_BEGIN_NAMESPACE class QSGContext; +class QQuickWindowManager; + struct Q_QUICK_EXPORT QSGContextFactoryInterface : public QFactoryInterface { virtual QSGContext *create(const QString &key) const = 0; virtual QQuickTextureFactory *createTextureFactoryFromImage(const QImage &image) = 0; + virtual QQuickWindowManager *createWindowManager() = 0; }; #define QSGContextFactoryInterface_iid \ @@ -77,6 +80,7 @@ public: virtual QSGContext *create(const QString &key) const = 0; virtual QQuickTextureFactory *createTextureFactoryFromImage(const QImage &) { return 0; } + virtual QQuickWindowManager *createWindowManager() { return 0; } }; QT_END_NAMESPACE