diff options
author | Aurélien Brooke <aurelien@bahiasoft.fr> | 2022-12-11 13:42:25 +0100 |
---|---|---|
committer | Aurélien Brooke <aurelien@bahiasoft.fr> | 2022-12-15 08:24:18 +0100 |
commit | 643d7889cc39f5410b9ccf64c05db0f7f6cc51fc (patch) | |
tree | 1db6ca87d387a318ef439a88fc37263faa90dcef | |
parent | 1fe1c5a3752d1d56e78fdeb95842520d83940e52 (diff) | |
download | qt3d-643d7889cc39f5410b9ccf64c05db0f7f6cc51fc.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
Pick-to: 6.4
Change-Id: I322bf2524016c1f98433891ad230b65272fabbdd
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderer.cpp | 6 |
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 52eca7568..66b40c21c 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); |