summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-12-15 16:34:17 +0200
committerJani Heikkinen <jani.heikkinen@qt.io>2016-12-16 10:08:41 +0000
commit8730660d83dfa5c4d83a5b86b1892029bda14216 (patch)
treec9aa1e389fbfff18acb0b5450cf38e76360a7cd4
parent170f5a89b59f3489267aaede36d7728f90b2e114 (diff)
Make sure destroyed OpenGL context is no longer usedv5.8.0-rc1
Listen to QOpenGLContext::aboutToBeDestroyed() signal in classes that do cleanup related to OpenGL context to disallow its use after its destruction. Task-number: QTBUG-57578 Change-Id: I580e737da7b0c9167dc3cfd65514f2b3f689bb62 Reviewed-by: Paul Lemire <paul.lemire@kdab.com> Reviewed-by: Fredrik Orderud <forderud@gmail.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/renderer.cpp15
-rw-r--r--src/render/backend/renderer_p.h2
-rw-r--r--src/render/materialsystem/shader.cpp7
-rw-r--r--src/render/materialsystem/shader_p.h1
4 files changed, 25 insertions, 0 deletions
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index 2449880d4..e4ad7d181 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -211,6 +211,9 @@ Renderer::~Renderer()
delete m_renderQueue;
delete m_defaultRenderStateSet;
+
+ if (!m_ownedContext)
+ QObject::disconnect(m_contextConnection);
}
void Renderer::dumpInfo() const
@@ -287,6 +290,10 @@ void Renderer::initialize()
else
qCWarning(Backend) << Q_FUNC_INFO << "OpenGL context creation failed";
m_ownedContext = true;
+ } else {
+ // Context is not owned by us, so we need to know if it gets destroyed
+ m_contextConnection = QObject::connect(m_glContext, &QOpenGLContext::aboutToBeDestroyed,
+ [this] { releaseGraphicsResources(); });
}
// Note: we don't have a surface at this point
@@ -340,6 +347,11 @@ void Renderer::shutdown()
When using a threaded renderer this function is called in the context of the
RenderThread to do any shutdown and cleanup that needs to be performed in the
thread where the OpenGL context lives.
+
+ When using Scene3D or anything that provides a custom QOpenGLContext (not
+ owned by Qt3D) this function is called whenever the signal
+ QOpenGLContext::aboutToBeDestroyed is emitted. In that case this function
+ is called in the context of the emitter's thread.
*/
void Renderer::releaseGraphicsResources()
{
@@ -373,6 +385,9 @@ void Renderer::releaseGraphicsResources()
qWarning() << "Failed to make context current: OpenGL resources will not be destroyed";
}
+ if (m_ownedContext)
+ delete context;
+
m_graphicsContext.reset(nullptr);
qCDebug(Backend) << Q_FUNC_INFO << "Renderer properly shutdown";
}
diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h
index da5421d6c..c4e7b2a6a 100644
--- a/src/render/backend/renderer_p.h
+++ b/src/render/backend/renderer_p.h
@@ -338,6 +338,8 @@ private:
QScopedPointer<Qt3DRender::Debug::CommandExecuter> m_commandExecuter;
friend class Qt3DRender::Debug::CommandExecuter;
#endif
+
+ QMetaObject::Connection m_contextConnection;
};
} // namespace Render
diff --git a/src/render/materialsystem/shader.cpp b/src/render/materialsystem/shader.cpp
index d390d74d4..bd0af0bed 100644
--- a/src/render/materialsystem/shader.cpp
+++ b/src/render/materialsystem/shader.cpp
@@ -71,6 +71,8 @@ Shader::~Shader()
{
// TO DO: ShaderProgram is leaked as of now
// Fix that taking care that they may be shared given a same dna
+
+ QObject::disconnect(m_contextConnection);
}
void Shader::cleanup()
@@ -118,6 +120,11 @@ void Shader::setGraphicsContext(GraphicsContext *context)
{
QMutexLocker lock(&m_mutex);
m_graphicsContext = context;
+ if (m_graphicsContext) {
+ m_contextConnection = QObject::connect(m_graphicsContext->openGLContext(),
+ &QOpenGLContext::aboutToBeDestroyed,
+ [this] { setGraphicsContext(nullptr); });
+ }
}
GraphicsContext *Shader::graphicsContext()
diff --git a/src/render/materialsystem/shader_p.h b/src/render/materialsystem/shader_p.h
index 283e5a94c..ad68a3bd6 100644
--- a/src/render/materialsystem/shader_p.h
+++ b/src/render/materialsystem/shader_p.h
@@ -147,6 +147,7 @@ private:
ProgramDNA m_oldDna;
mutable QMutex m_mutex;
GraphicsContext *m_graphicsContext;
+ QMetaObject::Connection m_contextConnection;
void updateDNA();