summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Brooke <aurelien@bahiasoft.fr>2022-12-11 13:42:25 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-12-15 10:01:22 +0000
commit493793171ff2c5557ffadf465f69ed7ac8dfb416 (patch)
treeba0bd4be59ad9e177b8f0ad7062b1388651351ad
parentc061e94bc1da6ab9b4818590a7ab8e127ce9982e (diff)
downloadqt3d-493793171ff2c5557ffadf465f69ed7ac8dfb416.tar.gz
RHI renderer: fix crash in Renderer::sendShaderChangesToFrontend()
The Shaders or the QShaderProgramBuilders may not exist in the managers anymore by the time we arrive in Renderer::sendShaderChangesToFrontend(). This happens when Qt3D shuts down. To fix this, check the returned values by the managers. This is similar to the existing patch for the OpenGL renderer: Ia021cd8f22ceb2626a7a2734b7e346fbcc8e0301 Change-Id: I322bf2524016c1f98433891ad230b65272fabbdd Reviewed-by: Paul Lemire <paul.lemire@kdab.com> (cherry picked from commit 643d7889cc39f5410b9ccf64c05db0f7f6cc51fc) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp
index 072e8e342..5e46c42bc 100644
--- a/src/plugins/renderers/rhi/renderer/renderer.cpp
+++ b/src/plugins/renderers/rhi/renderer/renderer.cpp
@@ -1528,6 +1528,9 @@ void Renderer::sendShaderChangesToFrontend(Qt3DCore::QAspectManager *manager)
const std::vector<HShader> &activeShaders = m_nodesManager->shaderManager()->activeHandles();
for (const HShader &handle : activeShaders) {
Shader *s = m_nodesManager->shaderManager()->data(handle);
+ if (!s)
+ continue;
+
if (s->requiresFrontendSync()) {
QShaderProgram *frontend =
static_cast<decltype(frontend)>(manager->lookupNode(s->peerId()));
@@ -1545,6 +1548,9 @@ void Renderer::sendShaderChangesToFrontend(Qt3DCore::QAspectManager *manager)
for (const ShaderBuilderUpdate &update : m_shaderBuilderUpdates) {
QShaderProgramBuilder *builder =
static_cast<decltype(builder)>(manager->lookupNode(update.builderId));
+ if (!builder)
+ continue;
+
QShaderProgramBuilderPrivate *dBuilder =
static_cast<decltype(dBuilder)>(QNodePrivate::get(builder));
dBuilder->setShaderCode(update.shaderCode, update.shaderType);