From e371fdbf311e450ac0cc7f4d3fdacc938b489d92 Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Thu, 29 Apr 2021 08:41:50 -0700
Subject: [PATCH] SL-14113: Remove magic numbers. Take advantage of existing
 shader #defines injection by extending shader loading to make use of
 addConstant() instead of hard-coding magic number constants in each GLSL
 file.

---
 indra/llrender/llglslshader.cpp               | 22 +++++++++++++++++++
 indra/llrender/llglslshader.h                 | 12 +++++++++-
 .../shaders/class1/deferred/cloudsF.glsl      |  2 +-
 .../shaders/class1/deferred/moonF.glsl        |  2 +-
 .../shaders/class1/deferred/starsF.glsl       |  2 +-
 .../shaders/class1/environment/moonF.glsl     |  2 +-
 .../shaders/class1/environment/starsF.glsl    |  2 +-
 .../shaders/class1/windlight/moonF.glsl       |  2 +-
 .../shaders/class2/windlight/cloudsF.glsl     |  2 +-
 indra/newview/llviewershadermgr.cpp           |  8 +++++++
 10 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 74cfa60b27a..458f83aabe9 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -62,6 +62,23 @@ U32 LLGLSLShader::sTotalDrawCalls = 0;
 LLGLSLShader    gUIProgram;
 LLGLSLShader    gSolidColorProgram;
 
+// NOTE:Keep gShaderConsts* and LLGLSLShader::ShaderConsts_e in sync!
+const std::string gShaderConstsKey[ LLGLSLShader::NUM_SHADER_CONSTS ] =
+{
+	  "LL_SHADER_CONST_CLOUD_DEPTH"
+	, "LL_SHADER_CONST_MOON_DEPTH"
+	, "LL_SHADER_CONST_STAR_DEPTH"
+};
+
+// NOTE:Keep gShaderConsts* and LLGLSLShader::ShaderConsts_e in sync!
+const std::string gShaderConstsVal[ LLGLSLShader::NUM_SHADER_CONSTS ] =
+{
+	  "0.999985" // SHADER_CONST_CLOUD_DEPTH // SL-14113
+	, "0.999985" // SHADER_CONST_MOON_DEPTH  // SL-14113
+	, "0.999995" // SHADER_CONST_STAR_DEPTH  // SL-14113
+};
+
+
 BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
 {
     return v1 != v2;
@@ -755,6 +772,11 @@ void LLGLSLShader::addPermutation(std::string name, std::string value)
     mDefines[name] = value;
 }
 
+void LLGLSLShader::addConstant( const LLGLSLShader::eShaderConsts shader_const )
+{
+    addPermutation( gShaderConstsKey[ shader_const ], gShaderConstsVal[ shader_const ] );
+}
+
 void LLGLSLShader::removePermutation(std::string name)
 {
     mDefines[name].erase();
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 7cf6d3c941f..35e796e961c 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -67,6 +67,14 @@ class LLShaderFeatures
 class LLGLSLShader
 {
 public:
+    // NOTE:Keep gShaderConsts and LLGLSLShader::ShaderConsts_e in sync!
+    enum eShaderConsts
+    {
+          SHADER_CONST_CLOUD_DEPTH
+        , SHADER_CONST_MOON_DEPTH
+        , SHADER_CONST_STAR_DEPTH
+        , NUM_SHADER_CONSTS
+    };
 
 	enum 
 	{
@@ -149,7 +157,9 @@ class LLGLSLShader
     void clearPermutations();
 	void addPermutation(std::string name, std::string value);
 	void removePermutation(std::string name);
-	
+
+    void addConstant( const LLGLSLShader::eShaderConsts shader_const );
+
 	//enable/disable texture channel for specified uniform
 	//if given texture uniform is active in the shader, 
 	//the corresponding channel will be active upon return
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
index 187fed72e11..ad8ab771b84 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
@@ -126,6 +126,6 @@ void main()
     frag_data[1] = vec4(0.0,0.0,0.0,0.0);
     frag_data[2] = vec4(0,0,0,1);
 
-    gl_FragDepth = 0.999985; // SL-14113 Stars and Clouds need same depth
+    gl_FragDepth = LL_SHADER_CONST_CLOUD_DEPTH; // SL-14113 Stars and Clouds need same depth
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
index 59061944372..ffeaf2b6001 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
@@ -74,6 +74,6 @@ void main()
     frag_data[1] = vec4(0.0);
     frag_data[2] = vec4(0.0f);
 
-    gl_FragDepth = 0.999985f;
+    gl_FragDepth = LL_SHADER_CONST_MOON_DEPTH; // SL-14113
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
index b028c40ed9c..8d9c7e35079 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
@@ -67,6 +67,6 @@ void main()
     frag_data[1] = vec4(0.0f);
     frag_data[2] = vec4(0.0, 1.0, 0.0, 1.0);
 
-    gl_FragDepth = 0.999995f; // SL-14113 Moon Haze -- Stars need to depth test behind the moon
+    gl_FragDepth = LL_SHADER_CONST_STAR_DEPTH; // SL-14113 Moon Haze -- Stars need to depth test behind the moon
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/environment/moonF.glsl b/indra/newview/app_settings/shaders/class1/environment/moonF.glsl
index e1592c19fb4..983cd17979a 100644
--- a/indra/newview/app_settings/shaders/class1/environment/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/moonF.glsl
@@ -47,5 +47,5 @@ void main()
         discard;
 
     frag_color = color;
-    gl_FragDepth = 0.999985f; // SL-14113 Moon is infront of stars
+    gl_FragDepth = LL_SHADER_CONST_MOON_DEPTH; // SL-14113 Moon is infront of stars
 }
diff --git a/indra/newview/app_settings/shaders/class1/environment/starsF.glsl b/indra/newview/app_settings/shaders/class1/environment/starsF.glsl
index 95ab4cbf8b7..e1a9cc6387c 100644
--- a/indra/newview/app_settings/shaders/class1/environment/starsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/starsF.glsl
@@ -47,5 +47,5 @@ void main()
     color.a *= max(custom_alpha, vertex_color.a);
 
     frag_color = color;
-    gl_FragDepth = 0.999995f; // SL-14113 Moon Haze -- Stars need to depth test behind the moon
+    gl_FragDepth = LL_SHADER_CONST_STAR_DEPTH; // SL-14113 Moon Haze -- Stars need to depth test behind the moon
 }
diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
index 327accbd3b8..293e09620fd 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl
@@ -68,6 +68,6 @@ void main()
          c.rgb  = scaleSoftClip(c.rgb);
 
     frag_color = vec4(c.rgb, c.a);
-    gl_FragDepth = 0.999985f; // SL-14113
+    gl_FragDepth = LL_SHADER_CONST_MOON_DEPTH; // SL-14113
 }
 
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
index 1c592402d4f..ec53ae75f9b 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
@@ -132,6 +132,6 @@ void main()
     // camera above water: class1\deferred\cloudsF.glsl
     // camera below water: class2\windlight\coudsV.glsl
     // See: starsV.glsl, cloudsV.glsl, moonF.glsl
