From b5fb59fc5fa8d180daa1cb95f12238657a53bbc2 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 6 Nov 2014 13:06:26 -0800 Subject: [PATCH] Fix not having a context when cleaning up on Windows The same old issue surfaces in the windows render loop too. The basic render loop is already fixed, apply a similar patch to the windows one too. Task-number: QTBUG-42213 Change-Id: I07068315f5164014e329b8ce061947c97ae9da61 Reviewed-by: Friedemann Kleint Reviewed-by: Sean Harmer --- src/quick/scenegraph/qsgwindowsrenderloop.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp index 070d6b8..1213c7e 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp +++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -210,15 +211,29 @@ void QSGWindowsRenderLoop::windowDestroyed(QQuickWindow *window) hide(window); QQuickWindowPrivate *d = QQuickWindowPrivate::get(window); - if (m_gl) - m_gl->makeCurrent(window); + bool current = false; + QScopedPointer offscreenSurface; + if (m_gl) { + QSurface *surface = window; + // There may be no platform window if the window got closed. + if (!window->handle()) { + offscreenSurface.reset(new QOffscreenSurface); + offscreenSurface->setFormat(m_gl->format()); + offscreenSurface->create(); + surface = offscreenSurface.data(); + } + current = m_gl->makeCurrent(surface); + } + if (Q_UNLIKELY(!current)) + qCDebug(QSG_LOG_RENDERLOOP) << "cleanup without an OpenGL context"; + d->cleanupNodesOnShutdown(); if (m_windows.size() == 0) { d->context->invalidate(); QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); delete m_gl; m_gl = 0; - } else if (m_gl) { + } else if (m_gl && current) { m_gl->doneCurrent(); } } -- 2.7.4