From e290dd3fa175c2a891cc4f4e0c401edb10cedfb4 Mon Sep 17 00:00:00 2001
From: Graham Linden <graham@lindenlab.com>
Date: Wed, 24 Jul 2013 04:03:27 -0700
Subject: [PATCH] NORSPEC-311 make post deferred (alpha objects) respect same
 gamma ramp as deferred (opaque objects)

---
 indra/llrender/llshadermgr.cpp                        |  3 ++-
 indra/llrender/llshadermgr.h                          |  3 ++-
 .../app_settings/shaders/class1/deferred/alphaF.glsl  | 11 +++++++++--
 .../shaders/class1/deferred/fullbrightF.glsl          |  5 +++++
 .../shaders/class1/deferred/materialF.glsl            |  9 +++++++--
 .../class1/deferred/postDeferredGammaCorrect.glsl     |  8 ++++++--
 .../shaders/class1/deferred/softenLightF.glsl         |  9 ++++++---
 .../shaders/class2/deferred/softenLightF.glsl         |  7 +++++--
 indra/newview/lldrawpoolalpha.cpp                     |  5 +++++
 indra/newview/pipeline.cpp                            |  4 ++--
 10 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index fea4ee28198..942f6dc86f1 100755
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1138,7 +1138,8 @@ void LLShaderMgr::initAttribsAndUniforms()
 	
 	mReservedUniforms.push_back("global_gamma");
 	mReservedUniforms.push_back("texture_gamma");
-	
+	mReservedUniforms.push_back("display_gamma");
+
 	mReservedUniforms.push_back("specular_color");
 	mReservedUniforms.push_back("env_intensity");
 
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index c049e935b83..2cbeea50497 100755
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -168,7 +168,8 @@ class LLShaderMgr
 		
 		GLOBAL_GAMMA,
 		TEXTURE_GAMMA,
-		
+		DISPLAY_GAMMA,
+
 		SPECULAR_COLOR,
 		ENVIRONMENT_INTENSITY,
 		
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index b9287613587..e836e9750fb 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -35,6 +35,8 @@ out vec4 frag_color;
 #define frag_color gl_FragColor
 #endif
 
+uniform float display_gamma;
+
 #if HAS_SHADOW
 uniform sampler2DShadow shadowMap0;
 uniform sampler2DShadow shadowMap1;
