summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-04-15 14:50:25 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-04-15 16:09:53 +0200
commit0cd80d4f4e0390c7ba3aa2b2d36781403c1c2aae (patch)
tree47cb24bdd35b7fe50553d67a058181b449a2bf26 /src
parented079cb387f25e88757b87a7a9fc956266fd0c4f (diff)
Shader: check frontend node still exists before synching
Since backend shaders might outlive their frontend counterparts when using the OpenGL renderer (we need 1 more frame to properly cleanup shaders), check they still exists before trying to send changes. Also make sure we unset the send changes flag when we cleanup a backend shader Change-Id: I3d9cee13fa66e346e040f3be35de223c9081267e Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer.cpp4
-rw-r--r--src/render/materialsystem/shader.cpp1
2 files changed, 5 insertions, 0 deletions
diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp
index 9f9253792..35f1d6bf4 100644
--- a/src/plugins/renderers/opengl/renderer/renderer.cpp
+++ b/src/plugins/renderers/opengl/renderer/renderer.cpp
@@ -1172,6 +1172,10 @@ void Renderer::sendShaderChangesToFrontend(Qt3DCore::QAspectManager *manager)
Shader *s = m_nodesManager->shaderManager()->data(handle);
if (s->requiresFrontendSync()) {
QShaderProgram *frontend = static_cast<decltype(frontend)>(manager->lookupNode(s->peerId()));
+ // Could happen as a backend shader might live beyong the frontend
+ // the time needed to destroy the GLShader assoicated with it.
+ if (!frontend)
+ continue;
QShaderProgramPrivate *dFrontend = static_cast<decltype(dFrontend)>(QNodePrivate::get(frontend));
s->unsetRequiresFrontendSync();
dFrontend->setStatus(s->status());
diff --git a/src/render/materialsystem/shader.cpp b/src/render/materialsystem/shader.cpp
index 43cf61cd3..343fbf3fe 100644
--- a/src/render/materialsystem/shader.cpp
+++ b/src/render/materialsystem/shader.cpp
@@ -102,6 +102,7 @@ void Shader::cleanup()
m_status = QShaderProgram::NotReady;
m_format = QShaderProgram::GLSL;
m_log.clear();
+ m_requiresFrontendSync = false;
m_dirty = false;
}