From 80b09332ee0785fabf82eba94d371bc0cc917f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= <antti.maatta@qt.io> Date: Tue, 24 Mar 2020 14:44:19 +0200 Subject: [PATCH] Fix crash when skybox texture not set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-83049 Change-Id: Id3488298fbd11cd765a66bb3547f8ee1c96bda0a Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> --- .../qssgrendererimpllayerrenderdata.cpp | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp b/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp index be2eb6481..2ec7719f8 100644 --- a/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp +++ b/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp @@ -197,16 +197,22 @@ void QSSGLayerRenderData::renderClearPass() renderer->beginLayerRender(*this); const auto &theContext = renderer->context(); - if (layer.background == QSSGRenderLayer::Background::SkyBox) { - theContext->setDepthTestEnabled(false); // Draw to every pixel - theContext->setDepthWriteEnabled(false); // Depth will be cleared in a separate step - QSSGRef<QSSGSkyBoxShader> shader = renderer->getSkyBoxShader(); - theContext->setActiveShader(shader->shader); - // Setup constants - shader->projection.set(camera->projection); - shader->viewMatrix.set(camera->globalTransform); - shader->skyboxTexture.set(layer.lightProbe->m_textureData.m_texture.data()); - renderer->renderQuad(); + auto background = layer.background; + if (background == QSSGRenderLayer::Background::SkyBox) { + if (layer.lightProbe && !layer.lightProbe->m_textureData.m_texture.isNull()) { + theContext->setDepthTestEnabled(false); // Draw to every pixel + theContext->setDepthWriteEnabled(false); // Depth will be cleared in a separate step + QSSGRef<QSSGSkyBoxShader> shader = renderer->getSkyBoxShader(); + theContext->setActiveShader(shader->shader); + // Setup constants + shader->projection.set(camera->projection); + shader->viewMatrix.set(camera->globalTransform); + shader->skyboxTexture.set(layer.lightProbe->m_textureData.m_texture.data()); + renderer->renderQuad(); + } else { + // Revert to color + background = QSSGRenderLayer::Background::Color; + } } QSSGRenderClearFlags clearFlags; @@ -217,7 +223,7 @@ void QSSGLayerRenderData::renderClearPass() theContext->setDepthWriteEnabled(true); } - if (layer.background == QSSGRenderLayer::Background::Color) { + if (background == QSSGRenderLayer::Background::Color) { clearFlags |= QSSGRenderClearValues::Color; QSSGRenderContextScopedProperty<QVector4D> __clearColor(*theContext, &QSSGRenderContext::clearColor, @@ -225,7 +231,7 @@ void QSSGLayerRenderData::renderClearPass() QVector4D(layer.clearColor, 1.0f)); theContext->clear(clearFlags); } else if (layerPrepResult->flags.requiresTransparentClear() && - layer.background != QSSGRenderLayer::Background::SkyBox) { + background != QSSGRenderLayer::Background::SkyBox) { clearFlags |= QSSGRenderClearValues::Color; QSSGRenderContextScopedProperty<QVector4D> __clearColor(*theContext, &QSSGRenderContext::clearColor, -- GitLab