-    gl_FragDepth = 0.999985;
+    gl_FragDepth = LL_SHADER_CONST_CLOUD_DEPTH;
 }
 
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 8eb57799c94..1dcd9289ef3 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -1063,6 +1063,7 @@ BOOL LLViewerShaderMgr::loadShadersEnvironment()
 		gStarsProgram.mShaderFiles.push_back(make_pair("environment/starsV.glsl", GL_VERTEX_SHADER_ARB));
 		gStarsProgram.mShaderFiles.push_back(make_pair("environment/starsF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gStarsProgram.mShaderLevel = mShaderLevel[SHADER_ENVIRONMENT];
+        gStarsProgram.addConstant( LLGLSLShader::SHADER_CONST_STAR_DEPTH ); // SL-14113
 		success = gStarsProgram.createShader(NULL, NULL);
 		llassert(success);
 	}
@@ -1074,8 +1075,10 @@ BOOL LLViewerShaderMgr::loadShadersEnvironment()
 		gMoonProgram.mShaderFiles.push_back(make_pair("environment/moonV.glsl", GL_VERTEX_SHADER_ARB));
 		gMoonProgram.mShaderFiles.push_back(make_pair("environment/moonF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gMoonProgram.mShaderLevel = mShaderLevel[SHADER_ENVIRONMENT];
+        gMoonProgram.addConstant( LLGLSLShader::SHADER_CONST_MOON_DEPTH ); // SL-14113
 		success = gMoonProgram.createShader(NULL, NULL);
 		if (success)
+
 		{
 			gMoonProgram.bind();
 			gMoonProgram.uniform1i(sTex0, 0);
@@ -2750,6 +2753,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredWLCloudProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 		gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+        gDeferredWLCloudProgram.addConstant( LLGLSLShader::SHADER_CONST_CLOUD_DEPTH ); // SL-14113
 		success = gDeferredWLCloudProgram.createShader(NULL, NULL);
 		llassert(success);
 	}
@@ -2789,6 +2793,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         gDeferredWLMoonProgram.mShaderFiles.push_back(make_pair("deferred/moonF.glsl", GL_FRAGMENT_SHADER_ARB));
         gDeferredWLMoonProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
         gDeferredWLMoonProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+        gDeferredWLMoonProgram.addConstant( LLGLSLShader::SHADER_CONST_MOON_DEPTH ); // SL-14113
  	 	success = gDeferredWLMoonProgram.createShader(NULL, NULL);
         llassert(success);
  	}
@@ -2801,6 +2806,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredStarProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 		gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+        gDeferredStarProgram.addConstant( LLGLSLShader::SHADER_CONST_STAR_DEPTH ); // SL-14113
 		success = gDeferredStarProgram.createShader(NULL, NULL);
         llassert(success);
 	}
@@ -4157,6 +4163,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
         gWLCloudProgram.mShaderFiles.push_back(make_pair("windlight/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));
         gWLCloudProgram.mShaderLevel = mShaderLevel[SHADER_WINDLIGHT];
         gWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+        gWLCloudProgram.addConstant( LLGLSLShader::SHADER_CONST_CLOUD_DEPTH ); // SL-14113
         success = gWLCloudProgram.createShader(NULL, NULL);
     }
 
@@ -4193,6 +4200,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
         gWLMoonProgram.mShaderFiles.push_back(make_pair("windlight/moonF.glsl", GL_FRAGMENT_SHADER_ARB));
         gWLMoonProgram.mShaderLevel = mShaderLevel[SHADER_WINDLIGHT];
         gWLMoonProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+        gWLMoonProgram.addConstant( LLGLSLShader::SHADER_CONST_MOON_DEPTH ); // SL-14113
         success = gWLMoonProgram.createShader(NULL, NULL);
     }
 
-- 
GitLab