From 57c54ec4b75aac8ba2a4235f88760bd8534f2c7a Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Fri, 16 Dec 2022 08:59:02 -0600
Subject: [PATCH] SL-18851 Fix for PBR materials sometimes not casting shadows
 when they should.

---
 .../class1/deferred/shadowAlphaMaskF.glsl      |  4 +++-
 indra/newview/lldrawpoolpbropaque.cpp          |  2 +-
 indra/newview/llviewershadermgr.cpp            | 18 ++++++++++++++++++
 indra/newview/llviewershadermgr.h              |  1 +
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
index 1a344045fea..06ebeb8281b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
@@ -48,6 +48,8 @@ void main()
         discard;
     }
 
+#if !defined(GLTF)
+
 #if !defined(IS_FULLBRIGHT)
     alpha *= vertex_color.a;
 #endif
@@ -64,7 +66,7 @@ void main()
             discard;
         }
     }
-
+#endif
 
 	frag_color = vec4(1,1,1,1);
 	
diff --git a/indra/newview/lldrawpoolpbropaque.cpp b/indra/newview/lldrawpoolpbropaque.cpp
index d0c588b65ab..c39060a3260 100644
--- a/indra/newview/lldrawpoolpbropaque.cpp
+++ b/indra/newview/lldrawpoolpbropaque.cpp
@@ -48,7 +48,7 @@ void LLDrawPoolGLTFPBR::renderDeferred(S32 pass)
     for (int i = 0; i < 2; ++i)
     {
         bool rigged = (i == 1);
-        LLGLSLShader* shader = LLPipeline::sShadowRender ? &gDeferredShadowAlphaMaskProgram : &gDeferredPBROpaqueProgram;
+        LLGLSLShader* shader = LLPipeline::sShadowRender ? &gDeferredShadowGLTFAlphaMaskProgram : &gDeferredPBROpaqueProgram;
         U32 vertex_data_mask = getVertexDataMask();
 
         if (rigged)
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index b7e2fd4cb4a..757a946fda0 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -215,6 +215,7 @@ LLGLSLShader			gDeferredShadowProgram;
 LLGLSLShader            gDeferredSkinnedShadowProgram;
 LLGLSLShader			gDeferredShadowCubeProgram;
 LLGLSLShader			gDeferredShadowAlphaMaskProgram;
+LLGLSLShader			gDeferredShadowGLTFAlphaMaskProgram;
 LLGLSLShader            gDeferredSkinnedShadowAlphaMaskProgram;
 LLGLSLShader			gDeferredShadowFullbrightAlphaMaskProgram;
 LLGLSLShader            gDeferredSkinnedShadowFullbrightAlphaMaskProgram;
@@ -1263,6 +1264,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         gDeferredSkinnedShadowProgram.unload();
 		gDeferredShadowCubeProgram.unload();
         gDeferredShadowAlphaMaskProgram.unload();
+        gDeferredShadowGLTFAlphaMaskProgram.unload();
         gDeferredSkinnedShadowAlphaMaskProgram.unload();
         gDeferredShadowFullbrightAlphaMaskProgram.unload();
         gDeferredSkinnedShadowFullbrightAlphaMaskProgram.unload();
@@ -2584,6 +2586,22 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		success = gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL);
 		llassert(success);
 	}
+    
+
+    if (success)
+    {
+        gDeferredShadowGLTFAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";
+        gDeferredShadowGLTFAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
+        gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.clear();
+        gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER));
+        gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
+        gDeferredShadowGLTFAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+        gDeferredShadowGLTFAlphaMaskProgram.clearPermutations();
+        gDeferredShadowGLTFAlphaMaskProgram.addPermutation("GLTF", "1");
+        gDeferredShadowGLTFAlphaMaskProgram.mRiggedVariant = &gDeferredSkinnedShadowAlphaMaskProgram;
+        success = gDeferredShadowGLTFAlphaMaskProgram.createShader(NULL, NULL);
+        llassert(success);
+    }
 
     if (success)
     {
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index d26750f230f..9ded72c6a7b 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -278,6 +278,7 @@ extern LLGLSLShader			gDeferredSoftenWaterProgram;
 extern LLGLSLShader			gDeferredShadowProgram;
 extern LLGLSLShader			gDeferredShadowCubeProgram;
 extern LLGLSLShader			gDeferredShadowAlphaMaskProgram;
+extern LLGLSLShader         gDeferredShadowGLTFAlphaMaskProgram;
 extern LLGLSLShader			gDeferredShadowFullbrightAlphaMaskProgram;
 extern LLGLSLShader			gDeferredPostProgram;
 extern LLGLSLShader			gDeferredCoFProgram;
-- 
GitLab