diff options
-rw-r--r-- | src/quick/designer/designerwindowmanager_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 14 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 38 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop_p.h | 8 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 8 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop_p.h | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgwindowsrenderloop.cpp | 9 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgwindowsrenderloop_p.h | 2 |
8 files changed, 66 insertions, 17 deletions
diff --git a/src/quick/designer/designerwindowmanager_p.h b/src/quick/designer/designerwindowmanager_p.h index 7414f4e3ba..17a227d212 100644 --- a/src/quick/designer/designerwindowmanager_p.h +++ b/src/quick/designer/designerwindowmanager_p.h @@ -93,6 +93,8 @@ public: QSGContext *sceneGraphContext() const; QSGRenderContext *createRenderContext(QSGContext *) const { return m_renderContext.data(); } + QList<QQuickWindow *> windows() const { return QList<QQuickWindow *>(); }; + static void createOpenGLContext(QQuickWindow *window); private: diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 6a56a5dc82..7873673e6f 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -290,7 +290,7 @@ void QQuickWindow::update() Q_D(QQuickWindow); if (d->windowManager) d->windowManager->update(this); - else + else if (d->renderControl) d->renderControl->update(); } @@ -1079,7 +1079,7 @@ QQuickWindow::~QQuickWindow() d->animationController->deleteLater(); if (d->renderControl) d->renderControl->windowDestroyed(); - else + else if (d->windowManager) d->windowManager->windowDestroyed(this); QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); @@ -1090,8 +1090,6 @@ QQuickWindow::~QQuickWindow() delete d->contentItem; d->contentItem = 0; } - - /*! This function tries to release redundant resources currently held by the QML scene. @@ -2715,7 +2713,7 @@ void QQuickWindow::maybeUpdate() Q_D(QQuickWindow); if (d->renderControl) d->renderControl->maybeUpdate(); - else + else if (d->windowManager) d->windowManager->maybeUpdate(this); } @@ -2990,7 +2988,11 @@ QImage QQuickWindow::grabWindow() return image; } - return d->renderControl ? d->renderControl->grab() : d->windowManager->grab(this); + if (d->renderControl) + return d->renderControl->grab(); + else if (d->windowManager) + return d->windowManager->grab(this); + return QImage(); } /*! diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index 6647ec83d0..37df425e55 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -45,7 +45,6 @@ #include <QtCore/QCoreApplication> #include <QtCore/QTime> -#include <QtCore/QScopedPointer> #include <QtCore/QLibraryInfo> #include <QtCore/private/qabstractanimation_p.h> @@ -82,12 +81,25 @@ extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_ DEFINE_BOOL_CONFIG_OPTION(qmlNoThreadedRenderer, QML_BAD_GUI_RENDER_LOOP); DEFINE_BOOL_CONFIG_OPTION(qmlForceThreadedRenderer, QML_FORCE_THREADED_RENDERER); // Might trigger graphics driver threading bugs, use at own risk -Q_GLOBAL_STATIC(QScopedPointer<QSGRenderLoop>, s_renderLoopInstance); +QSGRenderLoop *QSGRenderLoop::s_instance = 0; QSGRenderLoop::~QSGRenderLoop() { } +void QSGRenderLoop::cleanup() +{ + foreach (QQuickWindow *w, windows()) { + QQuickWindowPrivate *wd = QQuickWindowPrivate::get(w); + if (wd->windowManager == this) { + windowDestroyed(w); + wd->windowManager = 0; + } + } + s_instance = 0; + delete this; +} + class QSGGuiThreadRenderLoop : public QSGRenderLoop { Q_OBJECT @@ -114,6 +126,8 @@ public: QSGContext *sceneGraphContext() const; QSGRenderContext *createRenderContext(QSGContext *) const { return rc; } + QList<QQuickWindow *> windows() const { return m_windows.keys(); } + bool event(QEvent *); struct WindowData { @@ -148,8 +162,8 @@ bool QSGRenderLoop::useConsistentTiming() QSGRenderLoop *QSGRenderLoop::instance() { - if (s_renderLoopInstance->isNull()) { - s_renderLoopInstance->reset(QSGContext::createWindowManager()); + if (!s_instance) { + s_instance = QSGContext::createWindowManager(); bool info = qEnvironmentVariableIsSet("QSG_INFO"); @@ -159,7 +173,7 @@ QSGRenderLoop *QSGRenderLoop::instance() qDebug() << "QSG: using fixed animation steps"; } - if (s_renderLoopInstance->isNull()) { + if (!s_instance) { enum RenderLoopType { BasicRenderLoop, @@ -191,26 +205,28 @@ QSGRenderLoop *QSGRenderLoop::instance() switch (loopType) { case ThreadedRenderLoop: if (info) qDebug() << "QSG: threaded render loop"; - s_renderLoopInstance->reset(new QSGThreadedRenderLoop()); + s_instance = new QSGThreadedRenderLoop(); break; case WindowsRenderLoop: if (info) qDebug() << "QSG: windows render loop"; - s_renderLoopInstance->reset(new QSGWindowsRenderLoop()); + s_instance = new QSGWindowsRenderLoop(); break; default: if (info) qDebug() << "QSG: basic render loop"; - s_renderLoopInstance->reset(new QSGGuiThreadRenderLoop()); + s_instance = new QSGGuiThreadRenderLoop(); break; } } + + QObject::connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), s_instance, SLOT(cleanup())); } - return s_renderLoopInstance->data(); + return s_instance; } void QSGRenderLoop::setInstance(QSGRenderLoop *instance) { - Q_ASSERT(s_renderLoopInstance->isNull()); - s_renderLoopInstance->reset(instance); + Q_ASSERT(!s_instance); + s_instance = instance; } void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window, diff --git a/src/quick/scenegraph/qsgrenderloop_p.h b/src/quick/scenegraph/qsgrenderloop_p.h index 2418af4157..47b59992e2 100644 --- a/src/quick/scenegraph/qsgrenderloop_p.h +++ b/src/quick/scenegraph/qsgrenderloop_p.h @@ -78,6 +78,8 @@ public: virtual void releaseResources(QQuickWindow *window) = 0; + virtual QList<QQuickWindow *> windows() const = 0; + // ### make this less of a singleton static QSGRenderLoop *instance(); static void setInstance(QSGRenderLoop *instance); @@ -91,6 +93,12 @@ Q_SIGNALS: protected: void handleContextCreationFailure(QQuickWindow *window, bool isEs); + +public Q_SLOTS: + void cleanup(); + +private: + static QSGRenderLoop *s_instance; }; QT_END_NAMESPACE diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index ba8c3a7fce..3dc2a50542 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -738,6 +738,14 @@ QSGThreadedRenderLoop::QSGThreadedRenderLoop() QSG_GUI_DEBUG((void *) 0, "QSGThreadedRenderLoop() created"); } +QList<QQuickWindow *> QSGThreadedRenderLoop::windows() const +{ + QList<QQuickWindow *> list; + foreach (const Window &w, m_windows) + list << w.window; + return list; +} + QSGRenderContext *QSGThreadedRenderLoop::createRenderContext(QSGContext *sg) const { return sg->createRenderContext(); diff --git a/src/quick/scenegraph/qsgthreadedrenderloop_p.h b/src/quick/scenegraph/qsgthreadedrenderloop_p.h index e142f7f2c8..3997ef92b7 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop_p.h +++ b/src/quick/scenegraph/qsgthreadedrenderloop_p.h @@ -79,6 +79,8 @@ public: bool interleaveIncubation() const; + QList<QQuickWindow *> windows() const; + public Q_SLOTS: void animationStarted(); void animationStopped(); diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp index 913b737798..cbe9ea384b 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp +++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp @@ -111,6 +111,15 @@ QSGWindowsRenderLoop::~QSGWindowsRenderLoop() delete m_sg; } +QList<QQuickWindow *> QSGWindowsRenderLoop::windows() const +{ + QList<QQuickWindow *> list; + foreach (const WindowData &w, m_windows) + list << w.window; + return list; +} + + bool QSGWindowsRenderLoop::interleaveIncubation() const { return m_animationDriver->isRunning() && anyoneShowing(); diff --git a/src/quick/scenegraph/qsgwindowsrenderloop_p.h b/src/quick/scenegraph/qsgwindowsrenderloop_p.h index e4ee688c9f..6c26e728da 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop_p.h +++ b/src/quick/scenegraph/qsgwindowsrenderloop_p.h @@ -86,6 +86,8 @@ public: bool interleaveIncubation() const; + QList<QQuickWindow *> windows() const; + public Q_SLOTS: void started(); void stopped(); |