diff options
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderer.cpp | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index 37a9eafd9..e09423005 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -585,38 +585,50 @@ void Renderer::releaseGraphicsResources() QOpenGLContext *context = m_submissionContext->openGLContext(); Q_ASSERT(context); - if (context->thread() == QThread::currentThread() && context->makeCurrent(offscreenSurface)) { - - // Clean up the graphics context and any resources - const std::vector<HGLTexture> &activeTexturesHandles = m_glResourceManagers->glTextureManager()->activeHandles(); - for (const HGLTexture &textureHandle : activeTexturesHandles) { - GLTexture *tex = m_glResourceManagers->glTextureManager()->data(textureHandle); - tex->destroy(); - } + if (context->thread() == QThread::currentThread()) { + QSurface *lastContextSurface = context->surface(); + + if (context->makeCurrent(offscreenSurface)) { + // Clean up the graphics context and any resources + const std::vector<HGLTexture> &activeTexturesHandles = m_glResourceManagers->glTextureManager()->activeHandles(); + for (const HGLTexture &textureHandle : activeTexturesHandles) { + GLTexture *tex = m_glResourceManagers->glTextureManager()->data(textureHandle); + tex->destroy(); + } - // Do the same thing with buffers - const std::vector<HGLBuffer> &activeBuffers = m_glResourceManagers->glBufferManager()->activeHandles(); - for (const HGLBuffer &bufferHandle : activeBuffers) { - GLBuffer *buffer = m_glResourceManagers->glBufferManager()->data(bufferHandle); - buffer->destroy(m_submissionContext.data()); - } + // Do the same thing with buffers + const std::vector<HGLBuffer> &activeBuffers = m_glResourceManagers->glBufferManager()->activeHandles(); + for (const HGLBuffer &bufferHandle : activeBuffers) { + GLBuffer *buffer = m_glResourceManagers->glBufferManager()->data(bufferHandle); + buffer->destroy(m_submissionContext.data()); + } - // Do the same thing with shaders - const std::vector<GLShader *> shaders = m_glResourceManagers->glShaderManager()->takeActiveResources(); - qDeleteAll(shaders); + // Do the same thing with shaders + const std::vector<GLShader *> shaders = m_glResourceManagers->glShaderManager()->takeActiveResources(); + qDeleteAll(shaders); - // Do the same thing with VAOs - const std::vector<HVao> &activeVaos = m_glResourceManagers->vaoManager()->activeHandles(); - for (const HVao &vaoHandle : activeVaos) { - OpenGLVertexArrayObject *vao = m_glResourceManagers->vaoManager()->data(vaoHandle); - vao->destroy(); - } + // Do the same thing with VAOs + const std::vector<HVao> &activeVaos = m_glResourceManagers->vaoManager()->activeHandles(); + for (const HVao &vaoHandle : activeVaos) { + OpenGLVertexArrayObject *vao = m_glResourceManagers->vaoManager()->data(vaoHandle); + vao->destroy(); + } - m_submissionContext->releaseRenderTargets(); + m_submissionContext->releaseRenderTargets(); - m_frameProfiler.reset(); - if (m_ownedContext) - context->doneCurrent(); + m_frameProfiler.reset(); + if (m_ownedContext) { + context->doneCurrent(); + } else { + // Leave the context in the state we found it in by restoring + // its last used surface. This satisfies expectations when used + // with QQuickWidgets that surface on current context after + // QQuickRenderControl cleanup is the same as prior to the + // cleanup. Arguably this could also be checked for in + // QQuickWidgetPrivate::invalidateRenderControl. + context->makeCurrent(lastContextSurface); + } + } } else { qWarning() << "Failed to make context current: OpenGL resources will not be destroyed"; } |