diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-10-09 18:13:54 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-10-09 18:14:56 +0200 |
commit | e1dfb78667bd7e8dc418e12a9669404adea7e2cb (patch) | |
tree | 16f40a9852281a63c1f98af21c680bddedaa5258 /src/quick/scenegraph/qsgwindowsrenderloop.cpp | |
parent | 28949c9699014b4f7abba396c28dea207b29821e (diff) | |
parent | 26bbd784d67d151eee531e5ff57977a5353549f5 (diff) |
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts:
src/quick/items/context2d/qquickcanvasitem.cpp
src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
src/quick/scenegraph/coreapi/qsgrenderer.cpp
src/quick/scenegraph/qsgadaptationlayer.cpp
src/quick/scenegraph/qsgrenderloop.cpp
src/quick/scenegraph/qsgthreadedrenderloop.cpp
src/quick/scenegraph/qsgwindowsrenderloop.cpp
src/quick/scenegraph/util/qsgatlastexture.cpp
src/quick/scenegraph/util/qsgtexture.cpp
src/quick/util/qquickprofiler_p.h
Change-Id: Ie274c3baf72a8a0711c87d67238d68e2b2887429
Diffstat (limited to 'src/quick/scenegraph/qsgwindowsrenderloop.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgwindowsrenderloop.cpp | 48 |
1 files changed, 17 insertions, 31 deletions
diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp index b55977296c..11e3376af5 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp +++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp @@ -189,14 +189,6 @@ void QSGWindowsRenderLoop::show(QQuickWindow *window) void QSGWindowsRenderLoop::hide(QQuickWindow *window) { RLDEBUG("hide"); - - for (int i=0; i<m_windows.size(); ++i) { - if (m_windows.at(i).window == window) { - m_windows.removeAt(i); - break; - } - } - // The expose event is queued while hide is sent synchronously, so // the value might not be updated yet. (plus that the windows plugin // sends exposed=true when it goes to hidden, so it is doubly broken) @@ -204,47 +196,41 @@ void QSGWindowsRenderLoop::hide(QQuickWindow *window) // anyoneShowing will report the right value. if (window->isExposed()) handleObscurity(); - if (!m_gl) return; - - QQuickWindowPrivate *cd = QQuickWindowPrivate::get(window); - m_gl->makeCurrent(window); - cd->fireAboutToStop(); - cd->cleanupNodesOnShutdown(); - - // If this is the last tracked window, check for persistent SG and GL and - // potentially clean up. - if (m_windows.size() == 0) { - if (!cd->persistentSceneGraph) { - QQuickWindowPrivate::get(window)->context->invalidate(); - QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); - if (!cd->persistentGLContext) { - delete m_gl; - m_gl = 0; - } - } - } + QQuickWindowPrivate::get(window)->fireAboutToStop(); } void QSGWindowsRenderLoop::windowDestroyed(QQuickWindow *window) { RLDEBUG("windowDestroyed"); + for (int i=0; i<m_windows.size(); ++i) { + if (m_windows.at(i).window == window) { + m_windows.removeAt(i); + break; + } + } + hide(window); - // If this is the last tracked window, clean up SG and GL. + QQuickWindowPrivate *d = QQuickWindowPrivate::get(window); + if (m_gl) + m_gl->makeCurrent(window); + d->cleanupNodesOnShutdown(); if (m_windows.size() == 0) { - QQuickWindowPrivate::get(window)->context->invalidate(); + d->context->invalidate(); QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); delete m_gl; m_gl = 0; + } else if (m_gl) { + m_gl->doneCurrent(); } } bool QSGWindowsRenderLoop::anyoneShowing() const { foreach (const WindowData &wd, m_windows) - if (wd.window->isExposed() && wd.window->size().isValid()) + if (wd.window->isVisible() && wd.window->isExposed() && wd.window->size().isValid()) return true; return false; } @@ -255,7 +241,7 @@ void QSGWindowsRenderLoop::exposureChanged(QQuickWindow *window) if (windowData(window) == 0) return; - if (window->isExposed()) { + if (window->isExposed() && window->isVisible()) { // Stop non-visual animation timer as we now have a window rendering if (m_animationTimer && anyoneShowing()) { |