@@ -204,6 +206,11 @@ vec3 linear_to_srgb(vec3 cl)
     cs = {  1.055 * cl^0.41666 - 0.055,   0.0031308 <= cl < 1
             {  1.0,                                       cl >= 1*/
 
+	cl = clamp(cl, vec3(0), vec3(1));
+
+	if ((cl.r+cl.g+cl.b) < 0.0031308)
+		return 12.92 * cl;
+
 	return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
 }
 
@@ -295,7 +302,7 @@ void main()
 #ifdef USE_VERTEX_COLOR
 	float vertex_color_alpha = diff.a * vertex_color.a;	
 #else
-	float vertex_color_alpha = 1.0;
+	float vertex_color_alpha = diff.a;
 #endif
 	
 	vec3 normal = vary_norm; 
@@ -333,7 +340,7 @@ void main()
 
 	color.rgb += diff.rgb * vary_pointlight_col_linear * col.rgb;
 
-	color.rgb = linear_to_srgb(color.rgb);
+	color.rgb = pow(color.rgb,vec3(display_gamma));
 
 #ifdef WATER_FOG
 	color = applyWaterFogDeferred(pos.xyz, color);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index da2585f6625..da4ebfea58a 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -117,6 +117,11 @@ vec3 linear_to_srgb(vec3 cl)
     cs = {  1.055 * cl^0.41666 - 0.055,   0.0031308 <= cl < 1
             {  1.0,                                       cl >= 1*/
 
+	cl = clamp(cl, vec3(0), vec3(1));
+
+	if ((cl.r+cl.g+cl.b) < 0.0031308)
+		return 12.92 * cl;
+
 	return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index e028eef900f..a46fbd9516f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -53,6 +53,11 @@ vec3 linear_to_srgb(vec3 cl)
     cs = {  1.055 * cl^0.41666 - 0.055,   0.0031308 <= cl < 1
             {  1.0,                                       cl >= 1*/
 
+	cl = clamp(cl, vec3(0), vec3(1));
+
+	if ((cl.r+cl.g+cl.b) < 0.0031308)
+		return 12.92 * cl;
+
 	return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
 }
 
@@ -701,7 +706,7 @@ void main()
 		col += spec_contrib;
 	}
 
-	col = mix(col.rgb, old_diffcol.rgb, diffuse.a);
+	col = mix(col.rgb, diffcol.rgb, diffuse.a);
 
 	if (envIntensity > 0.0)
 	{
@@ -754,7 +759,7 @@ void main()
 	frag_color.a   = al;
 
 #else
-	//final_color.rgb = vec3(1,0,1);
+	//final_color.rgb = old_diffcol.rgb;
 	frag_data[0] = final_color;
 	frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
 	frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
index 59b027a0451..01f9d99682d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
@@ -36,7 +36,7 @@ uniform sampler2DRect diffuseRect;
 uniform vec2 screen_res;
 VARYING vec2 vary_fragcoord;
 
-uniform float texture_gamma;
+uniform float display_gamma;
 
 vec3 linear_to_srgb(vec3 cl)
 {
@@ -45,13 +45,17 @@ vec3 linear_to_srgb(vec3 cl)
     cs = {  1.055 * cl^0.41666 - 0.055,   0.0031308 <= cl < 1
             {  1.0,                                       cl >= 1*/
 
+	cl = clamp(cl, vec3(0), vec3(1));
+
+	if ((cl.r+cl.g+cl.b) < 0.0031308)
+		return 12.92 * cl;
 	return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
 }
 
 void main() 
 {
 	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord);
-	diff.rgb = pow(diff.rgb,vec3(texture_gamma));
+	diff.rgb = pow(diff.rgb,vec3(display_gamma));
 	frag_color = diff;
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 6f11e8427c2..045b449bbf4 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -101,6 +101,11 @@ vec3 linear_to_srgb(vec3 cl)
     cs = {  1.055 * cl^0.41666 - 0.055,   0.0031308 <= cl < 1
             {  1.0,                                       cl >= 1*/
 
+	cl = clamp(cl, vec3(0), vec3(1));
+
+	if ((cl.r+cl.g+cl.b) < 0.0031308)
+		return 12.92 * cl;
+
 	return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
 }
 
@@ -403,9 +408,7 @@ void main()
 		ambient = (1.0-ambient);
 
 		col.rgb *= ambient;
-
-		col += atmosAffectDirectionalLight(max(min(da, 1.0), 0.0));
-	
+		col += atmosAffectDirectionalLight(max(min(da, 1.0), 0.0));	
 		col *= diffuse.rgb;
 	
 		vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index dbb32c40f4a..fa67c4eceab 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -100,6 +100,11 @@ vec3 linear_to_srgb(vec3 cl)
     cs = {  1.055 * cl^0.41666 - 0.055,   0.0031308 <= cl < 1
             {  1.0,                                       cl >= 1*/
 
+	cl = clamp(cl, vec3(0), vec3(1));
+
+	if ((cl.r+cl.g+cl.b) < 0.0031308)
+		return 12.92 * cl;
+
 	return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
 }
 
@@ -467,8 +472,6 @@ void main()
 			bloom = fogged.a;
 		#endif
 
-
-
 		col = srgb_to_linear(col);
 
 		//col = vec3(1,0,1);
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 973e263572e..6302cf6b002 100755
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -103,13 +103,18 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
 			simple_shader = &gDeferredAlphaProgram;
 			fullbright_shader = &gDeferredFullbrightProgram;
 		}
+		
+		F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
 
 		fullbright_shader->bind();
 		fullbright_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); 
+		fullbright_shader->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
 		fullbright_shader->unbind();
 
 		//prime simple shader (loads shadow relevant uniforms)
 		gPipeline.bindDeferredShader(*simple_shader);
+
+		simple_shader->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
 	}
 	else
 	{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index c593c85ce73..165b28beb56 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8833,7 +8833,7 @@ void LLPipeline::renderDeferredLighting()
 		
 		F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
 
-		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
+		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
 		
 		gGL.begin(LLRender::TRIANGLE_STRIP);
 		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
@@ -9382,7 +9382,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target)
 		
 		F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
 
-		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
+		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
 		
 		gGL.begin(LLRender::TRIANGLE_STRIP);
 		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-- 
GitLab