aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgrenderloop.cpp
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-10-20 13:46:13 +0200
committerOleg Shparber <trollixx@gmail.com>2014-10-21 03:15:54 +0200
commitd6661ca409ebf1e4a2fa21fa4f084f63f70052e3 (patch)
tree62d0da4b1fd4840a36260e80232e3cf9895a9342 /src/quick/scenegraph/qsgrenderloop.cpp
parentf830c109d09d835551c1325c4904fc9a490b3754 (diff)
Fix failing makeCurrent in basic renderloop when closing windows
The makeCurrent() call can fail if there is no underlying platform window present anymore (due to close()). Just continuing with the cleanup is wrong: There may be another context current (from the application or from some other component of Qt) and there are GL calls issued which would mess up the state in that context. Therefore we ensure there's a context/surface by using a temporary QOffscreenSurface. Task-number: QTBUG-41942 Change-Id: I79f35a1f5bbe7a8a14943e8603764575ed119f93 Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
Diffstat (limited to 'src/quick/scenegraph/qsgrenderloop.cpp')
-rw-r--r--src/quick/scenegraph/qsgrenderloop.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp
index cd92d12d43..f2586b1e40 100644
--- a/src/quick/scenegraph/qsgrenderloop.cpp
+++ b/src/quick/scenegraph/qsgrenderloop.cpp
@@ -41,6 +41,7 @@
#include <QtCore/private/qabstractanimation_p.h>
#include <QtGui/QOpenGLContext>
+#include <QtGui/QOffscreenSurface>
#include <QtGui/private/qguiapplication_p.h>
#include <qpa/qplatformintegration.h>
@@ -274,15 +275,30 @@ void QSGGuiThreadRenderLoop::windowDestroyed(QQuickWindow *window)
m_windows.remove(window);
hide(window);
QQuickWindowPrivate *d = QQuickWindowPrivate::get(window);
- if (gl)
- gl->makeCurrent(window);
+
+ bool current = false;
+ QScopedPointer<QOffscreenSurface> offscreenSurface;
+ if (gl) {
+ QSurface *surface = window;
+ // There may be no platform window if the window got closed.
+ if (!window->handle()) {
+ offscreenSurface.reset(new QOffscreenSurface);
+ offscreenSurface->setFormat(gl->format());
+ offscreenSurface->create();
+ surface = offscreenSurface.data();
+ }
+ current = gl->makeCurrent(surface);
+ }
+ if (Q_UNLIKELY(!current))
+ qCDebug(QSG_LOG_RENDERLOOP) << "cleanup without an OpenGL context";
+
d->cleanupNodesOnShutdown();
if (m_windows.size() == 0) {
rc->invalidate();
QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
delete gl;
gl = 0;
- } else if (gl && window == gl->surface()) {
+ } else if (gl && window == gl->surface() && current) {
gl->doneCurrent();
}
}