diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-04-15 14:50:25 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-04-15 16:09:53 +0200 |
commit | 0cd80d4f4e0390c7ba3aa2b2d36781403c1c2aae (patch) | |
tree | 47cb24bdd35b7fe50553d67a058181b449a2bf26 /src | |
parent | ed079cb387f25e88757b87a7a9fc956266fd0c4f (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.cpp | 4 | ||||
-rw-r--r-- | src/render/materialsystem/shader.cpp | 1 |
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; } |