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