diff options
| author | Frederik Gladhorn <[email protected]> | 2014-05-09 16:25:58 +0200 |
|---|---|---|
| committer | Gunnar Sletta <[email protected]> | 2014-05-10 11:53:47 +0200 |
| commit | 66646dd8c37adb488a79ab274b2396a649674e6d (patch) | |
| tree | b0f5ac752a52cec3de1d47692e09295197622dcd /src/quick/scenegraph/qsgrenderloop.cpp | |
| parent | da15ea0f3b5805db657f13060c21efa78f10cde2 (diff) | |
| parent | d82a17b929dd88fe76258b0f801beaa1b2ee343e (diff) | |
Merge remote-tracking branch 'origin/stable' into dev
Conflicts:
.qmake.conf
src/plugins/accessible/quick/quick.pro
src/quick/items/qquickpincharea.cpp
src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
src/quick/scenegraph/qsgthreadedrenderloop.cpp
Manually adjusted for TestHTTPServer constructor change:
tests/auto/quick/qquickimage/tst_qquickimage.cpp
Change-Id: I5e58a7c08ea92d6fc5e3bce98571c54f7b2ce08f
Diffstat (limited to 'src/quick/scenegraph/qsgrenderloop.cpp')
| -rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index 00e67aa944..38de4a5c39 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,27 @@ 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() +{ + if (!s_instance) + return; + foreach (QQuickWindow *w, s_instance->windows()) { + QQuickWindowPrivate *wd = QQuickWindowPrivate::get(w); + if (wd->windowManager == s_instance) { + s_instance->windowDestroyed(w); + wd->windowManager = 0; + } + } + delete s_instance; + s_instance = 0; +} + class QSGGuiThreadRenderLoop : public QSGRenderLoop { Q_OBJECT @@ -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; } } + + qAddPostRoutine(QSGRenderLoop::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, @@ -295,6 +311,8 @@ void QSGGuiThreadRenderLoop::windowDestroyed(QQuickWindow *window) QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); delete gl; gl = 0; + } else if (window == gl->surface()) { + gl->doneCurrent(); } } @@ -311,10 +329,10 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window) if (!gl) { gl = new QOpenGLContext(); gl->setFormat(window->requestedFormat()); - if (QSGContext::sharedOpenGLContext()) - gl->setShareContext(QSGContext::sharedOpenGLContext()); + if (QOpenGLContextPrivate::globalShareContext()) + gl->setShareContext(QOpenGLContextPrivate::globalShareContext()); if (!gl->create()) { - const bool isEs = gl->isES(); + const bool isEs = gl->isOpenGLES(); delete gl; gl = 0; handleContextCreationFailure(window, isEs); @@ -361,7 +379,7 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window) renderTime = renderTimer.nsecsElapsed() - syncTime; if (data.grabOnly) { - grabContent = qt_gl_read_framebuffer(window->size(), false, false); + grabContent = qt_gl_read_framebuffer(window->size() * window->devicePixelRatio(), false, false); data.grabOnly = false; } |
