From 0940e8871894e08da80730d11c31cbd252a05b35 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Tue, 24 May 2022 10:34:47 -0500
Subject: [PATCH] SL-17472 Add checkbox to preferences for enabling "PBR" that
 uses "class3" deferred shaders.  Move reflection probe shaders to class3 and
 restore class2 shaders to non-reflection probe versions.

---
 indra/newview/app_settings/settings.xml       |  12 +
 .../class1/deferred/fullbrightShinyF.glsl     |  50 +-
 .../shaders/class1/deferred/materialF.glsl    |  64 ++-
 .../shaders/class2/deferred/softenLightF.glsl |  52 +-
 .../class3/deferred/attachmentShadowF.glsl    |  44 --
 .../class3/deferred/attachmentShadowV.glsl    |  49 --
 .../class3/deferred/avatarShadowF.glsl        |  52 --
 .../class3/deferred/avatarShadowV.glsl        |  68 ---
 .../shaders/class3/deferred/cloudShadowF.glsl | 119 -----
 .../shaders/class3/deferred/cloudShadowV.glsl |  63 ---
 .../shaders/class3/deferred/cloudsF.glsl      | 166 ------
 .../shaders/class3/deferred/cloudsV.glsl      |  70 ---
 .../shaders/class3/deferred/deferredUtil.glsl |  79 ---
 .../class3/deferred/depthToShadowVolumeG.glsl | 202 --------
 .../class3/deferred/fullbrightShinyF.glsl     | 122 +++++
 .../shaders/class3/deferred/gatherSkyShF.glsl |  70 ---
 .../shaders/class3/deferred/gatherSkyShV.glsl |  40 --
 .../shaders/class3/deferred/genSkyShF.glsl    | 111 ----
 .../shaders/class3/deferred/genSkyShV.glsl    |  37 --
 .../shaders/class3/deferred/indirect.glsl     |  44 --
 .../shaders/class3/deferred/materialF.glsl    | 455 +++++++++++++++++
 .../class3/deferred/multiSpotLightF.glsl      | 291 -----------
 .../class3/deferred/pointShadowBlurF.glsl     |  37 --
 .../class3/deferred/reflectionProbeF.glsl     | 476 ++++++++++++++++++
 .../shaders/class3/deferred/shVisF.glsl       |  73 ---
 .../shaders/class3/deferred/shVisV.glsl       |  33 --
 .../class3/deferred/shadowAlphaBlendF.glsl    |  58 ---
 .../class3/deferred/shadowAlphaBlendV.glsl    |  66 ---
 .../class3/deferred/shadowAlphaMaskF.glsl     |  74 ---
 .../class3/deferred/shadowAlphaMaskV.glsl     |  67 ---
 .../shaders/class3/deferred/shadowCubeV.glsl  |  50 --
 .../shaders/class3/deferred/shadowF.glsl      |  49 --
 .../shaders/class3/deferred/shadowUtil.glsl   | 157 ------
 .../shaders/class3/deferred/shadowV.glsl      |  62 ---
 .../shaders/class3/deferred/skyF.glsl         | 126 -----
 .../shaders/class3/deferred/skyV.glsl         |  37 --
 .../shaders/class3/deferred/softenLightF.glsl | 239 ++++-----
 .../shaders/class3/deferred/softenLightV.glsl |  38 --
 .../shaders/class3/deferred/spotLightF.glsl   | 287 -----------
 .../shaders/class3/deferred/sunLightF.glsl    |  57 ---
 .../class3/deferred/sunLightSSAOF.glsl        |  61 ---
 .../shaders/class3/deferred/sunLightV.glsl    |  41 --
 .../shaders/class3/deferred/treeShadowF.glsl  |  59 ---
 .../shaders/class3/deferred/treeShadowV.glsl  |  43 --
 .../shaders/class3/deferred/underWaterF.glsl  | 115 -----
 .../shaders/class3/deferred/waterF.glsl       | 174 -------
 .../shaders/class3/deferred/waterV.glsl       |  95 ----
 indra/newview/llfloaterpreference.cpp         |   6 +
 indra/newview/llviewercontrol.cpp             |   4 +-
 indra/newview/llviewershadermgr.cpp           |  35 +-
 indra/newview/llvopartgroup.cpp               |   1 +
 indra/newview/pipeline.cpp                    |  10 +-
 indra/newview/pipeline.h                      |   1 +
 .../xui/en/panel_preferences_graphics1.xml    |  18 +-
 54 files changed, 1316 insertions(+), 3593 deletions(-)
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/cloudsV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl
 create mode 100644 indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/indirect.glsl
 create mode 100644 indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl
 create mode 100644 indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/skyF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/skyV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/waterF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/deferred/waterV.glsl

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 874d685ef42..f6c5d46c33e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -9599,6 +9599,18 @@
     <real>368.0</real>
   </map>
 
+  <key>RenderPBR</key>
+  <map>
+    <key>Comment</key>
+    <string>Use PBR rendering pipeline (Physically Based Rendering).</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
+
   <key>RenderDeferred</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
index a04f611440b..9fcee04c325 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl
@@ -35,11 +35,10 @@ out vec4 frag_color;
 uniform sampler2D diffuseMap;
 #endif
 
-
 VARYING vec4 vertex_color;
 VARYING vec2 vary_texcoord0;
 VARYING vec3 vary_texcoord1;
-VARYING vec3 vary_position;
+VARYING vec4 vary_position;
 
 uniform samplerCube environmentMap;
 
@@ -55,14 +54,6 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
 vec3 linear_to_srgb(vec3 c);
 vec3 srgb_to_linear(vec3 c);
 
-#ifdef HAS_REFLECTION_PROBES
-// reflection probe interface
-void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv, 
-        vec3 pos, vec3 norm, float glossiness, float envIntensity);
-void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
-void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
-#endif
-
 // See:
 //   class1\deferred\fullbrightShinyF.glsl
 //   class1\lighting\lightFullbrightShinyF.glsl
@@ -79,29 +70,21 @@ void main()
 	// SL-9632 HUDs are affected by Atmosphere
 	if (no_atmo == 0)
 	{
-        vec3 sunlit;
-        vec3 amblit;
-        vec3 additive;
-        vec3 atten;
-        vec3 pos = vary_position;
-        calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
-
-        float env_intensity = vertex_color.a;
-#ifndef HAS_REFLECTION_PROBES
-        vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	
-        color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
-#else
-        vec3 ambenv;
-        vec3 glossenv;
-        vec3 legacyenv;
-        vec3 norm = normalize(vary_texcoord1.xyz);
-        vec4 spec = vec4(0,0,0,0);
-        sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, env_intensity);
-        legacyenv *= 1.5; // fudge brighter
-        applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity);
-#endif
-        color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
-        color.rgb = fullbrightScaleSoftClip(color.rgb);
+	vec3 sunlit;
+	vec3 amblit;
+	vec3 additive;
+	vec3 atten;
+		vec3 pos = vary_position.xyz/vary_position.w;
+
+	calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
+	
+	vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	
+	float env_intensity = vertex_color.a;
+
+	//color.rgb = srgb_to_linear(color.rgb);
+		color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
+	color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
+	color.rgb = fullbrightScaleSoftClip(color.rgb);
 	}
 
 /*
@@ -115,6 +98,7 @@ void main()
 */
 
 	color.a = 1.0;
+
 	//color.rgb = linear_to_srgb(color.rgb);
 
 	frag_color = color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index c5b1937cfb6..02d83925eaa 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -64,13 +64,6 @@ out vec4 frag_color;
 float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
 #endif
 
-#ifdef HAS_REFLECTION_PROBES
-void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, 
-        vec3 pos, vec3 norm, float glossiness, float envIntensity);
-void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
-void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
-#endif
-
 uniform samplerCube environmentMap;
 uniform sampler2D     lightFunc;
 
@@ -329,16 +322,6 @@ void main()
     // lighting from the sun stays sharp
     float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
     da = pow(da, 1.0 / 1.3);
-    vec3 sun_contrib = min(da, shadow) * sunlit;
-
-#ifdef HAS_REFLECTION_PROBES
-    vec3 ambenv;
-    vec3 glossenv;
-    vec3 legacyenv;
-    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
-    amblit = max(ambenv, amblit);
-    color.rgb = amblit;
-#else
 
     color = amblit;
 
@@ -350,8 +333,9 @@ void main()
     ambient *= ambient;
     ambient = (1.0 - ambient);
 
+    vec3 sun_contrib = min(da, shadow) * sunlit;
+    
     color *= ambient;
-#endif
 
     color += sun_contrib;
 
@@ -361,6 +345,35 @@ void main()
 
     if (spec.a > 0.0)  // specular reflection
     {
+        /*  // Reverting this specular calculation to previous 'dumbshiny' version - DJH 6/17/2020
+            // Preserving the refactored version as a comment for potential reconsideration,
+            // overriding the general rule to avoid pollutiong the source with commented code.
+            //
+            //  If you're reading this in 2021+, feel free to obliterate.
+
+        vec3 npos = -normalize(pos.xyz);
+
+        //vec3 ref = dot(pos+lv, norm);
+        vec3 h = normalize(light_dir.xyz + npos);
+        float nh = dot(norm.xyz, h);
+        float nv = dot(norm.xyz, npos);
+        float vh = dot(npos, h);
+        float sa = nh;
+        float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
+
+        float gtdenom = 2 * nh;
+        float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
+
+        if (nh > 0.0)
+        {
+            float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
+            vec3 sp = sun_contrib*scol / 6.0f;
+            sp = clamp(sp, vec3(0), vec3(1));
+            bloom = dot(sp, sp) / 4.0;
+            color += sp * spec.rgb;
+        }
+        */
+
         float sa        = dot(refnormpersp, sun_dir.xyz);
         vec3  dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r);
 
@@ -372,24 +385,10 @@ void main()
         glare = max(glare, spec_contrib.b);
 
         color += spec_contrib;
-
-#ifdef HAS_REFLECTION_PROBES
-        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
-#endif
     }
 
-
     color = mix(color.rgb, diffcol.rgb, diffuse.a);
 
-#ifdef HAS_REFLECTION_PROBES
-    if (envIntensity > 0.0)
-    {  // add environmentmap
-        //fudge darker
-        legacyenv *= 0.5*diffuse.a+0.5;
-        
-        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
-    }
-#else
     if (envIntensity > 0.0)
     {
         //add environmentmap
@@ -404,7 +403,6 @@ void main()
         cur_glare *= envIntensity*4.0;
         glare += cur_glare;
     }
-#endif
 
     color = atmosFragLighting(color, additive, atten);
     color = scaleSoftClipFrag(color);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index d88400dddb5..7700d16007a 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -26,10 +26,7 @@
 #extension GL_ARB_texture_rectangle : enable
 #extension GL_ARB_shader_texture_lod : enable
 
-#define FLT_MAX 3.402823466e+38
-
-#define REFMAP_COUNT 256
-#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider
+/*[EXTRA_CODE_HERE]*/
 
 #ifdef DEFINE_GL_FRAGCOLOR
 out vec4 frag_color;
@@ -42,6 +39,7 @@ uniform sampler2DRect specularRect;
 uniform sampler2DRect normalMap;
 uniform sampler2DRect lightMap;
 uniform sampler2DRect depthMap;
+uniform samplerCube   environmentMap;
 uniform sampler2D     lightFunc;
 
 uniform float blur_size;
@@ -68,12 +66,6 @@ vec3  scaleSoftClipFrag(vec3 l);
 vec3  fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
 vec3  fullbrightScaleSoftClip(vec3 light);
 
-// reflection probe interface
-void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv, 
-        vec3 pos, vec3 norm, float glossiness, float envIntensity);
-void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
-void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
-
 vec3 linear_to_srgb(vec3 c);
 vec3 srgb_to_linear(vec3 c);
 
@@ -111,53 +103,40 @@ void main()
     vec3 amblit;
     vec3 additive;
     vec3 atten;
-
     calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
 
-    //vec3 amb_vec = env_mat * norm.xyz;
+    color.rgb = amblit;
 
-    vec3 ambenv;
-    vec3 glossenv;
-    vec3 legacyenv;
-    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
-
-    amblit = max(ambenv, amblit);
-    color.rgb = amblit*ambocc;
-
-    //float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
-    //ambient *= 0.5;
-    //ambient *= ambient;
-    //ambient = (1.0 - ambient);
-    //color.rgb *= ambient;
+    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
+    ambient *= 0.5;
+    ambient *= ambient;
+    ambient = (1.0 - ambient);
+    color.rgb *= ambient;
 
     vec3 sun_contrib = min(da, scol) * sunlit;
     color.rgb += sun_contrib;
-    color.rgb = min(color.rgb, vec3(1,1,1));
     color.rgb *= diffuse.rgb;
 
-    vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
+    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
 
     if (spec.a > 0.0)  // specular reflection
     {
-        float sa        = dot(normalize(refnormpersp), light_dir.xyz);
+        float sa        = dot(refnormpersp, light_dir.xyz);
         vec3  dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
 
         // add the two types of shiny together
         vec3 spec_contrib = dumbshiny * spec.rgb;
         bloom             = dot(spec_contrib, spec_contrib) / 6;
         color.rgb += spec_contrib;
-
-        // add reflection map - EXPERIMENTAL WORK IN PROGRESS
-        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
     }
 
     color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
 
     if (envIntensity > 0.0)
     {  // add environmentmap
-        //fudge darker
-        legacyenv *= 0.5*diffuse.a+0.5;;
-        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
+        vec3 env_vec         = env_mat * refnormpersp;
+        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
+        color                = mix(color.rgb, reflected_color, envIntensity);
     }
 
     if (norm.w < 0.5)
@@ -174,9 +153,6 @@ void main()
 
     // convert to linear as fullscreen lights need to sum in linear colorspace
     // and will be gamma (re)corrected downstream...
-    //color = vec3(ambocc);
-    //color = ambenv;
-    //color.b = diffuse.a;
     frag_color.rgb = srgb_to_linear(color.rgb);
-    frag_color.a = bloom;
+    frag_color.a   = bloom;
 }
diff --git a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl
deleted file mode 100644
index d973326f935..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl
+++ /dev/null
@@ -1,44 +0,0 @@
-/** 
- * @file avatarShadowF.glsl
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2D diffuseMap;
-
-VARYING vec4 pos;
-VARYING vec2 vary_texcoord0;
-
-vec4 computeMoments(float depth, float a);
-
-void main() 
-{
-    frag_color = computeMoments(length(pos), 1.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl
deleted file mode 100644
index 1a655e64671..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/** 
- * @file attachmentShadowV.glsl
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 projection_matrix;
-uniform mat4 modelview_matrix;
-uniform mat4 texture_matrix0;
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec2 texcoord0;
-
-mat4 getObjectSkinnedTransform();
-
-VARYING vec4 pos;
-
-void main()
-{
-	//transform vertex
-	mat4 mat = getObjectSkinnedTransform();
-	
-	mat = modelview_matrix * mat;
-	pos = (mat*vec4(position.xyz, 1.0));
-	pos = projection_matrix * vec4(pos.xyz, 1.0);
-
-#if !defined(DEPTH_CLAMP)
-	pos.z = max(pos.z, -pos.w+0.01);
-#endif
-	gl_Position = pos;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl
deleted file mode 100644
index 48eefc7a73c..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-/** 
- * @file avatarShadowF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-/*[EXTRA_CODE_HERE]*/ 
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2D diffuseMap;
-
-#if !defined(DEPTH_CLAMP)
-VARYING vec4 post_pos;
-#endif
-
-VARYING vec4 pos;
-
-vec4 computeMoments(float depth, float a);
-
-void main() 
-{
-    frag_color = computeMoments(length(pos), 1.0);
-
-#if !defined(DEPTH_CLAMP)
-	gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
-#endif
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl
deleted file mode 100644
index 164b355f208..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl
+++ /dev/null
@@ -1,68 +0,0 @@
-/** 
- * @file avatarShadowV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-uniform mat4 projection_matrix;
-
-mat4 getSkinnedTransform();
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec3 normal;
-ATTRIBUTE vec2 texcoord0;
-
-#if !defined(DEPTH_CLAMP)
-VARYING vec4 post_pos;
-#endif
-
-VARYING vec4 pos;
-
-void main()
-{
-	vec3 norm;
-	
-	vec4 pos_in = vec4(position.xyz, 1.0);
-	mat4 trans = getSkinnedTransform();
-
-	pos.x = dot(trans[0], pos_in);
-	pos.y = dot(trans[1], pos_in);
-	pos.z = dot(trans[2], pos_in);
-	pos.w = 1.0;
-	
-	norm.x = dot(trans[0].xyz, normal);
-	norm.y = dot(trans[1].xyz, normal);
-	norm.z = dot(trans[2].xyz, normal);
-	norm = normalize(norm);
-	
-	pos = projection_matrix * pos;
-
-#if !defined(DEPTH_CLAMP)
-	post_pos = pos;
-	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-#else
-	gl_Position = pos;
-#endif
-
-}
-
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl
deleted file mode 100644
index 32210f60dc2..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl
+++ /dev/null
@@ -1,119 +0,0 @@
-/** 
- * @file class3/deferred/cloudsF.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2D diffuseMap;
-
-VARYING vec4 pos;
-VARYING float target_pos_x;
-VARYING float vary_CloudDensity;
-VARYING vec2 vary_texcoord0;
-VARYING vec2 vary_texcoord1;
-VARYING vec2 vary_texcoord2;
-VARYING vec2 vary_texcoord3;
-
-uniform sampler2D cloud_noise_texture;
-uniform sampler2D cloud_noise_texture_next;
-uniform float blend_factor;
-uniform vec4 cloud_pos_density1;
-uniform vec4 cloud_pos_density2;
-uniform vec4 cloud_color;
-uniform float cloud_shadow;
-uniform float cloud_scale;
-uniform float cloud_variance;
-uniform vec3 camPosLocal;
-uniform vec3 sun_dir;
-uniform float sun_size;
-uniform float far_z;
-
-vec4 cloudNoise(vec2 uv)
-{
-   vec4 a = texture2D(cloud_noise_texture, uv);
-   vec4 b = texture2D(cloud_noise_texture_next, uv);
-   vec4 cloud_noise_sample = mix(a, b, blend_factor);
-   return normalize(cloud_noise_sample);
-}
-
-vec4 computeMoments(float depth, float alpha);
-
-void main()
-{
-    if (cloud_scale >= 0.001)
-    {
-        // Set variables
-        vec2 uv1 = vary_texcoord0.xy;
-        vec2 uv2 = vary_texcoord1.xy;
-        vec2 uv3 = vary_texcoord2.xy;
-        float cloudDensity = 2.0 * (cloud_shadow - 0.25);
-    
-        vec2 uv4 = vary_texcoord3.xy;
-    
-        vec2 disturbance  = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f);
-        vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f);
-    
-        // Offset texture coords
-        uv1 += cloud_pos_density1.xy + (disturbance * 0.2);    //large texture, visible density
-        uv2 += cloud_pos_density1.xy;   //large texture, self shadow
-        uv3 += cloud_pos_density2.xy;   //small texture, visible density
-        uv4 += cloud_pos_density2.xy;   //small texture, self shadow
-    
-        float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y) * 4.0);
-    
-        cloudDensity *= 1.0 - (density_variance * density_variance);
-    
-        // Compute alpha1, the main cloud opacity
-        float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z;
-        alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.);
-    
-        // And smooth
-        alpha1 = 1. - alpha1 * alpha1;
-        alpha1 = 1. - alpha1 * alpha1;  
-    
-        if (alpha1 < 0.001f)
-        {
-            discard;
-        }
-    
-        // Compute alpha2, for self shadowing effect
-        // (1 - alpha2) will later be used as percentage of incoming sunlight
-        float alpha2 = (cloudNoise(uv2).x - 0.5);
-        alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
-    
-        // And smooth
-        alpha2 = 1. - alpha2;
-        alpha2 = 1. - alpha2 * alpha2;  
-    
-        frag_color = computeMoments(length(pos), alpha1);
-    }
-    else
-    {
-        frag_color = vec4(0);
-    }
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl
deleted file mode 100644
index effb070f934..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl
+++ /dev/null
@@ -1,63 +0,0 @@
-/** 
- * @file cloudShadowV.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 texture_matrix0;
-uniform mat4 modelview_projection_matrix;
-uniform float shadow_target_width;
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec4 diffuse_color;
-ATTRIBUTE vec2 texcoord0;
-
-#if !defined(DEPTH_CLAMP)
-VARYING float pos_zd2;
-#endif
-
-VARYING vec4 pos;
-VARYING float target_pos_x;
-VARYING vec2 vary_texcoord0;
-VARYING vec4 vertex_color;
-
-void passTextureIndex();
-
-void main()
-{
-	//transform vertex
-	vec4 pre_pos = vec4(position.xyz, 1.0);
-	pos = modelview_projection_matrix * pre_pos;
-	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
-
-#if !defined(DEPTH_CLAMP)
-	pos_zd2 = pos.z * 0.5;
-	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-#else
-	gl_Position = pos;
-#endif
-	
-	passTextureIndex();
-
-	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-	vertex_color = diffuse_color;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl
deleted file mode 100644
index e40d7e7c753..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl
+++ /dev/null
@@ -1,166 +0,0 @@
-/** 
- * @file class3/deferred/cloudsF.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
-
-/////////////////////////////////////////////////////////////////////////
-// The fragment shader for the sky
-/////////////////////////////////////////////////////////////////////////
-
-VARYING vec4 vary_CloudColorSun;
-VARYING vec4 vary_CloudColorAmbient;
-VARYING float vary_CloudDensity;
-VARYING vec2 vary_texcoord0;
-VARYING vec2 vary_texcoord1;
-VARYING vec2 vary_texcoord2;
-VARYING vec2 vary_texcoord3;
-VARYING vec3 vary_pos;
-
-uniform sampler2D cloud_noise_texture;
-uniform sampler2D cloud_noise_texture_next;
-uniform float blend_factor;
-uniform vec4 cloud_pos_density1;
-uniform vec4 cloud_pos_density2;
-uniform vec4 cloud_color;
-uniform float cloud_shadow;
-uniform float cloud_scale;
-uniform float cloud_variance;
-uniform vec3 camPosLocal;
-uniform vec3 sun_dir;
-uniform float sun_size;
-uniform float far_z;
-
-uniform sampler2D transmittance_texture;
-uniform sampler3D scattering_texture;
-uniform sampler3D single_mie_scattering_texture;
-uniform sampler2D irradiance_texture;
-uniform sampler2D sh_input_r;
-uniform sampler2D sh_input_g;
-uniform sampler2D sh_input_b;
-
-vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
-
-/// Soft clips the light with a gamma correction
-vec3 scaleSoftClip(vec3 light);
-
-vec4 cloudNoise(vec2 uv)
-{
-   vec4 a = texture2D(cloud_noise_texture, uv);
-   vec4 b = texture2D(cloud_noise_texture_next, uv);
-   vec4 cloud_noise_sample = mix(a, b, blend_factor);
-   return cloud_noise_sample;
-}
-
-void main()
-{
-    // Set variables
-    vec2 uv1 = vary_texcoord0.xy;
-    vec2 uv2 = vary_texcoord1.xy;
-    vec2 uv3 = vary_texcoord2.xy;
-    float cloudDensity = 2.0 * (cloud_shadow - 0.25);
-
-    if (cloud_scale < 0.001)
-    {
-        discard;
-    }
-
-    vec2 uv4 = vary_texcoord3.xy;
-
-    vec2 disturbance = vec2(cloudNoise(uv1 / 16.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f);
-
-    // Offset texture coords
-    uv1 += cloud_pos_density1.xy + (disturbance * 0.2); //large texture, visible density
-    uv2 += cloud_pos_density1.xy;   //large texture, self shadow
-    uv3 += cloud_pos_density2.xy; //small texture, visible density
-    uv4 += cloud_pos_density2.xy;   //small texture, self shadow
-
-    float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0) * 4.0);
-
-    cloudDensity *= 1.0 - (density_variance * density_variance);
-
-    // Compute alpha1, the main cloud opacity
-    float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z;
-    alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.);
-
-    // And smooth
-    alpha1 = 1. - alpha1 * alpha1;
-    alpha1 = 1. - alpha1 * alpha1;  
-
-    if (alpha1 < 0.001f)
-    {
-        discard;
-    }
-
-    // Compute alpha2, for self shadowing effect
-    // (1 - alpha2) will later be used as percentage of incoming sunlight
-    float alpha2 = (cloudNoise(uv2).x - 0.5);
-    alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
-
-    // And smooth
-    alpha2 = 1. - alpha2;
-    alpha2 = 1. - alpha2 * alpha2;  
-
-    vec3 view_ray = vary_pos.xyz + camPosLocal;
-
-    vec3 view_direction = normalize(view_ray);
-    vec3 sun_direction  = normalize(sun_dir);
-    vec3 earth_center   = vec3(0, 0, -6360.0f);
-    vec3 camPos = (camPosLocal / 1000.0f) - earth_center;
-
-    vec3 transmittance;
-    vec3 radiance_sun  = GetSkyLuminance(camPos, view_direction, 1.0 - alpha1, sun_direction, transmittance);
-
-    vec3 sun_color = vec3(1.0) - exp(-radiance_sun * 0.0001);
-
-    // Combine
-    vec4 color;
-
-    vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
-
-    vec4 l1r = texture2D(sh_input_r, vec2(0,0));
-    vec4 l1g = texture2D(sh_input_g, vec2(0,0));
-    vec4 l1b = texture2D(sh_input_b, vec2(0,0));
-
-    vec3 sun_indir = vec3(-view_direction.xy, view_direction.z);
-    vec3 amb = vec3(dot(l1r, l1tap * vec4(1, sun_indir)),
-                    dot(l1g, l1tap * vec4(1, sun_indir)),
-                    dot(l1b, l1tap * vec4(1, sun_indir)));
-
-
-    amb = max(vec3(0), amb);
-
-    color.rgb = sun_color * cloud_color.rgb * (1. - alpha2);
-    color.rgb = pow(color.rgb, vec3(1.0 / 2.2));
-    color.rgb += amb;
-
-    frag_data[0] = vec4(color.rgb, alpha1);
-    frag_data[1] = vec4(0);
-    frag_data[2] = vec4(0,1,0,1);
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudsV.glsl
deleted file mode 100644
index 71e422ddf06..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/cloudsV.glsl
+++ /dev/null
@@ -1,70 +0,0 @@
-/** 
- * @file WLCloudsV.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 modelview_projection_matrix;
-uniform mat4 modelview_matrix;
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec2 texcoord0;
-
-//////////////////////////////////////////////////////////////////////////
-// The vertex shader for creating the atmospheric sky
-///////////////////////////////////////////////////////////////////////////////
-
-// Output parameters
-VARYING vec2 vary_texcoord0;
-VARYING vec2 vary_texcoord1;
-VARYING vec2 vary_texcoord2;
-VARYING vec2 vary_texcoord3;
-VARYING vec3 vary_pos;
-
-// Inputs
-uniform float cloud_scale;
-uniform vec4  lightnorm;
-uniform vec3  camPosLocal;
-
-void main()
-{
-    vary_pos = position;
-
-    // World / view / projection
-    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
-
-    // Texture coords
-    vary_texcoord0 = texcoord0;
-    vary_texcoord0.xy -= 0.5;
-    vary_texcoord0.xy /= max(0.001, cloud_scale);
-    vary_texcoord0.xy += 0.5;
-
-    vary_texcoord1 = vary_texcoord0;
-    vary_texcoord1.x += lightnorm.x * 0.0125;
-    vary_texcoord1.y += lightnorm.z * 0.0125;
-
-    vary_texcoord2 = vary_texcoord0 * 16.;
-    vary_texcoord3 = vary_texcoord1 * 16.;
-
-    // END CLOUDS
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl
deleted file mode 100644
index e27bbce0948..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl
+++ /dev/null
@@ -1,79 +0,0 @@
-/** 
- * @file class1/deferred/deferredUtil.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect   normalMap;
-uniform sampler2DRect   depthMap;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-vec2 getScreenCoordinate(vec2 screenpos)
-{
-    vec2 sc = screenpos.xy * 2.0;
-    if (screen_res.x > 0 && screen_res.y > 0)
-    {
-       sc /= screen_res;
-    }
-    return sc - vec2(1.0, 1.0);
-}
-
-vec3 getNorm(vec2 screenpos)
-{
-   vec2 enc = texture2DRect(normalMap, screenpos.xy).xy;
-   vec2 fenc = enc*4-2;
-   float f = dot(fenc,fenc);
-   float g = sqrt(1-f/4);
-   vec3 n;
-   n.xy = fenc*g;
-   n.z = 1-f/2;
-   return n;
-}
-
-float getDepth(vec2 pos_screen)
-{
-    float depth = texture2DRect(depthMap, pos_screen).r;
-    return depth;
-}
-
-vec4 getPosition(vec2 pos_screen)
-{
-    float depth = getDepth(pos_screen);
-    vec2 sc = getScreenCoordinate(pos_screen);
-    vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
-    vec4 pos = inv_proj * ndc;
-    pos /= pos.w;
-    pos.w = 1.0;
-    return pos;
-}
-
-vec4 getPositionWithDepth(vec2 pos_screen, float depth)
-{
-    vec2 sc = getScreenCoordinate(pos_screen);
-    vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
-    vec4 pos = inv_proj * ndc;
-    pos /= pos.w;
-    pos.w = 1.0;
-    return pos;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl b/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl
deleted file mode 100644
index cdaff4b09f7..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl
+++ /dev/null
@@ -1,202 +0,0 @@
-/** 
- * @file depthToShadowVolumeG.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-#extension GL_ARB_geometry_shader4  : enable
-#extension GL_ARB_texture_rectangle : enable
-
-/*[EXTRA_CODE_HERE]*/
-
-layout (triangles) in;
-layout (triangle_strip, max_vertices = 128) out;
-
-uniform sampler2DRect depthMap;
-uniform mat4 shadowMatrix[6]; 
-uniform vec4 lightpos;
-
-VARYING vec2 vary_texcoord0;
-
-out vec3 to_vec;
-
-void cross_products(out vec4 ns[3], int a, int b, int c)
-{
-   ns[0] = cross(gl_PositionIn[b].xyz - gl_PositionIn[a].xyz, gl_PositionIn[c].xyz - gl_PositionIn[a].xyz);
-   ns[1] = cross(gl_PositionIn[c].xyz - gl_PositionIn[b].xyz, gl_PositionIn[a].xyz - gl_PositionIn[b].xyz);
-   ns[2] = cross(gl_PositionIn[a].xyz - gl_PositionIn[c].xyz, gl_PositionIn[b].xyz - gl_PositionIn[c].xyz);
-}
-
-vec3 getLightDirection(vec4 lightpos, vec3 pos)
-{
-
-    vec3 lightdir = lightpos.xyz - lightpos.w * pos;
-    return lightdir;
-}
-
-void emitTri(vec4 v[3])
-{
-    gl_Position = proj_matrix * v[0];
-    EmitVertex();
-
-    gl_Position = proj_matrix * v[1];
-    EmitVertex();
-
-    gl_Position = proj_matrix * v[2];
-    EmitVertex();
-
-    EndPrimitive();
-}
-
-void emitQuad(vec4 v[4]
-{
-    // Emit a quad as a triangle strip.
-    gl_Position = proj_matrix*v[0];
-    EmitVertex();
-
-    gl_Position = proj_matrix*v[1];
-    EmitVertex();
-
-    gl_Position = proj_matrix*v[2];
-    EmitVertex();
-
-    gl_Position = proj_matrix*v[3];
-    EmitVertex(); 
-
-    EndPrimitive();
-}
-
-void emitPrimitives(int layer)
-{
-    int i = layer;
-    gl_Layer = i;
-
-    vec4 depth1 = vec4(texture2DRect(depthMap, tc0).rg, texture2DRect(depthMap, tc1).rg));
-    vec3 depth2 = vec4(texture2DRect(depthMap, tc2).rg, texture2DRect(depthMap, tc3).rg));
-    vec3 depth3 = vec4(texture2DRect(depthMap, tc4).rg, texture2DRect(depthMap, tc5).rg));
-    vec3 depth4 = vec4(texture2DRect(depthMap, tc6).rg, texture2DRect(depthMap, tc7).rg));
-
-    depth1 = min(depth1, depth2);
-    depth1 = min(depth1, depth3);
-    depth1 = min(depth1, depth4);
-
-    vec2 depth = min(depth1.xy, depth1.zw);
-
-    int side = sqrt(gl_VerticesIn);
-
-    for (int j = 0; j < side; j++)
-    {
-        for (int k = 0; k < side; ++k)
-        {
-            vec3 pos = gl_PositionIn[(j * side) + k].xyz;
-            vec4 v = shadowMatrix[i] * vec4(pos, 1.0);
-            gl_Position = v;
-            to_vec = pos - light_position.xyz * depth;
-            EmitVertex();
-        }
-
-        EndPrimitive();
-    }
-
-    vec3 norms[3]; // Normals
-    vec3 lightdir3]; // Directions toward light
-
-    vec4 v[4]; // Temporary vertices
-
-    vec4 or_pos[3] =
-    {  // Triangle oriented toward light source
-        gl_PositionIn[0],
-        gl_PositionIn[2],
-        gl_PositionIn[4]
-    };
-
-    // Compute normal at each vertex.
-    cross_products(n, 0, 2, 4);
-
-    // Compute direction from vertices to light.
-    lightdir[0] = getLightDirection(lightpos, gl_PositionIn[0].xyz);
-    lightdir[1] = getLightDirection(lightpos, gl_PositionIn[2].xyz);
-    lightdir[2] = getLightDirection(lightpos, gl_PositionIn[4].xyz);
-
-    // Check if the main triangle faces the light.
-    bool faces_light = true;
-    if (!(dot(ns[0],d[0]) > 0
-         |dot(ns[1],d[1]) > 0
-         |dot(ns[2],d[2]) > 0))
-    {
-        // Flip vertex winding order in or_pos.
-        or_pos[1] = gl_PositionIn[4];
-        or_pos[2] = gl_PositionIn[2];
-        faces_light = false;
-    }
-
-    // Near cap: simply render triangle.
-    emitTri(or_pos);
-
-    // Far cap: extrude positions to infinity.
-    v[0] =vec4(lightpos.w * or_pos[0].xyz - lightpos.xyz,0);
-    v[1] =vec4(lightpos.w * or_pos[2].xyz - lightpos.xyz,0);
-    v[2] =vec4(lightpos.w * or_pos[1].xyz - lightpos.xyz,0);
-
-    emitTri(v);
-
-    // Loop over all edges and extrude if needed.
-    for ( int i=0; i<3; i++ ) 
-    {
-       // Compute indices of neighbor triangle.
-       int v0 = i*2;
-       int nb = (i*2+1);
-       int v1 = (i*2+2) % 6;
-       cross_products(n, v0, nb, v1);
-
-       // Compute direction to light, again as above.
-       d[0] =lightpos.xyz-lightpos.w*gl_PositionIn[v0].xyz;
-       d[1] =lightpos.xyz-lightpos.w*gl_PositionIn[nb].xyz;
-       d[2] =lightpos.xyz-lightpos.w*gl_PositionIn[v1].xyz;
-
-       bool is_parallel = gl_PositionIn[nb].w < 1e-5;
-
-       // Extrude the edge if it does not have a
-       // neighbor, or if it's a possible silhouette.
-       if (is_parallel ||
-          ( faces_light != (dot(ns[0],d[0])>0 ||
-                            dot(ns[1],d[1])>0 ||
-                            dot(ns[2],d[2])>0) ))
-       {
-           // Make sure sides are oriented correctly.
-           int i0 = faces_light ? v0 : v1;
-           int i1 = faces_light ? v1 : v0;
-
-           v[0] = gl_PositionIn[i0];
-           v[1] = vec4(lightpos.w*gl_PositionIn[i0].xyz - lightpos.xyz, 0);
-           v[2] = gl_PositionIn[i1];
-           v[3] = vec4(lightpos.w*gl_PositionIn[i1].xyz - lightpos.xyz, 0);
-
-           emitQuad(v);
-       }
-    }
-}
-
-void main()
-{
-    // Output
-    emitPrimitives(0);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
new file mode 100644
index 00000000000..a04f611440b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
@@ -0,0 +1,122 @@
+/** 
+ * @file fullbrightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+ 
+/*[EXTRA_CODE_HERE]*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+#ifndef HAS_DIFFUSE_LOOKUP
+uniform sampler2D diffuseMap;
+#endif
+
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+VARYING vec3 vary_position;
+
+uniform samplerCube environmentMap;
+
+// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
+uniform int no_atmo;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
+
+vec3 linear_to_srgb(vec3 c);
+vec3 srgb_to_linear(vec3 c);
+
+#ifdef HAS_REFLECTION_PROBES
+// reflection probe interface
+void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv, 
+        vec3 pos, vec3 norm, float glossiness, float envIntensity);
+void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
+void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
+#endif
+
+// See:
+//   class1\deferred\fullbrightShinyF.glsl
+//   class1\lighting\lightFullbrightShinyF.glsl
+void main()
+{
+#ifdef HAS_DIFFUSE_LOOKUP
+	vec4 color = diffuseLookup(vary_texcoord0.xy);
+#else
+	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
+#endif
+	
+	color.rgb *= vertex_color.rgb;
+
+	// SL-9632 HUDs are affected by Atmosphere
+	if (no_atmo == 0)
+	{
+        vec3 sunlit;
+        vec3 amblit;
+        vec3 additive;
+        vec3 atten;
+        vec3 pos = vary_position;
+        calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
+
+        float env_intensity = vertex_color.a;
+#ifndef HAS_REFLECTION_PROBES
+        vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	
+        color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
+#else
+        vec3 ambenv;
+        vec3 glossenv;
+        vec3 legacyenv;
+        vec3 norm = normalize(vary_texcoord1.xyz);
+        vec4 spec = vec4(0,0,0,0);
+        sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, env_intensity);
+        legacyenv *= 1.5; // fudge brighter
+        applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity);
+#endif
+        color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
+        color.rgb = fullbrightScaleSoftClip(color.rgb);
+	}
+
+/*
+	// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects.
+	else
+	{
+		vec3  envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+		float env_intensity = vertex_color.a;
+		color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
+	}
+*/
+
+	color.a = 1.0;
+	//color.rgb = linear_to_srgb(color.rgb);
+
+	frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl
deleted file mode 100644
index 34d26cddea8..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl
+++ /dev/null
@@ -1,70 +0,0 @@
-/** 
- * @file class3/deferred/gatherSkyShF.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
-
-VARYING vec2 vary_frag;
-
-uniform vec2 screen_res;
-uniform sampler2D sh_input_r;
-uniform sampler2D sh_input_g;
-uniform sampler2D sh_input_b;
-
-void main()
-{
-    vec2 offset	  = vec2(2.0) / screen_res;
-
-    vec4 r = vec4(0);
-    vec4 g = vec4(0);
-    vec4 b = vec4(0);
-
-    vec2 tc = vary_frag * 2.0;
-
-	r += texture2D(sh_input_r, tc + vec2(0,        0));
-	r += texture2D(sh_input_r, tc + vec2(offset.x, 0));
-	r += texture2D(sh_input_r, tc + vec2(0,        offset.y));
-	r += texture2D(sh_input_r, tc + vec2(offset.x, offset.y));
-    r /= 4.0f;
-
-	g += texture2D(sh_input_g, tc + vec2(0,        0));
-	g += texture2D(sh_input_g, tc + vec2(offset.x, 0));
-	g += texture2D(sh_input_g, tc + vec2(0,        offset.y));
-	g += texture2D(sh_input_g, tc + vec2(offset.x, offset.y));
-    g /= 4.0f;
-
-	b += texture2D(sh_input_b, tc + vec2(0,        0));
-	b += texture2D(sh_input_b, tc + vec2(offset.x, 0));
-	b += texture2D(sh_input_b, tc + vec2(0,        offset.y));
-	b += texture2D(sh_input_b, tc + vec2(offset.x, offset.y));
-    b /= 4.0f;
-
-    frag_data[0] = r;
-    frag_data[1] = g;
-    frag_data[2] = b;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl
deleted file mode 100644
index 337c8a50fe5..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-/** 
- * @file gatherSkyShV.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec2 texcoord0;
-
-VARYING vec2 vary_frag;
-uniform vec2 screen_res;
-
-void main()
-{
-    // pass through untransformed fullscreen pos
-    float oo_divisor = screen_res.x / 64.0;
-    vec3 pos = (position.xyz * oo_divisor) + vec3(oo_divisor - 1, oo_divisor - 1, 0);
-	gl_Position = vec4(pos.xyz, 1.0);
-    vary_frag = texcoord0 * oo_divisor;
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl b/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl
deleted file mode 100644
index d5d91c88f07..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl
+++ /dev/null
@@ -1,111 +0,0 @@
-/** 
- * @file class3/deferred/genSkyShF.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
-
-VARYING vec2 vary_frag;
-
-uniform vec3 sun_dir;
-
-uniform sampler2D transmittance_texture;
-uniform sampler3D scattering_texture;
-uniform sampler3D single_mie_scattering_texture;
-uniform sampler2D irradiance_texture;
-
-vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
-
-vec3 calcDirection(vec2 tc)
-{
-     float phi = tc.y * 2.0 * 3.14159265;
-     float cosTheta = sqrt(1.0 - tc.x);
-     float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
-     return vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
-}
-
-// reverse mapping above to convert a hemisphere direction into phi/theta values
-void getPhiAndThetaFromDirection(vec3 dir, out float phi, out float theta)
-{
-     float sin_theta;
-     float cos_theta;
-     cos_theta = dir.z;
-     theta     = acos(cos_theta);
-     sin_theta = sin(theta);
-     phi       = abs(sin_theta) > 0.0001 ? acos(dir.x / sin_theta) : 1.0;
-}
-
-// reverse mapping above to convert a hemisphere direction into an SH texture sample pos
-vec2 calcShUvFromDirection(vec3 dir)
-{
-    vec2 uv;
-    float phi;
-    float theta;
-    getPhiAndThetaFromDirection(dir, phi, theta);
-    uv.y = phi   / 2.0 * 3.14159265;
-    uv.x = theta / 2.0 * 3.14159265;
-    return uv;
-}
-
-void projectToL1(vec3 n, vec3 c, vec4 basis, out vec4 coeffs[3])
-{
-    coeffs[0] = vec4(basis.x, n * basis.yzw * c.r);
-    coeffs[1] = vec4(basis.x, n * basis.yzw * c.g);
-    coeffs[2] = vec4(basis.x, n * basis.yzw * c.b);
-}
-
-void main()
-{
-    float Y00 = sqrt(1.0 / 3.14159265) * 0.5;
-    float Y1x = sqrt(3.0 / 3.14159265) * 0.5;
-    float Y1y = Y1x;
-    float Y1z = Y1x;
-
-    vec4 L1 = vec4(Y00, Y1x, Y1y, Y1z);
-
-    vec3 view_direction = calcDirection(vary_frag);
-    vec3 sun_direction  = normalize(sun_dir);
-    vec3 cam_pos        = vec3(0, 0, 6360);
-
-    vec3 transmittance;
-    vec3 radiance = GetSkyLuminance(cam_pos, view_direction, 0.0f, sun_direction, transmittance);
-
-    vec3 color = vec3(1.0) - exp(-radiance * 0.0001);
-
-    color = pow(color, vec3(1.0/2.2));
-
-    vec4 coeffs[3];
-    coeffs[0] = vec4(0);
-    coeffs[1] = vec4(0);
-    coeffs[2] = vec4(0);
-
-    projectToL1(view_direction, color.rgb, L1, coeffs);
-
-    frag_data[0] = coeffs[0];
-    frag_data[1] = coeffs[1];
-    frag_data[2] = coeffs[2];
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl b/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl
deleted file mode 100644
index b466883dc7e..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/** 
- * @file genSkyShV.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec2 texcoord0;
-
-VARYING vec2 vary_frag;
-
-void main()
-{
-    // pass through untransformed fullscreen pos
-	gl_Position = vec4(position.xyz, 1.0);
-    vary_frag = texcoord0;
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/indirect.glsl b/indra/newview/app_settings/shaders/class3/deferred/indirect.glsl
deleted file mode 100644
index 33c5667cae9..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/indirect.glsl
+++ /dev/null
@@ -1,44 +0,0 @@
-/** 
- * @file class3/deferred/indirect.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-/*[EXTRA_CODE_HERE]*/
-
-uniform sampler2D sh_input_r;
-uniform sampler2D sh_input_g;
-uniform sampler2D sh_input_b;
-
-vec3 GetIndirect(vec3 norm)
-{
-    vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
-    vec4 l1r = texture2D(sh_input_r, vec2(0,0));
-    vec4 l1g = texture2D(sh_input_g, vec2(0,0));
-    vec4 l1b = texture2D(sh_input_b, vec2(0,0));
-    vec3 indirect = vec3(dot(l1r, l1tap * vec4(1, norm.xyz)),
-                         dot(l1g, l1tap * vec4(1, norm.xyz)),
-                         dot(l1b, l1tap * vec4(1, norm.xyz)));
-    indirect = clamp(indirect, vec3(0), vec3(1.0));
-    return indirect;
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
new file mode 100644
index 00000000000..c5b1937cfb6
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
@@ -0,0 +1,455 @@
+/**
+* @file materialF.glsl
+*
+* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2007, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+/*[EXTRA_CODE_HERE]*/
+
+//class1/deferred/materialF.glsl
+
+// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass.
+
+#define DIFFUSE_ALPHA_MODE_NONE     0
+#define DIFFUSE_ALPHA_MODE_BLEND    1
+#define DIFFUSE_ALPHA_MODE_MASK     2
+#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
+
+uniform float emissive_brightness;  // fullbright flag, 1.0 == fullbright, 0.0 otherwise
+uniform int sun_up_factor;
+
+#ifdef WATER_FOG
+vec4 applyWaterFogView(vec3 pos, vec4 color);
+#endif
+
+vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
+vec3 scaleSoftClipFrag(vec3 l);
+
+vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
+
+vec3 srgb_to_linear(vec3 cs);
+vec3 linear_to_srgb(vec3 cs);
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+#ifdef HAS_SUN_SHADOW
+float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
+#endif
+
+#ifdef HAS_REFLECTION_PROBES
+void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, 
+        vec3 pos, vec3 norm, float glossiness, float envIntensity);
+void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
+void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
+#endif
+
+uniform samplerCube environmentMap;
+uniform sampler2D     lightFunc;
+
+// Inputs
+uniform vec4 morphFactor;
+uniform vec3 camPosLocal;
+uniform mat3 env_mat;
+
+uniform vec3 sun_dir;
+uniform vec3 moon_dir;
+VARYING vec2 vary_fragcoord;
+
+VARYING vec3 vary_position;
+
+uniform mat4 proj_mat;
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec4 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float getAmbientClamp();
+
+vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)
+{
+    // SL-14895 inverted attenuation work-around
+    // This routine is tweaked to match deferred lighting, but previously used an inverted la value. To reconstruct
+    // that previous value now that the inversion is corrected, we reverse the calculations in LLPipeline::setupHWLights()
+    // to recover the `adjusted_radius` value previously being sent as la.
+    float falloff_factor = (12.0 * fa) - 9.0;
+    float inverted_la = falloff_factor / la;
+    // Yes, it makes me want to cry as well. DJH
+    
+    vec3 col = vec3(0);
+
+    //get light vector
+    vec3 lv = lp.xyz - v;
+
+    //get distance
+    float dist = length(lv);
+    float da = 1.0;
+
+    dist /= inverted_la;
+
+    if (dist > 0.0 && inverted_la > 0.0)
+    {
+        //normalize light vector
+        lv = normalize(lv);
+
+        //distance attenuation
+        float dist_atten = clamp(1.0 - (dist - 1.0*(1.0 - fa)) / fa, 0.0, 1.0);
+        dist_atten *= dist_atten;
+        dist_atten *= 2.0f;
+
+        if (dist_atten <= 0.0)
+        {
+            return col;
+        }
+
+        // spotlight coefficient.
+        float spot = max(dot(-ln, lv), is_pointlight);
+        da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+        //angular attenuation
+        da *= dot(n, lv);
+
+        float lit = 0.0f;
+
+        float amb_da = ambiance;
+        if (da >= 0)
+        {
+            lit = max(da * dist_atten, 0.0);
+            col = lit * light_col * diffuse;
+            amb_da += (da*0.5 + 0.5) * ambiance;
+        }
+        amb_da += (da*da*0.5 + 0.5) * ambiance;
+        amb_da *= dist_atten;
+        amb_da = min(amb_da, 1.0f - lit);
+
+        // SL-10969 need to see why these are blown out
+        //col.rgb += amb_da * light_col * diffuse;
+
+        if (spec.a > 0.0)
+        {
+            //vec3 ref = dot(pos+lv, norm);
+            vec3 h = normalize(lv + npos);
+            float nh = dot(n, h);
+            float nv = dot(n, npos);
+            float vh = dot(npos, h);
+            float sa = nh;
+            float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
+
+            float gtdenom = 2 * nh;
+            float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
+
+            if (nh > 0.0)
+            {
+                float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
+                vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
+                speccol = clamp(speccol, vec3(0), vec3(1));
+                col += speccol;
+
+                float cur_glare = max(speccol.r, speccol.g);
+                cur_glare = max(cur_glare, speccol.b);
+                glare = max(glare, speccol.r);
+                glare += max(cur_glare, 0.0);
+            }
+        }
+    }
+
+    return max(col, vec3(0.0, 0.0, 0.0));
+}
+
+#else
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+#endif
+
+uniform sampler2D diffuseMap;  //always in sRGB space
+
+#ifdef HAS_NORMAL_MAP
+uniform sampler2D bumpMap;
+#endif
+
+#ifdef HAS_SPECULAR_MAP
+uniform sampler2D specularMap;
+
+VARYING vec2 vary_texcoord2;
+#endif
+
+uniform float env_intensity;
+uniform vec4 specular_color;  // specular color RGB and specular exponent (glossiness) in alpha
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
+uniform float minimum_alpha;
+#endif
+
+#ifdef HAS_NORMAL_MAP
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+VARYING vec2 vary_texcoord1;
+#else
+VARYING vec3 vary_normal;
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec2 encode_normal(vec3 n);
+
+void main()
+{
+    vec2 pos_screen = vary_texcoord0.xy;
+
+    vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);
+	diffcol.rgb *= vertex_color.rgb;
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
+
+    // Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points
+    float bias = 0.001953125; // 1/512, or half an 8-bit quantization
+    if (diffcol.a < minimum_alpha-bias)
+    {
+        discard;
+    }
+#endif
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
+	vec3 gamma_diff = diffcol.rgb;
+	diffcol.rgb = srgb_to_linear(diffcol.rgb);
+#endif
+
+#ifdef HAS_SPECULAR_MAP
+    vec4 spec = texture2D(specularMap, vary_texcoord2.xy);
+    spec.rgb *= specular_color.rgb;
+#else
+    vec4 spec = vec4(specular_color.rgb, 1.0);
+#endif
+
+#ifdef HAS_NORMAL_MAP
+	vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
+
+	norm.xyz = norm.xyz * 2 - 1;
+
+	vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
+			  dot(norm.xyz,vary_mat1),
+			  dot(norm.xyz,vary_mat2));
+#else
+	vec4 norm = vec4(0,0,0,1.0);
+	vec3 tnorm = vary_normal;
+#endif
+
+    norm.xyz = normalize(tnorm.xyz);
+
+    vec2 abnormal = encode_normal(norm.xyz);
+
+    vec4 final_color = diffcol;
+
+#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)
+	final_color.a = emissive_brightness;
+#else
+	final_color.a = max(final_color.a, emissive_brightness);
+#endif
+
+    vec4 final_specular = spec;
+    
+#ifdef HAS_SPECULAR_MAP
+    vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0);
+	final_specular.a = specular_color.a * norm.a;
+#else
+	vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0);
+	final_specular.a = specular_color.a;
+#endif
+
+#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
+
+    //forward rendering, output just lit sRGBA
+    vec3 pos = vary_position;
+
+    float shadow = 1.0f;
+
+#ifdef HAS_SUN_SHADOW
+    shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
+#endif
+
+    spec = final_specular;
+    vec4 diffuse = final_color;
+    float envIntensity = final_normal.z;
+
+    vec3 color = vec3(0,0,0);
+
+    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
+
+    float bloom = 0.0;
+    vec3 sunlit;
+    vec3 amblit;
+    vec3 additive;
+    vec3 atten;
+
+    calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
+    
+        // This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020)
+        // The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level
+        // TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage
+        //color = fullbrightScaleSoftClip(color);
+
+    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
+
+    //we're in sRGB space, so gamma correct this dot product so 
+    // lighting from the sun stays sharp
+    float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
+    da = pow(da, 1.0 / 1.3);
+    vec3 sun_contrib = min(da, shadow) * sunlit;
+
+#ifdef HAS_REFLECTION_PROBES
+    vec3 ambenv;
+    vec3 glossenv;
+    vec3 legacyenv;
+    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
+    amblit = max(ambenv, amblit);
+    color.rgb = amblit;
+#else
+
+    color = amblit;
+
+    //darken ambient for normals perpendicular to light vector so surfaces in shadow 
+    // and facing away from light still have some definition to them.
+    // do NOT gamma correct this dot product so ambient lighting stays soft
+    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
+    ambient *= 0.5;
+    ambient *= ambient;
+    ambient = (1.0 - ambient);
+
+    color *= ambient;
+#endif
+
+    color += sun_contrib;
+
+    color *= gamma_diff.rgb;
+
+    float glare = 0.0;
+
+    if (spec.a > 0.0)  // specular reflection
+    {
+        float sa        = dot(refnormpersp, sun_dir.xyz);
+        vec3  dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r);
+
+        // add the two types of shiny together
+        vec3 spec_contrib = dumbshiny * spec.rgb;
+        bloom             = dot(spec_contrib, spec_contrib) / 6;
+
+        glare = max(spec_contrib.r, spec_contrib.g);
+        glare = max(glare, spec_contrib.b);
+
+        color += spec_contrib;
+
+#ifdef HAS_REFLECTION_PROBES
+        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
+#endif
+    }
+
+
+    color = mix(color.rgb, diffcol.rgb, diffuse.a);
+
+#ifdef HAS_REFLECTION_PROBES
+    if (envIntensity > 0.0)
+    {  // add environmentmap
+        //fudge darker
+        legacyenv *= 0.5*diffuse.a+0.5;
+        
+        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
+    }
+#else
+    if (envIntensity > 0.0)
+    {
+        //add environmentmap
+        vec3 env_vec = env_mat * refnormpersp;
+
+        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
+
+        color = mix(color, reflected_color, envIntensity);
+
+        float cur_glare = max(reflected_color.r, reflected_color.g);
+        cur_glare = max(cur_glare, reflected_color.b);
+        cur_glare *= envIntensity*4.0;
+        glare += cur_glare;
+    }
+#endif
+
+    color = atmosFragLighting(color, additive, atten);
+    color = scaleSoftClipFrag(color);
+
+    //convert to linear before adding local lights
+    color = srgb_to_linear(color);
+
+    vec3 npos = normalize(-pos.xyz);
+
+    vec3 light = vec3(0, 0, 0);
+    
+    final_specular.rgb = srgb_to_linear(final_specular.rgb); // SL-14035
+
+#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
+
+    LIGHT_LOOP(1)
+        LIGHT_LOOP(2)
+        LIGHT_LOOP(3)
+        LIGHT_LOOP(4)
+        LIGHT_LOOP(5)
+        LIGHT_LOOP(6)
+        LIGHT_LOOP(7)
+
+    color += light;
+
+    glare = min(glare, 1.0);
+    float al = max(diffcol.a, glare)*vertex_color.a;
+
+    //convert to srgb as this color is being written post gamma correction
+    color = linear_to_srgb(color);
+
+#ifdef WATER_FOG
+    vec4 temp = applyWaterFogView(pos, vec4(color, al));
+    color = temp.rgb;
+    al = temp.a;
+#endif
+
+    frag_color = vec4(color, al);
+
+#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer 
+
+    // deferred path
+    frag_data[0] = final_color; //gbuffer is sRGB
+    frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
+    frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.
+#endif
+}
+
diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
deleted file mode 100644
index 9d62b9d1804..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
+++ /dev/null
@@ -1,291 +0,0 @@
-/** 
- * @file multiSpotLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_shader_texture_lod : enable
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect specularRect;
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform samplerCube environmentMap;
-uniform sampler2DRect lightMap;
-uniform sampler2D noiseMap;
-uniform sampler2D projectionMap;
-uniform sampler2D lightFunc;
-
-uniform mat4 proj_mat; //screen space to light space
-uniform float proj_near; //near clip for projection
-uniform vec3 proj_p; //plane projection is emitting from (in screen space)
-uniform vec3 proj_n;
-uniform float proj_focus; //distance from plane to begin blurring
-uniform float proj_lod;  //(number of mips in proj map)
-uniform float proj_range; //range between near clip and far clip plane of projection
-uniform float proj_ambient_lod;
-uniform float proj_ambiance;
-uniform float near_clip;
-uniform float far_clip;
-
-uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
-uniform float sun_wash;
-uniform int proj_shadow_idx;
-uniform float shadow_fade;
-
-uniform vec3 center;
-uniform float size;
-uniform vec3 color;
-uniform float falloff;
-
-VARYING vec4 vary_fragcoord;
-uniform vec2 screen_res;
-
-uniform mat4 inv_proj;
-
-vec3 getNorm(vec2 pos_screen);
-
-vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
-{
-    vec4 ret = texture2DLod(projectionMap, tc, lod);
-    
-    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
-    
-    float det = min(lod/(proj_lod*0.5), 1.0);
-    
-    float d = min(dist.x, dist.y);
-    
-    d *= min(1, d * (proj_lod - lod));
-    
-    float edge = 0.25*det;
-    
-    ret *= clamp(d/edge, 0.0, 1.0);
-    
-    return ret;
-}
-
-vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
-{
-    vec4 ret = texture2DLod(projectionMap, tc, lod);
-
-    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
-    
-    float det = min(lod/(proj_lod*0.5), 1.0);
-    
-    float d = min(dist.x, dist.y);
-    
-    float edge = 0.25*det;
-        
-    ret *= clamp(d/edge, 0.0, 1.0);
-    
-    return ret;
-}
-
-vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
-{
-    vec4 ret = texture2DLod(projectionMap, tc, lod);
-
-    vec2 dist = tc-vec2(0.5);
-    
-    float d = dot(dist,dist);
-        
-    ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
-    
-    return ret;
-}
-
-
-vec4 getPosition(vec2 pos_screen);
-
-void main() 
-{
-    vec4 frag = vary_fragcoord;
-    frag.xyz /= frag.w;
-    frag.xyz = frag.xyz*0.5+0.5;
-    frag.xy *= screen_res;
-    
-    vec3 pos = getPosition(frag.xy).xyz;
-    vec3 lv = center.xyz-pos.xyz;
-    float dist = length(lv);
-    dist /= size;
-    if (dist > 1.0)
-    {
-        discard;
-    }
-    
-    float shadow = 1.0;
-    
-    if (proj_shadow_idx >= 0)
-    {
-        vec4 shd = texture2DRect(lightMap, frag.xy);
-        shadow = (proj_shadow_idx == 0) ? shd.b : shd.a;
-        shadow += shadow_fade;
-        shadow = clamp(shadow, 0.0, 1.0);        
-    }
-    
-    vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
-    
-    float envIntensity = norm.z;
-
-    norm = getNorm(frag.xy);
-    
-    norm = normalize(norm);
-    float l_dist = -dot(lv, proj_n);
-    
-    vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
-    if (proj_tc.z < 0.0)
-    {
-        discard;
-    }
-    
-    proj_tc.xyz /= proj_tc.w;
-    
-    float fa = (falloff*0.5)+1.0;
-    float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0);
-    dist_atten *= dist_atten;
-    dist_atten *= 2.0;
-    if (dist_atten <= 0.0)
-    {
-        discard;
-    }
-    
-    lv = proj_origin-pos.xyz;
-    lv = normalize(lv);
-    float da = dot(norm, lv);
-
-    vec3 col = vec3(0,0,0);
-        
-    vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb);
-    
-    vec4 spec = texture2DRect(specularRect, frag.xy);
-
-    vec3 dlit = vec3(0, 0, 0);
-
-    float noise = texture2D(noiseMap, frag.xy/128.0).b;
-    if (proj_tc.z > 0.0 &&
-        proj_tc.x < 1.0 &&
-        proj_tc.y < 1.0 &&
-        proj_tc.x > 0.0 &&
-        proj_tc.y > 0.0)
-    {
-        float amb_da = proj_ambiance;
-        float lit = 0.0;
-
-        if (da > 0.0)
-        {
-            lit = da * dist_atten * noise;
-
-            float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
-            float lod = diff * proj_lod;
-            
-            vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
-        
-            dlit = color.rgb * plcol.rgb * plcol.a;
-            
-            col = dlit*lit*diff_tex*shadow;
-            amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;
-        }
-        
-        //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
-        vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
-                            
-        amb_da += (da*da*0.5+0.5)*(1.0-shadow)*proj_ambiance;
-                
-        amb_da *= dist_atten * noise;
-            
-        amb_da = min(amb_da, 1.0-lit);
-            
-        col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
-    }
-    
-
-    if (spec.a > 0.0)
-    {
-        vec3 npos = -normalize(pos);
-        dlit *= min(da*6.0, 1.0) * dist_atten;
-
-        //vec3 ref = dot(pos+lv, norm);
-        vec3 h = normalize(lv+npos);
-        float nh = dot(norm, h);
-        float nv = dot(norm, npos);
-        float vh = dot(npos, h);
-        float sa = nh;
-        float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
-
-        float gtdenom = 2 * nh;
-        float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-                                
-        if (nh > 0.0)
-        {
-            float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
-            col += dlit*scol*spec.rgb*shadow;
-            //col += spec.rgb;
-        }
-    }   
-
-    if (envIntensity > 0.0)
-    {
-        vec3 ref = reflect(normalize(pos), norm);
-        
-        //project from point pos in direction ref to plane proj_p, proj_n
-        vec3 pdelta = proj_p-pos;
-        float ds = dot(ref, proj_n);
-        
-        if (ds < 0.0)
-        {
-            vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
-            
-            vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
-
-            if (stc.z > 0.0)
-            {
-                stc /= stc.w;
-                                
-                if (stc.x < 1.0 &&
-                    stc.y < 1.0 &&
-                    stc.x > 0.0 &&
-                    stc.y > 0.0)
-                {
-                    col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity;
-                }
-            }
-        }
-    }
-
-    //not sure why, but this line prevents MATBUG-194
-    col = max(col, vec3(0.0));
-
-    col = scaleDownLight(col);
-
-    //output linear space color as gamma correction happens down stream
-    frag_color.rgb = col;   
-    frag_color.a = 0.0;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl
deleted file mode 100644
index ca9ce3a2e1b..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/** 
- * @file pointShadowBlur.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform samplerCube cube_map; 
-
-in vec3 to_vec;
-
-out vec4 fragColor;
-
-void main() 
-{
-	vec4 vcol = texture(cube_map, to_vec);
-	fragColor = vec4(vcol.rgb, 1.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
new file mode 100644
index 00000000000..8c1323ba1aa
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
@@ -0,0 +1,476 @@
+/**
+ * @file class2/deferred/reflectionProbeF.glsl
+ *
+ * $LicenseInfo:firstyear=2022&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2022, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_shader_texture_lod : enable
+
+#define FLT_MAX 3.402823466e+38
+
+#define REFMAP_COUNT 256
+#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider
+
+uniform samplerCubeArray   reflectionProbes;
+
+layout (std140, binding = 1) uniform ReflectionProbes
+{
+    // list of OBBs for user override probes
+    // box is a set of 3 planes outward facing planes and the depth of the box along that plane
+    // for each box refBox[i]...
+    /// box[0..2] - plane 0 .. 2 in [A,B,C,D] notation
+    //  box[3][0..2] - plane thickness
+    mat4 refBox[REFMAP_COUNT];
+    // list of bounding spheres for reflection probes sorted by distance to camera (closest first)
+    vec4 refSphere[REFMAP_COUNT];
+    // index  of cube map in reflectionProbes for a corresponding reflection probe
+    // e.g. cube map channel of refSphere[2] is stored in refIndex[2]
+    // refIndex.x - cubemap channel in reflectionProbes
+    // refIndex.y - index in refNeighbor of neighbor list (index is ivec4 index, not int index)
+    // refIndex.z - number of neighbors
+    // refIndex.w - priority, if negative, this probe has a box influence
+    ivec4 refIndex[REFMAP_COUNT];
+
+    // neighbor list data (refSphere indices, not cubemap array layer)
+    ivec4 refNeighbor[1024];
+
+    // number of reflection probes present in refSphere
+    int refmapCount;
+
+    // intensity of ambient light from reflection probes
+    float reflectionAmbiance;
+};
+
+// Inputs
+uniform mat3 env_mat;
+
+// list of probeIndexes shader will actually use after "getRefIndex" is called
+// (stores refIndex/refSphere indices, NOT rerflectionProbes layer)
+int probeIndex[REF_SAMPLE_COUNT];
+
+// number of probes stored in probeIndex
+int probeInfluences = 0;
+
+bool isAbove(vec3 pos, vec4 plane)
+{
+    return (dot(plane.xyz, pos) + plane.w) > 0;
+}
+
+// return true if probe at index i influences position pos
+bool shouldSampleProbe(int i, vec3 pos)
+{
+    if (refIndex[i].w < 0)
+    {
+        vec4 v = refBox[i] * vec4(pos, 1.0);
+        if (abs(v.x) > 1 || 
+            abs(v.y) > 1 ||
+            abs(v.z) > 1)
+        {
+            return false;
+        }
+    }
+    else
+    {
+        vec3 delta = pos.xyz - refSphere[i].xyz;
+        float d = dot(delta, delta);
+        float r2 = refSphere[i].w;
+        r2 *= r2;
+
+        if (d > r2)
+        { //outside bounding sphere
+            return false;
+        }
+    }
+
+    return true;
+}
+
+// call before sampleRef
+// populate "probeIndex" with N probe indices that influence pos where N is REF_SAMPLE_COUNT
+// overall algorithm -- 
+void preProbeSample(vec3 pos)
+{
+    // TODO: make some sort of structure that reduces the number of distance checks
+
+    for (int i = 0; i < refmapCount; ++i)
+    {
+        // found an influencing probe
+        if (shouldSampleProbe(i, pos))
+        {
+            probeIndex[probeInfluences] = i;
+            ++probeInfluences;
+
+            int neighborIdx = refIndex[i].y;
+            if (neighborIdx != -1)
+            {
+                int neighborCount = min(refIndex[i].z, REF_SAMPLE_COUNT-1);
+
+                int count = 0;
+                while (count < neighborCount)
+                {
+                    // check up to REF_SAMPLE_COUNT-1 neighbors (neighborIdx is ivec4 index)
+
+                    int idx = refNeighbor[neighborIdx].x;
+                    if (shouldSampleProbe(idx, pos))
+                    {
+                        probeIndex[probeInfluences++] = idx;
+                        if (probeInfluences == REF_SAMPLE_COUNT)
+                        {
+                            return;
+                        }
+                    }
+                    count++;
+                    if (count == neighborCount)
+                    {
+                        return;
+                    }
+
+                    idx = refNeighbor[neighborIdx].y;
+                    if (shouldSampleProbe(idx, pos))
+                    {
+                        probeIndex[probeInfluences++] = idx;
+                        if (probeInfluences == REF_SAMPLE_COUNT)
+                        {
+                            return;
+                        }
+                    }
+                    count++;
+                    if (count == neighborCount)
+                    {
+                        return;
+                    }
+
+                    idx = refNeighbor[neighborIdx].z;
+                    if (shouldSampleProbe(idx, pos))
+                    {
+                        probeIndex[probeInfluences++] = idx;
+                        if (probeInfluences == REF_SAMPLE_COUNT)
+                        {
+                            return;
+                        }
+                    }
+                    count++;
+                    if (count == neighborCount)
+                    {
+                        return;
+                    }
+
+                    idx = refNeighbor[neighborIdx].w;
+                    if (shouldSampleProbe(idx, pos))
+                    {
+                        probeIndex[probeInfluences++] = idx;
+                        if (probeInfluences == REF_SAMPLE_COUNT)
+                        {
+                            return;
+                        }
+                    }
+                    count++;
+                    if (count == neighborCount)
+                    {
+                        return;
+                    }
+
+                    ++neighborIdx;
+                }
+
+                return;
+            }
+        }
+    }
+}
+
+// from https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection
+
+// original reference implementation:
+/*
+bool intersect(const Ray &ray) const 
+{ 
+        float t0, t1; // solutions for t if the ray intersects 
+#if 0 
+        // geometric solution
+        Vec3f L = center - orig; 
+        float tca = L.dotProduct(dir); 
+        // if (tca < 0) return false;
+        float d2 = L.dotProduct(L) - tca * tca; 
+        if (d2 > radius2) return false; 
+        float thc = sqrt(radius2 - d2); 
+        t0 = tca - thc; 
+        t1 = tca + thc; 
+#else 
+        // analytic solution
+        Vec3f L = orig - center; 
+        float a = dir.dotProduct(dir); 
+        float b = 2 * dir.dotProduct(L); 
+        float c = L.dotProduct(L) - radius2; 
+        if (!solveQuadratic(a, b, c, t0, t1)) return false; 
+#endif 
+        if (t0 > t1) std::swap(t0, t1); 
+ 
+        if (t0 < 0) { 
+            t0 = t1; // if t0 is negative, let's use t1 instead 
+            if (t0 < 0) return false; // both t0 and t1 are negative 
+        } 
+ 
+        t = t0; 
+ 
+        return true; 
+} */
+
+// adapted -- assume that origin is inside sphere, return distance from origin to edge of sphere
+vec3 sphereIntersect(vec3 origin, vec3 dir, vec3 center, float radius2)
+{ 
+        float t0, t1; // solutions for t if the ray intersects 
+
+        vec3 L = center - origin; 
+        float tca = dot(L,dir);
+
+        float d2 = dot(L,L) - tca * tca; 
+
+        float thc = sqrt(radius2 - d2); 
+        t0 = tca - thc; 
+        t1 = tca + thc; 
+ 
+        vec3 v = origin + dir * t1;
+        return v; 
+} 
+
+// from https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
+/*
+vec3 DirectionWS = normalize(PositionWS - CameraWS);
+vec3 ReflDirectionWS = reflect(DirectionWS, NormalWS);
+
+// Intersection with OBB convertto unit box space
+// Transform in local unit parallax cube space (scaled and rotated)
+vec3 RayLS = MulMatrix( float(3x3)WorldToLocal, ReflDirectionWS);
+vec3 PositionLS = MulMatrix( WorldToLocal, PositionWS);
+
+vec3 Unitary = vec3(1.0f, 1.0f, 1.0f);
+vec3 FirstPlaneIntersect  = (Unitary - PositionLS) / RayLS;
+vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS;
+vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect);
+float Distance = min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z));
+
+// Use Distance in WS directly to recover intersection
+vec3 IntersectPositionWS = PositionWS + ReflDirectionWS * Distance;
+vec3 ReflDirectionWS = IntersectPositionWS - CubemapPositionWS;
+
+return texCUBE(envMap, ReflDirectionWS);
+*/
+
+// get point of intersection with given probe's box influence volume
+// origin - ray origin in clip space
+// dir - ray direction in clip space
+// i - probe index in refBox/refSphere
+vec3 boxIntersect(vec3 origin, vec3 dir, int i)
+{
+    // Intersection with OBB convertto unit box space
+    // Transform in local unit parallax cube space (scaled and rotated)
+    mat4 clipToLocal = refBox[i];
+
+    vec3 RayLS = mat3(clipToLocal) * dir;
+    vec3 PositionLS = (clipToLocal * vec4(origin, 1.0)).xyz;
+
+    vec3 Unitary = vec3(1.0f, 1.0f, 1.0f);
+    vec3 FirstPlaneIntersect  = (Unitary - PositionLS) / RayLS;
+    vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS;
+    vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect);
+    float Distance = min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z));
+
+    // Use Distance in CS directly to recover intersection
+    vec3 IntersectPositionCS = origin + dir * Distance;
+
+    return IntersectPositionCS;
+}
+
+
+
+// Tap a sphere based reflection probe
+// pos - position of pixel
+// dir - pixel normal
+// lod - which mip to bias towards (lower is higher res, sharper reflections)
+// c - center of probe
+// r2 - radius of probe squared
+// i - index of probe 
+// vi - point at which reflection vector struck the influence volume, in clip space
+vec3 tapRefMap(vec3 pos, vec3 dir, float lod, vec3 c, float r2, int i)
+{
+    //lod = max(lod, 1);
+    // parallax adjustment
+
+    vec3 v;
+    if (refIndex[i].w < 0)
+    {
+        v = boxIntersect(pos, dir, i);
+    }
+    else
+    {
+        v = sphereIntersect(pos, dir, c, r2);
+    }
+
+    v -= c;
+    v = env_mat * v;
+    {
+        float min_lod = textureQueryLod(reflectionProbes,v).y; // lower is higher res
+        return textureLod(reflectionProbes, vec4(v.xyz, refIndex[i].x), max(min_lod, lod)).rgb;
+        //return texture(reflectionProbes, vec4(v.xyz, refIndex[i].x)).rgb;
+    }
+}
+
+vec3 sampleProbes(vec3 pos, vec3 dir, float lod)
+{
+    float wsum = 0.0;
+    vec3 col = vec3(0,0,0);
+    float vd2 = dot(pos,pos); // view distance squared
+
+    for (int idx = 0; idx < probeInfluences; ++idx)
+    {
+        int i = probeIndex[idx];
+        float r = refSphere[i].w; // radius of sphere volume
+        float p = float(abs(refIndex[i].w)); // priority
+        float rr = r*r; // radius squred
+        float r1 = r * 0.1; // 75% of radius (outer sphere to start interpolating down)
+        vec3 delta = pos.xyz-refSphere[i].xyz;
+        float d2 = dot(delta,delta);
+        float r2 = r1*r1; 
+        
+        {
+            vec3 refcol = tapRefMap(pos, dir, lod, refSphere[i].xyz, rr, i);
+            
+            float w = 1.0/d2;
+
+            float atten = 1.0-max(d2-r2, 0.0)/(rr-r2);
+            w *= atten;
+            w *= p; // boost weight based on priority
+            col += refcol*w;
+            
+            wsum += w;
+        }
+    }
+
+    if (probeInfluences <= 1)
+    { //edge-of-scene probe or no probe influence, mix in with embiggened version of probes closest to camera 
+        for (int idx = 0; idx < 8; ++idx)
+        {
+            if (refIndex[idx].w < 0)
+            { // don't fallback to box probes, they are *very* specific
+                continue;
+            }
+            int i = idx;
+            vec3 delta = pos.xyz-refSphere[i].xyz;
+            float d2 = dot(delta,delta);
+            
+            {
+                vec3 refcol = tapRefMap(pos, dir, lod, refSphere[i].xyz, d2, i);
+                
+                float w = 1.0/d2;
+                w *= w;
+                col += refcol*w;
+                wsum += w;
+            }
+        }
+    }
+
+    if (wsum > 0.0)
+    {
+        col *= 1.0/wsum;
+    }
+    
+    return col;
+}
+
+vec3 sampleProbeAmbient(vec3 pos, vec3 dir, float lod)
+{
+    vec3 col = sampleProbes(pos, dir, lod);
+
+    //desaturate
+    vec3 hcol = col *0.5;
+    
+    col *= 2.0;
+    col = vec3(
+        col.r + hcol.g + hcol.b,
+        col.g + hcol.r + hcol.b,
+        col.b + hcol.r + hcol.g
+    );
+    
+    col *= 0.333333;
+
+    return col*reflectionAmbiance;
+
+}
+
+// brighten a color so that at least one component is 1
+vec3 brighten(vec3 c)
+{
+    float m = max(max(c.r, c.g), c.b);
+
+    if (m == 0)
+    {
+        return vec3(1,1,1);
+    }
+
+    return c * 1.0/m;
+}
+
+
+void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, 
+        vec3 pos, vec3 norm, float glossiness, float envIntensity)
+{
+    // TODO - don't hard code lods
+    float reflection_lods = 8;
+    preProbeSample(pos);
+
+    vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
+
+    ambenv = sampleProbeAmbient(pos, norm, reflection_lods-1);
+
+    if (glossiness > 0.0)
+    {
+        float lod = (1.0-glossiness)*reflection_lods;
+        glossenv = sampleProbes(pos, normalize(refnormpersp), lod);
+    }
+
+    if (envIntensity > 0.0)
+    {
+        legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0);
+    }
+}
+
+void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm)
+{
+    glossenv *= 0.35; // fudge darker
+    float fresnel = 1.0+dot(normalize(pos.xyz), norm.xyz);
+    float minf = spec.a * 0.1;
+    fresnel = fresnel * (1.0-minf) + minf;
+    glossenv *= spec.rgb*min(fresnel, 1.0);
+    color.rgb += glossenv;
+}
+
+ void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity)
+ {
+    vec3 reflected_color = legacyenv; //*0.5; //fudge darker
+    vec3 lookAt = normalize(pos);
+    float fresnel = 1.0+dot(lookAt, norm.xyz);
+    fresnel *= fresnel;
+    fresnel = min(fresnel+envIntensity, 1.0);
+    reflected_color *= (envIntensity*fresnel)*brighten(spec.rgb);
+    color = mix(color.rgb, reflected_color, envIntensity);
+ }
\ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl
deleted file mode 100644
index c8991f7a181..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl
+++ /dev/null
@@ -1,73 +0,0 @@
-/** 
- * @file class3/deferred/shVisF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifdef DEFINE_GL_FRAGCOLOR
-    out vec4 frag_color;
-#else
-    #define frag_color gl_FragColor
-#endif
-
-/////////////////////////////////////////////////////////////////////////
-// Fragment shader for L1 SH debug rendering
-/////////////////////////////////////////////////////////////////////////
-
-uniform sampler2D sh_input_r;
-uniform sampler2D sh_input_g;
-uniform sampler2D sh_input_b;
-
-uniform mat3 inv_modelviewprojection;
-
-VARYING vec4 vary_pos;
-
-void main(void) 
-{
-    vec2 coord = vary_pos.xy + vec2(0.5,0.5);
-
-    coord.x *= (1.6/0.9);
-
-    if (dot(coord, coord) > 0.25)
-    {
-        discard;
-    }
-
-    vec4 n = vec4(coord*2.0, 0.0, 1);
-    //n.y = -n.y;
-    n.z = sqrt(max(1.0-n.x*n.x-n.y*n.y, 0.0));
-    //n.xyz = inv_modelviewprojection * n.xyz;
-
-    vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
-    vec4 l1r = texture2D(sh_input_r, vec2(0,0));
-    vec4 l1g = texture2D(sh_input_g, vec2(0,0));
-    vec4 l1b = texture2D(sh_input_b, vec2(0,0));
-    vec3 indirect = vec3(
-                      dot(l1r, l1tap * n),
-                      dot(l1g, l1tap * n),
-                      dot(l1b, l1tap * n));
-
-    //indirect = pow(indirect, vec3(0.45));
-    indirect *= 3.0;
-
-	frag_color = vec4(indirect, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl
deleted file mode 100644
index 8f32dfde79d..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl
+++ /dev/null
@@ -1,33 +0,0 @@
-/** 
- * @file class3/deferred/shVisV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-ATTRIBUTE vec3 position;
-VARYING vec4 vary_pos;
-
-void main()
-{
-    // Output
-    vary_pos = vec4(position, 1);
-    gl_Position = vary_pos;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl
deleted file mode 100644
index 345c07a354e..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl
+++ /dev/null
@@ -1,58 +0,0 @@
-/** 
- * @file shadowAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2D diffuseMap;
-
-#if !defined(DEPTH_CLAMP)
-VARYING float pos_zd2;
-#endif
-
-VARYING float pos_w;
-
-VARYING float target_pos_x;
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-VARYING vec3 pos;
-
-vec4 computeMoments(float depth, float a);
-
-void main() 
-{
-	float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a;
-
-    frag_color = computeMoments(length(pos), float a);
-
-#if !defined(DEPTH_CLAMP)
-	gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0);
-#endif
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl
deleted file mode 100644
index af1461c297c..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl
+++ /dev/null
@@ -1,66 +0,0 @@
-/** 
- * @file shadowAlphaMaskV.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 texture_matrix0;
-uniform mat4 modelview_projection_matrix;
-uniform float shadow_target_width;
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec4 diffuse_color;
-ATTRIBUTE vec2 texcoord0;
-
-#if !defined(DEPTH_CLAMP)
-VARYING float pos_zd2;
-#endif
-
-VARYING float target_pos_x;
-VARYING vec4 pos;
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-
-void passTextureIndex();
-
-void main()
-{
-	//transform vertex
-	vec4 pre_pos = vec4(position.xyz, 1.0);
-	vec4 pos = modelview_projection_matrix * pre_pos;
-	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
-
-	pos_w = pos.w;
-
-#if !defined(DEPTH_CLAMP)
-	pos_zd2 = pos.z * 0.5;
-	
-	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-#else
-	gl_Position = pos;
-#endif
-	
-	passTextureIndex();
-
-	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-	vertex_color = diffuse_color;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl
deleted file mode 100644
index 50f1ffd6266..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl
+++ /dev/null
@@ -1,74 +0,0 @@
-/** 
- * @file class3/deferred/shadowAlphaMaskF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2D diffuseMap;
-
-#if !defined(DEPTH_CLAMP)
-VARYING float pos_zd2;
-#endif
-
-VARYING float pos_w;
-
-VARYING float target_pos_x;
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-
-vec4 getPosition(vec2 screen_coord);
-vec4 computeMoments(float depth, float a);
-
-void main() 
-{
-    vec4 pos = getPosition(vary_texcoord0.xy);
-
-    float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a;
-
-    if (alpha < 0.05) // treat as totally transparent
-    {
-        discard;
-    }
-
-    if (alpha < 0.88) // treat as semi-transparent
-    {
-        if (fract(0.5*floor(target_pos_x / pos_w )) < 0.25)
-        {
-            discard;
-        }
-    }
-
-    frag_color = computeMoments(length(pos.xyz), alpha);
-    
-#if !defined(DEPTH_CLAMP)
-    gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0);
-#endif
-
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl
deleted file mode 100644
index 6a646f5e9e9..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl
+++ /dev/null
@@ -1,67 +0,0 @@
-/** 
- * @file class3/deferred/shadowAlphaMaskV.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 texture_matrix0;
-uniform mat4 modelview_projection_matrix;
-uniform float shadow_target_width;
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec4 diffuse_color;
-ATTRIBUTE vec2 texcoord0;
-
-#if !defined(DEPTH_CLAMP)
-VARYING float pos_zd2;
-#endif
-
-VARYING vec4 pos;
-VARYING float target_pos_x;
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-
-void passTextureIndex();
-
-void main()
-{
-	//transform vertex
-	vec4 pre_pos = vec4(position.xyz, 1.0);
-
-	pos = modelview_projection_matrix * pre_pos;
-
-	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
-
-#if !defined(DEPTH_CLAMP)
-	pos_zd2 = pos.z * 0.5;
-	
-	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-#else
-	gl_Position = pos;
-#endif
-	
-	passTextureIndex();
-
-	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-
-	vertex_color = diffuse_color;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl
deleted file mode 100644
index db8c75fb8ad..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl
+++ /dev/null
@@ -1,50 +0,0 @@
-/** 
- * @file class3/deferred/shadowCubeV.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 modelview_projection_matrix;
-
-ATTRIBUTE vec3 position;
-
-#if !defined(DEPTH_CLAMP)
-VARYING vec4 post_pos;
-#endif
-
-uniform vec3 box_center;
-uniform vec3 box_size;
-
-void main()
-{
-	//transform vertex
-	vec3 p = position*box_size+box_center;
-	vec4 pos = modelview_projection_matrix*vec4(p.xyz, 1.0);
-
-#if !defined(DEPTH_CLAMP)
-	post_pos = pos;
-
-	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-#else
-	gl_Position = pos;
-#endif
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl
deleted file mode 100644
index 3350267130b..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/** 
- * @file class3/deferred/shadowF.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2D diffuseMap;
-
-#if !defined(DEPTH_CLAMP)
-VARYING float pos_zd2;
-#endif
-
-VARYING vec4 pos;
-VARYING float target_pos_x;
-
-vec4 computeMoments(float depth, float a);
-
-void main() 
-{
-    frag_color = computeMoments(length(pos), 1.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl
deleted file mode 100644
index 2f69a353e86..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl
+++ /dev/null
@@ -1,157 +0,0 @@
-/** 
- * @file class3/deferred/shadowUtil.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform sampler2D       shadowMap0;
-uniform sampler2D       shadowMap1;
-uniform sampler2D       shadowMap2;
-uniform sampler2D       shadowMap3;
-uniform sampler2D       shadowMap4;
-uniform sampler2D       shadowMap5;
-
-uniform vec3 sun_dir;
-uniform vec3 moon_dir;
-uniform vec2 shadow_res;
-uniform vec2 proj_shadow_res;
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-uniform float shadow_bias;
-
-uniform float spot_shadow_bias;
-uniform float spot_shadow_offset;
-
-float getDepth(vec2 screenpos);
-vec3 getNorm(vec2 screenpos);
-vec4 getPosition(vec2 pos_screen);
-
-float ReduceLightBleeding(float p_max, float Amount)
-{
-    return smoothstep(Amount, 1, p_max);
-}
-
-float ChebyshevUpperBound(vec2 m, float t, float min_v, float Amount)
-{
-    float p = (t <= m.x) ? 1.0 : 0.0;
-
-    float v = m.y - (m.x*m.x);
-    v = max(v, min_v);
-
-    float d = t - m.x;
-
-    float p_max = v / (v + d*d);
-
-    p_max = ReduceLightBleeding(p_max, Amount);
-
-    return max(p, p_max);
-}
-
-vec4 computeMoments(float depth, float a)
-{
-    float m1 = depth;
-    float dx = dFdx(depth);
-    float dy = dFdy(depth);
-    float m2 = m1*m1 + 0.25 * a * (dx*dx + dy*dy);
-    return vec4(m1, m2, a, max(dx, dy));
-}
-
-float vsmDirectionalSample(vec4 stc, float depth, sampler2D shadowMap, mat4 shadowMatrix)
-{
-    vec4 lpos = shadowMatrix * stc;
-    vec4 moments = texture2D(shadowMap, lpos.xy);
-    return ChebyshevUpperBound(moments.rg, depth - shadow_bias * 256.0f, 0.125, 0.9);
-}
-
-float vsmSpotSample(vec4 stc, float depth, sampler2D shadowMap, mat4 shadowMatrix)
-{
-    vec4 lpos = shadowMatrix * stc;
-    vec4 moments = texture2D(shadowMap, lpos.xy);
-    lpos.xyz /= lpos.w;
-    lpos.xy *= 0.5;
-    lpos.xy += 0.5;
-    return ChebyshevUpperBound(moments.rg, depth - spot_shadow_bias * 16.0f, 0.125, 0.9);
-}
-
-#if VSM_POINT_SHADOWS
-float vsmPointSample(float lightDistance, vec3 lightDirection, samplerCube shadow_cube_map)
-{
-    vec4 moments = textureCube(shadow_cube_map, light_direction);
-    return ChebyshevUpperBound(moments.rg, light_distance, 0.01, 0.25);
-}
-#endif
-
-float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)
-{
-	if (pos.z < -shadow_clip.w)
-    {
-        discard;
-    }
-
-    float depth = getDepth(pos_screen);
-
-    vec4 spos       = vec4(pos,1.0);
-    vec4 near_split = shadow_clip*-0.75;
-    vec4 far_split  = shadow_clip*-1.25;
-
-    float shadow = 0.0f;
-    float weight = 1.0;
-
-    if (spos.z < near_split.z)
-    {
-        shadow += vsmDirectionalSample(spos, depth, shadowMap3, shadow_matrix[3]);
-        weight += 1.0f;
-    }
-    if (spos.z < near_split.y)
-    {
-        shadow += vsmDirectionalSample(spos, depth, shadowMap2, shadow_matrix[2]);
-        weight += 1.0f;
-    }
-    if (spos.z < near_split.x)
-    {
-        shadow += vsmDirectionalSample(spos, depth, shadowMap1, shadow_matrix[1]);
-        weight += 1.0f;
-    }
-    if (spos.z > far_split.x)
-    {
-        shadow += vsmDirectionalSample(spos, depth, shadowMap0, shadow_matrix[0]);
-        weight += 1.0f;
-    }
-
-    shadow /= weight;
-
-    return shadow;
-}
-
-float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen)
-{
-	if (pos.z < -shadow_clip.w)
-    {
-        discard;
-    }
-
-    float depth = getDepth(pos_screen);
-
-    pos += norm * spot_shadow_offset;
-    return vsmSpotSample(vec4(pos, 1.0), depth, (index == 0) ? shadowMap4 : shadowMap5, shadow_matrix[4 + index]);
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl
deleted file mode 100644
index 6577fe0ecfe..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl
+++ /dev/null
@@ -1,62 +0,0 @@
-/** 
- * @file class3/deferred/shadowV.glsl
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 modelview_projection_matrix;
-uniform float shadow_target_width;
-uniform mat4 texture_matrix0;
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec2 texcoord0;
-
-#if !defined(DEPTH_CLAMP)
-VARYING float pos_zd2;
-#endif
-
-VARYING vec4 pos;
-VARYING float target_pos_x;
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-
-void passTextureIndex();
-
-void main()
-{
-	//transform vertex
-	vec4 pre_pos = vec4(position.xyz, 1.0);
-
-	pos = modelview_projection_matrix * pre_pos;
-
-	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
-
-#if !defined(DEPTH_CLAMP)
-	pos_zd2 = pos.z * 0.5;
-	
-	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-#else
-	gl_Position = pos;
-#endif
-	
-	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl
deleted file mode 100644
index a0b082ed7cc..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl
+++ /dev/null
@@ -1,126 +0,0 @@
-/** 
- * @file class3/deferred/skyF.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
-
-VARYING vec2 vary_frag;
-
-uniform vec3 camPosLocal;
-uniform vec3 sun_dir;
-uniform float sun_size;
-uniform float far_z;
-uniform mat4 inv_proj;
-uniform mat4 inv_modelview;
-
-uniform sampler2D transmittance_texture;
-uniform sampler3D scattering_texture;
-uniform sampler3D single_mie_scattering_texture;
-uniform sampler2D irradiance_texture;
-uniform sampler2D rainbow_map;
-uniform sampler2D halo_map;
-
-uniform float moisture_level;
-uniform float droplet_radius;
-uniform float ice_level;
-
-vec3 GetSolarLuminance();
-vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
-vec3 GetSkyLuminanceToPoint(vec3 camPos, vec3 pos, float shadow_length, vec3 dir, out vec3 transmittance);
-
-vec3 ColorFromRadiance(vec3 radiance);
-vec3 rainbow(float d)
-{
-    // d is the dot product of view and sun directions, so ranging -1.0..1.0
-    // 'interesting' values of d are the range -0.75..-0.825, when view is nearly opposite of sun vec
-    // Rainbox texture mode is GL_REPEAT, so tc of -.75 is equiv to 0.25, -0.825 equiv to 0.175.
-
-    // SL-13629 Rainbow texture has colors within the correct .175...250 range, but order is inverted.
-    // Rather than replace the texture, we mirror and translate the y tc to keep the colors within the
-    // interesting range, but in reversed order:  i.e. d = (1 - d) - 1.575
-    d = clamp(-0.575 - d, 0.0, 1.0);
-
-    // With the colors in the lower 1/4 of the texture, inverting the coords leaves most of it inaccessible.
-    // So, we can stretch the texcoord above the colors (ie > 0.25) to fill the entire remaining coordinate
-    // space. This improves gradation, reduces banding within the rainbow interior. (1-0.25) / (0.425/0.25) = 4.2857
-    float interior_coord = max(0.0, d - 0.25) * 4.2857;
-    d = clamp(d, 0.0, 0.25) + interior_coord;
-
-    float rad = (droplet_radius - 5.0f) / 1024.0f;
-    return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level;
-}
-
-vec3 halo22(float d)
-{
-   float v = sqrt(max(0, 1 - (d*d)));
-   return texture2D(halo_map, vec2(0, v)).rgb * ice_level;
-}
-
-void main()
-{
-    vec3 pos      = vec3((vary_frag * 2.0) - vec2(1.0, 1.0f), 1.0);
-    vec4 view_pos = (inv_proj * vec4(pos, 1.0f));
-
-    view_pos /= view_pos.w;
-
-    vec3 view_ray = (inv_modelview * vec4(view_pos.xyz, 0.0f)).xyz + camPosLocal;
-
-    vec3 view_direction = normalize(view_ray);
-    vec3 sun_direction  = normalize(sun_dir);
-    vec3 earth_center   = vec3(0, 0, -6360.0f);
-    vec3 camPos = (camPosLocal / 1000.0f) - earth_center;
-
-    vec3 transmittance;
-    vec3 radiance_sun  = GetSkyLuminance(camPos, view_direction, 0.0f, sun_direction, transmittance);
-    vec3 solar_luminance = GetSolarLuminance();
-
-    // If the view ray intersects the Sun, add the Sun radiance.
-    float s = dot(view_direction, sun_direction);
-
-    // cheesy solar disc...
-    if (s >= (sun_size * 0.999))
-    {
-        radiance_sun += pow(smoothstep(0.0, 1.3, (s - (sun_size * 0.9))), 2.0) * solar_luminance * transmittance;
-    }
-    s = smoothstep(0.9, 1.0, s) * 16.0f;
-
-    vec3 color = ColorFromRadiance(radiance_sun);
-
-    float optic_d = dot(view_direction, sun_direction);
-    vec3 halo_22 = halo22(optic_d);
-
-    color.rgb += rainbow(optic_d) * optic_d;
-    color.rgb += halo_22;
-
-    color = pow(color, vec3(1.0/2.2));
-
-    frag_data[0] = vec4(color, 1.0 + s);
-    frag_data[1] = vec4(0.0);
-    frag_data[2] = vec4(0.0, 1.0, 0.0, 1.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class3/deferred/skyV.glsl
deleted file mode 100644
index 2eb222ada4a..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/skyV.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-/** 
- * @file class3/deferred/skyV.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec2 texcoord0;
-
-VARYING vec2 vary_frag;
-
-void main()
-{
-    // pass through untransformed fullscreen pos at back of frustum for proper sky depth testing
-	gl_Position = vec4(position.xy, 1.0f, 1.0);
-    vary_frag = texcoord0;
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index 7ed9e7b4fc6..61757882bb0 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -1,31 +1,35 @@
-/** 
- * @file class3/deferred/softenLightF.glsl
+/**
+ * @file class2/deferred/softenLightF.glsl
  *
  * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  * Second Life Viewer Source Code
  * Copyright (C) 2007, Linden Research, Inc.
- * 
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation;
  * version 2.1 of the License only.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
+ *
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
- 
+
 #extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_shader_texture_lod : enable
 
-/*[EXTRA_CODE_HERE]*/
+#define FLT_MAX 3.402823466e+38
+
+#define REFMAP_COUNT 256
+#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider
 
 #ifdef DEFINE_GL_FRAGCOLOR
 out vec4 frag_color;
@@ -36,142 +40,153 @@ out vec4 frag_color;
 uniform sampler2DRect diffuseRect;
 uniform sampler2DRect specularRect;
 uniform sampler2DRect normalMap;
+
+#if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)
 uniform sampler2DRect lightMap;
+#endif
+
 uniform sampler2DRect depthMap;
 uniform sampler2D     lightFunc;
 
-uniform samplerCube environmentMap;
 uniform float blur_size;
 uniform float blur_fidelity;
 
 // Inputs
-uniform vec4 morphFactor;
-uniform vec3 camPosLocal;
-uniform float cloud_shadow;
-uniform float max_y;
-uniform vec4 glow;
 uniform mat3 env_mat;
-uniform vec4 shadow_clip;
 
 uniform vec3 sun_dir;
+uniform vec3 moon_dir;
+uniform int  sun_up_factor;
 VARYING vec2 vary_fragcoord;
 
 uniform mat4 inv_proj;
-uniform mat4 inv_modelview;
-
 uniform vec2 screen_res;
 
-uniform sampler2D transmittance_texture;
-uniform sampler3D scattering_texture;
-uniform sampler3D single_mie_scattering_texture;
-uniform sampler2D irradiance_texture;
+vec3 getNorm(vec2 pos_screen);
+vec4 getPositionWithDepth(vec2 pos_screen, float depth);
 
-uniform sampler2D sh_input_r;
-uniform sampler2D sh_input_g;
-uniform sampler2D sh_input_b;
+void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
+float getAmbientClamp();
+vec3  atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
+vec3  scaleSoftClipFrag(vec3 l);
+vec3  fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
+vec3  fullbrightScaleSoftClip(vec3 light);
 
-vec3 GetSunAndSkyIrradiance(vec3 camPos, vec3 norm, vec3 dir, out vec3 sky_irradiance);
-vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
-vec3 GetSkyLuminanceToPoint(vec3 camPos, vec3 pos, float shadow_length, vec3 dir, out vec3 transmittance);
+// reflection probe interface
+void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv, 
+        vec3 pos, vec3 norm, float glossiness, float envIntensity);
+void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
+void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
 
-vec3 ColorFromRadiance(vec3 radiance);
-vec4 getPositionWithDepth(vec2 pos_screen, float depth);
-vec4 getPosition(vec2 pos_screen);
-vec3 getNorm(vec2 pos_screen);
+vec3 linear_to_srgb(vec3 c);
+vec3 srgb_to_linear(vec3 c);
 
 #ifdef WATER_FOG
 vec4 applyWaterFogView(vec3 pos, vec4 color);
 #endif
 
-void main() 
+void main()
 {
-    vec2 tc = vary_fragcoord.xy;
-    float depth = texture2DRect(depthMap, tc.xy).r;
-    vec3 pos = getPositionWithDepth(tc, depth).xyz;
-    vec4 norm = texture2DRect(normalMap, tc);
+    vec2  tc           = vary_fragcoord.xy;
+    float depth        = texture2DRect(depthMap, tc.xy).r;
+    vec4  pos          = getPositionWithDepth(tc, depth);
+    vec4  norm         = texture2DRect(normalMap, tc);
     float envIntensity = norm.z;
-    norm.xyz = getNorm(tc);
+    norm.xyz           = getNorm(tc);
+
+    vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;
+    float da          = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
+    float light_gamma = 1.0 / 1.3;
+    da                = pow(da, light_gamma);
 
-    float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
+    vec4 diffuse     = texture2DRect(diffuseRect, tc);
+         diffuse.rgb = linear_to_srgb(diffuse.rgb); // SL-14025
+    vec4 spec        = texture2DRect(specularRect, vary_fragcoord.xy);
 
-    vec4 diffuse = texture2DRect(diffuseRect, tc); // sRGB
-    diffuse.rgb = srgb_to_linear(diffuse.rgb);
 
-    vec3 col;
+#if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)
+    vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
+    scol_ambocc      = pow(scol_ambocc, vec2(light_gamma));
+    float scol       = max(scol_ambocc.r, diffuse.a);
+    float ambocc     = scol_ambocc.g;
+#else
+    float scol = 1.0;
+    float ambocc = 1.0;
+#endif
+
+    vec3  color = vec3(0);
     float bloom = 0.0;
+
+    vec3 sunlit;
+    vec3 amblit;
+    vec3 additive;
+    vec3 atten;
+
+    calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
+
+    //vec3 amb_vec = env_mat * norm.xyz;
+
+    vec3 ambenv;
+    vec3 glossenv;
+    vec3 legacyenv;
+    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
+
+    amblit = max(ambenv, amblit);
+    color.rgb = amblit*ambocc;
+
+    //float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
+    //ambient *= 0.5;
+    //ambient *= ambient;
+    //ambient = (1.0 - ambient);
+    //color.rgb *= ambient;
+
+    vec3 sun_contrib = min(da, scol) * sunlit;
+    color.rgb += sun_contrib;
+    color.rgb = min(color.rgb, vec3(1,1,1));
+    color.rgb *= diffuse.rgb;
+
+    vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
+
+    if (spec.a > 0.0)  // specular reflection
     {
-        vec3 camPos = (camPosLocal / 1000.0f) + vec3(0, 0, 6360.0f);
-
-        vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
-        
-        vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
-
-        float scol = max(scol_ambocc.r, diffuse.a); 
-
-        float ambocc = scol_ambocc.g;
-
-        vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
-        vec4 l1r = texture2D(sh_input_r, vec2(0,0));
-        vec4 l1g = texture2D(sh_input_g, vec2(0,0));
-        vec4 l1b = texture2D(sh_input_b, vec2(0,0));
-
-        vec3 indirect = vec3(dot(l1r, l1tap * vec4(1, norm.xyz)),
-                             dot(l1g, l1tap * vec4(1, norm.xyz)),
-                             dot(l1b, l1tap * vec4(1, norm.xyz)));
-
-        indirect = clamp(indirect, vec3(0), vec3(1.0));
-
-        vec3 transmittance;
-        vec3 sky_irradiance;
-        vec3 sun_irradiance = GetSunAndSkyIrradiance(camPos, norm.xyz, sun_dir, sky_irradiance);
-        vec3 inscatter = GetSkyLuminanceToPoint(camPos, (pos / 1000.f) + vec3(0, 0, 6360.0f), scol, sun_dir, transmittance);
-
-        vec3 radiance   = scol * (sun_irradiance + sky_irradiance) + inscatter;
-        vec3 atmo_color = ColorFromRadiance(radiance);
-
-        col = atmo_color + indirect;
-        col *= transmittance;
-        col *= diffuse.rgb;
-
-        vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
-
-        if (spec.a > 0.0) // specular reflection
-        {
-            // the old infinite-sky shiny reflection
-            //
-            float sa = dot(refnormpersp, sun_dir.xyz);
-            vec3 dumbshiny = scol * texture2D(lightFunc, vec2(sa, spec.a)).r * atmo_color;
-            
-            // add the two types of shiny together
-            vec3 spec_contrib = dumbshiny * spec.rgb * 0.25;
-            bloom = dot(spec_contrib, spec_contrib);
-            col += spec_contrib;
-        }
-
-        col = mix(col, diffuse.rgb, diffuse.a);
-
-        if (envIntensity > 0.0)
-        { //add environmentmap
-            vec3 env_vec = env_mat * refnormpersp;
-            vec3 sun_direction  = (inv_modelview * vec4(sun_dir, 1.0)).xyz;
-            vec3 radiance_sun  = GetSkyLuminance(camPos, env_vec, 0.0f, sun_direction, transmittance);
-            vec3 refcol = ColorFromRadiance(radiance_sun);
-            col = mix(col.rgb, refcol, envIntensity);
-        }
-                        
-        /*if (norm.w < 0.5)
-        {
-            col = scaleSoftClipFrag(col);
-        }*/
-
-        #ifdef WATER_FOG
-            vec4 fogged = applyWaterFogView(pos,vec4(col, bloom));
-            col = fogged.rgb;
-            bloom = fogged.a;
-        #endif
+        float sa        = dot(normalize(refnormpersp), light_dir.xyz);
+        vec3  dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
+
+        // add the two types of shiny together
+        vec3 spec_contrib = dumbshiny * spec.rgb;
+        bloom             = dot(spec_contrib, spec_contrib) / 6;
+        color.rgb += spec_contrib;
+
+        // add reflection map - EXPERIMENTAL WORK IN PROGRESS
+        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
     }
 
-    //output linear since gamma correction happens down stream
-    frag_color.rgb = col;
+    color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
+
+    if (envIntensity > 0.0)
+    {  // add environmentmap
+        //fudge darker
+        legacyenv *= 0.5*diffuse.a+0.5;;
+        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
+    }
+
+    if (norm.w < 0.5)
+    {
+        color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a);
+        color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);
+    }
+
+#ifdef WATER_FOG
+    vec4 fogged = applyWaterFogView(pos.xyz, vec4(color, bloom));
+    color       = fogged.rgb;
+    bloom       = fogged.a;
+#endif
+
+    // convert to linear as fullscreen lights need to sum in linear colorspace
+    // and will be gamma (re)corrected downstream...
+    //color = vec3(ambocc);
+    //color = ambenv;
+    //color.b = diffuse.a;
+    frag_color.rgb = srgb_to_linear(color.rgb);
     frag_color.a = bloom;
 }
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
deleted file mode 100644
index 9d872b8df81..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
+++ /dev/null
@@ -1,38 +0,0 @@
-/** 
- * @file class3/deferred/softenLightV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-ATTRIBUTE vec3 position;
-
-VARYING vec2 vary_fragcoord;
-
-uniform mat4 modelview_projection_matrix;
-uniform vec2 screen_res;
-
-void main()
-{
-	//transform vertex
-	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
-	gl_Position = pos; 
-	vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
deleted file mode 100644
index 56b0f4e5cec..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
+++ /dev/null
@@ -1,287 +0,0 @@
-/** 
- * @file spotLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#extension GL_ARB_texture_rectangle : enable
-#extension GL_ARB_shader_texture_lod : enable
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect specularRect;
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform samplerCube environmentMap;
-uniform sampler2DRect lightMap;
-uniform sampler2D noiseMap;
-uniform sampler2D projectionMap;
-uniform sampler2D lightFunc;
-
-uniform mat4 proj_mat; //screen space to light space
-uniform float proj_near; //near clip for projection
-uniform vec3 proj_p; //plane projection is emitting from (in screen space)
-uniform vec3 proj_n;
-uniform float proj_focus; //distance from plane to begin blurring
-uniform float proj_lod;  //(number of mips in proj map)
-uniform float proj_range; //range between near clip and far clip plane of projection
-uniform float proj_ambient_lod;
-uniform float proj_ambiance;
-uniform float near_clip;
-uniform float far_clip;
-
-uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
-uniform float sun_wash;
-uniform int proj_shadow_idx;
-uniform float shadow_fade;
-
-uniform float size;
-uniform vec3 color;
-uniform float falloff;
-
-VARYING vec3 trans_center;
-VARYING vec4 vary_fragcoord;
-uniform vec2 screen_res;
-
-uniform mat4 inv_proj;
-
-vec3 getNorm(vec2 pos_screen);
-
-vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
-{
-    vec4 ret = texture2DLod(projectionMap, tc, lod);
-    
-    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
-    
-    float det = min(lod/(proj_lod*0.5), 1.0);
-    
-    float d = min(dist.x, dist.y);
-    
-    d *= min(1, d * (proj_lod - lod));
-    
-    float edge = 0.25*det;
-    
-    ret *= clamp(d/edge, 0.0, 1.0);
-    
-    return ret;
-}
-
-vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
-{
-    vec4 ret = texture2DLod(projectionMap, tc, lod);
-    
-    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
-    
-    float det = min(lod/(proj_lod*0.5), 1.0);
-    
-    float d = min(dist.x, dist.y);
-    
-    float edge = 0.25*det;
-        
-    ret *= clamp(d/edge, 0.0, 1.0);
-    
-    return ret;
-}
-
-vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
-{
-    vec4 ret = texture2DLod(projectionMap, tc, lod);
-    
-    vec2 dist = tc-vec2(0.5);
-    
-    float d = dot(dist,dist);
-        
-    ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
-    
-    return ret;
-}
-
-
-vec4 getPosition(vec2 pos_screen);
-
-void main() 
-{
-    vec4 frag = vary_fragcoord;
-    frag.xyz /= frag.w;
-    frag.xyz = frag.xyz*0.5+0.5;
-    frag.xy *= screen_res;
-    
-    vec3 pos = getPosition(frag.xy).xyz;
-    vec3 lv = trans_center.xyz-pos.xyz;
-    float dist = length(lv);
-    dist /= size;
-    if (dist > 1.0)
-    {
-        discard;
-    }
-    
-    float shadow = 1.0;
-    
-    if (proj_shadow_idx >= 0)
-    {
-        vec4 shd = texture2DRect(lightMap, frag.xy);
-        shadow = (proj_shadow_idx == 0) ? shd.b : shd.a;
-        shadow += shadow_fade;
-        shadow = clamp(shadow, 0.0, 1.0);
-    }
-    
-    vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
-    float envIntensity = norm.z;
-    norm = getNorm(frag.xy);
-    
-    norm = normalize(norm);
-    float l_dist = -dot(lv, proj_n);
-    
-    vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
-    if (proj_tc.z < 0.0)
-    {
-        discard;
-    }
-    
-    proj_tc.xyz /= proj_tc.w;
-    
-    float fa = (falloff*0.5) + 1.0;
-    float dist_atten = min(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 1.0);
-    dist_atten *= dist_atten;
-    dist_atten *= 2.0;
-
-    if (dist_atten <= 0.0)
-    {
-        discard;
-    }
-    
-    lv = proj_origin-pos.xyz;
-    lv = normalize(lv);
-    float da = dot(norm, lv);
-        
-    vec3 col = vec3(0,0,0);
-        
-    vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb);
-        
-    vec4 spec = texture2DRect(specularRect, frag.xy);
-
-    vec3 dlit = vec3(0, 0, 0);
-
-    float noise = texture2D(noiseMap, frag.xy/128.0).b;
-    if (proj_tc.z > 0.0 &&
-        proj_tc.x < 1.0 &&
-        proj_tc.y < 1.0 &&
-        proj_tc.x > 0.0 &&
-        proj_tc.y > 0.0)
-    {
-        float amb_da = proj_ambiance;
-        float lit = 0.0;
-        
-        if (da > 0.0)
-        {
-            lit = da * dist_atten * noise;
-
-            float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
-            float lod = diff * proj_lod;
-            
-            vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
-        
-            dlit = color.rgb * plcol.rgb * plcol.a;
-            
-            col = dlit*lit*diff_tex*shadow;
-            amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;
-        }
-        
-        //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
-        vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
-                            
-        amb_da += (da*da*0.5+0.5)*(1.0-shadow)*proj_ambiance;
-                
-        amb_da *= dist_atten * noise;
-            
-        amb_da = min(amb_da, 1.0-lit);
-            
-        col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
-    }
-    
-
-    if (spec.a > 0.0)
-    {
-        dlit *= min(da*6.0, 1.0) * dist_atten;
-        vec3 npos = -normalize(pos);
-
-        //vec3 ref = dot(pos+lv, norm);
-        vec3 h = normalize(lv+npos);
-        float nh = dot(norm, h);
-        float nv = dot(norm, npos);
-        float vh = dot(npos, h);
-        float sa = nh;
-        float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
-
-        float gtdenom = 2 * nh;
-        float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
-                                
-        if (nh > 0.0)
-        {
-            float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
-            col += dlit*scol*spec.rgb*shadow;
-        }
-    }   
-    
-
-    if (envIntensity > 0.0)
-    {
-        vec3 ref = reflect(normalize(pos), norm);
-        
-        //project from point pos in direction ref to plane proj_p, proj_n
-        vec3 pdelta = proj_p-pos;
-        float ds = dot(ref, proj_n);
-        
-        if (ds < 0.0)
-        {
-            vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
-            
-            vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
-
-            if (stc.z > 0.0)
-            {
-                stc /= stc.w;
-                                
-                if (stc.x < 1.0 &&
-                    stc.y < 1.0 &&
-                    stc.x > 0.0 &&
-                    stc.y > 0.0)
-                {
-                    col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity;
-                }
-            }
-        }
-    }
-    
-    //not sure why, but this line prevents MATBUG-194
-    col = max(col, vec3(0.0));
-
-    frag_color.rgb = col;   
-    frag_color.a = 0.0;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl
deleted file mode 100644
index 112b498c902..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl
+++ /dev/null
@@ -1,57 +0,0 @@
-/** 
- * @file class3\deferred\sunLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-//class 2, shadows, no SSAO
-
-// Inputs
-VARYING vec2 vary_fragcoord;
-
-vec4 getPosition(vec2 pos_screen);
-vec3 getNorm(vec2 pos_screen);
-
-float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); 
-float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen); 
-
-void main() 
-{
-	vec2 pos_screen = vary_fragcoord.xy;
-	vec4 pos = getPosition(pos_screen);
-	vec3 norm = getNorm(pos_screen);
-
-	frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
-	frag_color.g = 1.0f;
-    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
-    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl
deleted file mode 100644
index 342a2ff3ede..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl
+++ /dev/null
@@ -1,61 +0,0 @@
-/** 
- * @file class3\deferred\sunLightSSAOF.glsl
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#extension GL_ARB_texture_rectangle : enable
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-//class 2 -- shadows and SSAO
-
-// Inputs
-VARYING vec2 vary_fragcoord;
-
-uniform vec3 sun_dir;
-
-vec4 getPosition(vec2 pos_screen);
-vec3 getNorm(vec2 pos_screen);
-
-float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
-float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen);
-
-//calculate decreases in ambient lighting when crowded out (SSAO)
-float calcAmbientOcclusion(vec4 pos, vec3 norm, vec2 pos_screen);
-
-void main() 
-{
-	vec2 pos_screen = vary_fragcoord.xy;
-	vec4 pos        = getPosition(pos_screen);
-	vec3 norm       = getNorm(pos_screen);
-
-	frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
-    frag_color.b = calcAmbientOcclusion(pos, norm, pos_screen);
-    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
-    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl
deleted file mode 100644
index bc5eb5181d0..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-/** 
- * @file sunLightV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 modelview_projection_matrix;
-
-ATTRIBUTE vec3 position;
-
-VARYING vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-void main()
-{
-	//transform vertex
-	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
-	gl_Position = pos; 
-	
-	vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;	
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl
deleted file mode 100644
index 41673d16694..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl
+++ /dev/null
@@ -1,59 +0,0 @@
-/** 
- * @file treeShadowF.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform float minimum_alpha;
-
-uniform sampler2D diffuseMap;
-
-VARYING vec4 pos;
-VARYING vec2 vary_texcoord0;
-
-vec4 computeMoments(float d, float a);
-
-void main() 
-{
-	float alpha = texture2D(diffuseMap, vary_texcoord0.xy).a;
-
-	if (alpha < minimum_alpha)
-	{
-		discard;
-	}
-
-    frag_color = computeMoments(length(pos), 1.0);
-
-#if !defined(DEPTH_CLAMP)
-	gl_FragDepth = max(pos.z/pos.w*0.5+0.5, 0.0);
-#endif
-
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl
deleted file mode 100644
index 15e769ac10f..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl
+++ /dev/null
@@ -1,43 +0,0 @@
-/** 
- * @file treeShadowV.glsl
- *
-  * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 texture_matrix0;
-uniform mat4 modelview_projection_matrix;
- 
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec2 texcoord0;
-
-VARYING vec4 pos;
-VARYING vec2 vary_texcoord0;
-
-void main()
-{
-	//transform vertex
-	pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
-
-	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-	
-	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl
deleted file mode 100644
index 540226e672a..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * @file underWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
-
-uniform sampler2D diffuseMap;
-uniform sampler2D bumpMap;   
-uniform sampler2D screenTex;
-uniform sampler2D refTex;
-uniform sampler2D screenDepth;
-
-uniform vec4 fogCol;
-uniform vec3 lightDir;
-uniform vec3 specular;
-uniform float lightExp;
-uniform vec2 fbScale;
-uniform float refScale;
-uniform float znear;
-uniform float zfar;
-uniform float kd;
-uniform vec4 waterPlane;
-uniform vec3 eyeVec;
-uniform vec4 waterFogColor;
-uniform float waterFogDensity;
-uniform float waterFogKS;
-uniform vec2 screenRes;
-
-//bigWave is (refCoord.w, view.w);
-VARYING vec4 refCoord;
-VARYING vec4 littleWave;
-VARYING vec4 view;
-
-vec2 encode_normal(vec3 n);
-
-vec4 applyWaterFog(vec4 color, vec3 viewVec)
-{
-	//normalize view vector
-	vec3 view = normalize(viewVec);
-	float es = -view.z;
-
-	//find intersection point with water plane and eye vector
-	
-	//get eye depth
-	float e0 = max(-waterPlane.w, 0.0);
-	
-	//get object depth
-	float depth = length(viewVec);
-		
-	//get "thickness" of water
-	float l = max(depth, 0.1);
-
-	float kd = waterFogDensity;
-	float ks = waterFogKS;
-	vec4 kc = waterFogColor;
-	
-	float F = 0.98;
-	
-	float t1 = -kd * pow(F, ks * e0);
-	float t2 = kd + ks * es;
-	float t3 = pow(F, t2*l) - 1.0;
-	
-	float L = min(t1/t2*t3, 1.0);
-	
-	float D = pow(0.98, l*kd);
-	return color * D + kc * L;
-}
-
-void main() 
-{
-	vec4 color;
-	    
-	//get detail normals
-	vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
-	vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
-	vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;    
-	vec3 wavef = normalize(wave1+wave2+wave3);
-	
-	//figure out distortion vector (ripply)   
-	vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
-	distort = distort+wavef.xy*refScale;
-		
-	vec4 fb = texture2D(screenTex, distort);
-
-	frag_data[0] = vec4(fb.rgb, 1.0); // diffuse
-	frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec
-	frag_data[2] = vec4(encode_normal(wavef), 0.0, 0.0); // normalxyz, displace
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class3/deferred/waterF.glsl
deleted file mode 100644
index c65cf48c673..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/waterF.glsl
+++ /dev/null
@@ -1,174 +0,0 @@
-/** 
- * @file waterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#extension GL_ARB_texture_rectangle : enable
-
-/*[EXTRA_CODE_HERE]*/
-
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
-
-uniform sampler2D bumpMap;   
-uniform sampler2D bumpMap2;
-uniform float blend_factor;
-uniform sampler2D screenTex;
-uniform sampler2D refTex;
-
-uniform float sunAngle;
-uniform float sunAngle2;
-uniform vec3 lightDir;
-uniform vec3 specular;
-uniform float lightExp;
-uniform float refScale;
-uniform float kd;
-uniform vec2 screenRes;
-uniform vec3 normScale;
-uniform float fresnelScale;
-uniform float fresnelOffset;
-uniform float blurMultiplier;
-uniform vec2 screen_res;
-uniform mat4 norm_mat; //region space to screen space
-
-//bigWave is (refCoord.w, view.w);
-VARYING vec4 refCoord;
-VARYING vec4 littleWave;
-VARYING vec4 view;
-VARYING vec4 vary_position;
-
-vec3 scaleSoftClip(vec3 c);
-vec2 encode_normal(vec3 n);
-
-vec3 BlendNormal(vec3 bump1, vec3 bump2)
-{
-    //vec3 normal   = bump1.xyz * vec3( 2.0,  2.0, 2.0) - vec3(1.0, 1.0,  0.0);
-    //vec3 normal2  = bump2.xyz * vec3(-2.0, -2.0, 2.0) + vec3(1.0, 1.0, -1.0);
-    //vec3 n        = normalize(normal * dot(normal, normal2) - (normal2 * normal.z));
-    vec3 n = normalize(mix(bump1, bump2, blend_factor));
-    return n;
-}
-
-void main() 
-{
-	vec4 color;
-	float dist = length(view.xy);
-	
-	//normalize view vector
-	vec3 viewVec = normalize(view.xyz);
-	
-	//get wave normals
-	vec3 wave1_a = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
-	vec3 wave2_a = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
-	vec3 wave3_a = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
-
-
-	vec3 wave1_b = texture2D(bumpMap2, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
-	vec3 wave2_b = texture2D(bumpMap2, littleWave.xy).xyz*2.0-1.0;
-	vec3 wave3_b = texture2D(bumpMap2, littleWave.zw).xyz*2.0-1.0;
-
-    vec3 wave1 = BlendNormal(wave1_a, wave1_b);
-    vec3 wave2 = BlendNormal(wave2_a, wave2_b);
-    vec3 wave3 = BlendNormal(wave3_a, wave3_b);
-
-	//get base fresnel components	
-	
-	vec3 df = vec3(
-					dot(viewVec, wave1),
-					dot(viewVec, (wave2 + wave3) * 0.5),
-					dot(viewVec, wave3)
-				 ) * fresnelScale + fresnelOffset;
-	df *= df;
-		    
-	vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
-	
-	float dist2 = dist;
-	dist = max(dist, 5.0);
-	
-	float dmod = sqrt(dist);
-	
-	vec2 dmod_scale = vec2(dmod*dmod, dmod);
-	
-	//get reflected color
-	vec2 refdistort1 = wave1.xy*normScale.x;
-	vec2 refvec1 = distort+refdistort1/dmod_scale;
-	vec4 refcol1 = texture2D(refTex, refvec1);
-	
-	vec2 refdistort2 = wave2.xy*normScale.y;
-	vec2 refvec2 = distort+refdistort2/dmod_scale;
-	vec4 refcol2 = texture2D(refTex, refvec2);
-	
-	vec2 refdistort3 = wave3.xy*normScale.z;
-	vec2 refvec3 = distort+refdistort3/dmod_scale;
-	vec4 refcol3 = texture2D(refTex, refvec3);
-
-	vec4 refcol = refcol1 + refcol2 + refcol3;
-	float df1 = df.x + df.y + df.z;
-	refcol *= df1 * 0.333;
-	
-	vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5;
-	wavef.z *= max(-viewVec.z, 0.1);
-	wavef = normalize(wavef);
-	
-	float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset;
-	
-	vec2 refdistort4 = wavef.xy*0.125;
-	refdistort4.y -= abs(refdistort4.y);
-	vec2 refvec4 = distort+refdistort4/dmod;
-	float dweight = min(dist2*blurMultiplier, 1.0);
-	vec4 baseCol = texture2D(refTex, refvec4);
-
-	refcol = mix(baseCol*df2, refcol, dweight);
-
-	//get specular component
-	float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);
-		
-	//harden specular
-	spec = pow(spec, 128.0);
-
-	//figure out distortion vector (ripply)   
-	vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0);
-		
-	vec4 fb = texture2D(screenTex, distort2);
-	
-	//mix with reflection
-	// Note we actually want to use just df1, but multiplying by 0.999999 gets around an nvidia compiler bug
-	color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999);
-
-    color.rgb *= 2.0f;
-    color.rgb = scaleSoftClip(color.rgb);
-	
-	vec4 pos = vary_position;
-	
-	color.rgb += spec * specular;
-	color.a    = spec * sunAngle2;
-    
-	vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz);
-	
-	frag_data[0] = vec4(color.rgb, color); // diffuse
-	frag_data[1] = vec4(spec * specular, spec);		// speccolor, spec
-	frag_data[2] = vec4(encode_normal(wavef.xyz), 0.05, 0);// normalxy, 0, 0
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl
deleted file mode 100644
index 02000d90ca4..00000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl
+++ /dev/null
@@ -1,95 +0,0 @@
-/** 
- * @file waterV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 modelview_matrix;
-uniform mat4 modelview_projection_matrix;
-
-ATTRIBUTE vec3 position;
-
-
-uniform vec2 d1;
-uniform vec2 d2;
-uniform float time;
-uniform vec3 eyeVec;
-uniform float waterHeight;
-
-VARYING vec4 refCoord;
-VARYING vec4 littleWave;
-VARYING vec4 view;
-
-VARYING vec4 vary_position;
-
-float wave(vec2 v, float t, float f, vec2 d, float s) 
-{
-   return (dot(d, v)*f + t*s)*f;
-}
-
-void main()
-{
-	//transform vertex
-	vec4 pos = vec4(position.xyz, 1.0);
-	mat4 modelViewProj = modelview_projection_matrix;
-	
-	vec4 oPosition;
-		    
-	//get view vector
-	vec3 oEyeVec;
-	oEyeVec.xyz = pos.xyz-eyeVec;
-		
-	float d = length(oEyeVec.xy);
-	float ld = min(d, 2560.0);
-	
-	pos.xy = eyeVec.xy + oEyeVec.xy/d*ld;
-	view.xyz = oEyeVec;
-		
-	d = clamp(ld/1536.0-0.5, 0.0, 1.0);	
-	d *= d;
-		
-	oPosition = vec4(position, 1.0);
-	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d);
-	vary_position = modelview_matrix * oPosition;
-	oPosition = modelViewProj * oPosition;
-	
-	refCoord.xyz = oPosition.xyz + vec3(0,0,0.2);
-	
-	//get wave position parameter (create sweeping horizontal waves)
-	vec3 v = pos.xyz;
-	v.x += (cos(v.x*0.08/*+time*0.01*/)+sin(v.y*0.02))*6.0;
-	    
-	//push position for further horizon effect.
-	pos.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
-	pos.w = 1.0;
-	pos = modelview_matrix*pos;
-	
-	//pass wave parameters to pixel shader
-	vec2 bigWave =  (v.xy) * vec2(0.04,0.04)  + d1 * time * 0.055;
-	//get two normal map (detail map) texture coordinates
-	littleWave.xy = (v.xy) * vec2(0.45, 0.9)   + d2 * time * 0.13;
-	littleWave.zw = (v.xy) * vec2(0.1, 0.2) + d1 * time * 0.1;
-	view.w = bigWave.y;
-	refCoord.w = bigWave.x;
-	
-	gl_Position = oPosition;
-}
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 8d19aa36bbf..045bc4a6b80 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1182,6 +1182,7 @@ void LLFloaterPreference::refreshEnabledState()
 {
 	LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
 	LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
+    LLCheckBoxCtrl* ctrl_pbr = getChild<LLCheckBoxCtrl>("UsePBRShaders");
 
 	// if vertex shaders off, disable all shader related products
 	if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
@@ -1205,6 +1206,11 @@ void LLFloaterPreference::refreshEnabledState()
 
 	ctrl_deferred->setEnabled(enabled);
 
+    //PBR
+    BOOL deferred = gSavedSettings.getBOOL("RenderDeferred");
+    // TODO: add "RenderPBR" to LLFeatureManager
+    ctrl_pbr->setEnabled(deferred);
+
 	// Cannot have floater active until caps have been received
 	getChild<LLButton>("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);
 
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 46188716308..1e8ad12b2a2 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -440,9 +440,10 @@ static bool handleRenderLocalLightsChanged(const LLSD& newvalue)
 	return true;
 }
 
+// NOTE: may be triggered by RenderDeferred OR RenderPBR changing, don't trust "newvalue"
 static bool handleRenderDeferredChanged(const LLSD& newvalue)
 {
-	LLRenderTarget::sUseFBO = newvalue.asBoolean();
+    LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred");
 	if (gPipeline.isInit())
 	{
 		LLPipeline::refreshCachedSettings();
@@ -694,6 +695,7 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
 	gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
 	gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
+    gSavedSettings.getControl("RenderPBR")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
 	gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 875f5853107..d4ee754d5ca 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -49,6 +49,8 @@
 #include "lljoint.h"
 #include "llskinningutil.h"
 
+//#pragma optimize("", off)
+
 static LLStaticHashedString sTexture0("texture0");
 static LLStaticHashedString sTexture1("texture1");
 static LLStaticHashedString sTex0("tex0");
@@ -491,6 +493,7 @@ void LLViewerShaderMgr::setShaders()
     bool canRenderDeferred       = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
     bool hasWindLightShaders     = LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders");
     S32 shadow_detail            = gSavedSettings.getS32("RenderShadowDetail");
+    bool pbr = gSavedSettings.getBOOL("RenderPBR");
     bool doingWindLight          = hasWindLightShaders && gSavedSettings.getBOOL("WindLightUseAtmosShaders");
     bool useRenderDeferred       = doingWindLight && canRenderDeferred && gSavedSettings.getBOOL("RenderDeferred");
 
@@ -530,6 +533,11 @@ void LLViewerShaderMgr::setShaders()
         }
     }
 
+    if (deferred_class > 0 && pbr)
+    {
+        deferred_class = 3;
+    }
+
     if (doingWindLight)
     {
         // user has disabled WindLight in their settings, downgrade
@@ -661,8 +669,8 @@ void LLViewerShaderMgr::setShaders()
         // Load max avatar shaders to set the max level
         mShaderLevel[SHADER_AVATAR] = 3;
         mMaxAvatarShaderLevel = 3;
-                
-            if (loadShadersObject())
+
+        if (loadShadersObject())
         { //hardware skinning is enabled and rigged attachment shaders loaded correctly
             BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth");
 
@@ -1221,7 +1229,8 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
 
 BOOL LLViewerShaderMgr::loadShadersDeferred()
 {
-    bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1;
+    bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 && 
+        gSavedSettings.getS32("RenderShadowDetail") > 0;
 
     BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable");
 	BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable");
@@ -1504,7 +1513,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
             gDeferredMaterialProgram[i].mFeatures.hasGamma = true;
             gDeferredMaterialProgram[i].mFeatures.hasShadows = use_sun_shadow;
             
-            if (mShaderLevel[SHADER_DEFERRED] > 1)
+            if (mShaderLevel[SHADER_DEFERRED] > 2)
             {
                 gDeferredMaterialProgram[i].mFeatures.hasReflectionProbes = true;
                 gDeferredMaterialProgram[i].addPermutation("HAS_REFLECTION_PROBES", "1");
@@ -2209,7 +2218,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredFullbrightShinyProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
-        if (gDeferredFullbrightShinyProgram.mShaderLevel >= 2) // TODO : make this a 3 when reflection probes are restricted to class 3
+        if (gDeferredFullbrightShinyProgram.mShaderLevel > 2)
         {
             gDeferredFullbrightShinyProgram.addPermutation("HAS_REFLECTION_PROBES", "1");
             gDeferredFullbrightShinyProgram.mFeatures.hasReflectionProbes = true;
@@ -2286,7 +2295,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSoftenProgram.mFeatures.hasGamma = true;
 		gDeferredSoftenProgram.mFeatures.isDeferred = true;
 		gDeferredSoftenProgram.mFeatures.hasShadows = use_sun_shadow;
-        gDeferredSoftenProgram.mFeatures.hasReflectionProbes = true;
+        gDeferredSoftenProgram.mFeatures.hasReflectionProbes = mShaderLevel[SHADER_DEFERRED] > 2;
 
         gDeferredSoftenProgram.clearPermutations();
 		gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
@@ -2294,6 +2303,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 
 		gDeferredSoftenProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
 
+        if (use_sun_shadow)
+        {
+            gDeferredSoftenProgram.addPermutation("HAS_SUN_SHADOW", "1");
+        }
+
         if (ambient_kill)
         {
             gDeferredSoftenProgram.addPermutation("AMBIENT_KILL", "1");
@@ -2312,6 +2326,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
 		{ //if using SSAO, take screen space light map into account as if shadows are enabled
 			gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2);
+            gDeferredSoftenProgram.addPermutation("HAS_SSAO", "1");
 		}
 				
 		success = gDeferredSoftenProgram.createShader(NULL, NULL);
@@ -2337,7 +2352,12 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		gDeferredSoftenWaterProgram.mFeatures.hasGamma = true;
         gDeferredSoftenWaterProgram.mFeatures.isDeferred = true;
         gDeferredSoftenWaterProgram.mFeatures.hasShadows = use_sun_shadow;
-        gDeferredSoftenWaterProgram.mFeatures.hasReflectionProbes = true;
+        gDeferredSoftenWaterProgram.mFeatures.hasReflectionProbes = mShaderLevel[SHADER_DEFERRED] > 2;
+
+        if (use_sun_shadow)
+        {
+            gDeferredSoftenWaterProgram.addPermutation("HAS_SUN_SHADOW", "1");
+        }
 
         if (ambient_kill)
         {
@@ -2352,6 +2372,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         if (local_light_kill)
         {
             gDeferredSoftenWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
+            gDeferredSoftenWaterProgram.addPermutation("HAS_SSAO", "1");
         }
 
 		if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 068e8a131db..04e9a4f179a 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -756,6 +756,7 @@ LLHUDParticlePartition::LLHUDParticlePartition(LLViewerRegion* regionp) :
 void LLParticlePartition::rebuildGeom(LLSpatialGroup* group)
 {
     LL_PROFILE_ZONE_SCOPED;
+    LL_PROFILE_GPU_ZONE("particle vbo");
 	if (group->isDead() || !group->hasState(LLSpatialGroup::GEOM_DIRTY))
 	{
 		return;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 2790628a46c..55819449c61 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -351,6 +351,7 @@ bool	LLPipeline::sRenderFrameTest = false;
 bool	LLPipeline::sRenderAttachedLights = true;
 bool	LLPipeline::sRenderAttachedParticles = true;
 bool	LLPipeline::sRenderDeferred = false;
+bool    LLPipeline::sRenderPBR = false;
 S32		LLPipeline::sVisibleLightCount = 0;
 bool	LLPipeline::sRenderingHUDs;
 F32     LLPipeline::sDistortionWaterClipPlaneMargin = 1.0125f;
@@ -541,6 +542,7 @@ void LLPipeline::init()
 	connectRefreshCachedSettingsSafe("UseOcclusion");
 	connectRefreshCachedSettingsSafe("WindLightUseAtmosShaders");
 	connectRefreshCachedSettingsSafe("RenderDeferred");
+    connectRefreshCachedSettingsSafe("RenderPBR");
 	connectRefreshCachedSettingsSafe("RenderDeferredSunWash");
 	connectRefreshCachedSettingsSafe("RenderFSAASamples");
 	connectRefreshCachedSettingsSafe("RenderResolutionDivisor");
@@ -1025,6 +1027,7 @@ void LLPipeline::updateRenderDeferred()
                       LLPipeline::sRenderBump &&
                       WindLightUseAtmosShaders &&
                       (bool) LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
+    sRenderPBR = sRenderDeferred && gSavedSettings.getBOOL("RenderPBR");
 }
 
 // static
@@ -2597,6 +2600,7 @@ void LLPipeline::doOcclusion(LLCamera& camera, LLRenderTarget& source, LLRenderT
 void LLPipeline::doOcclusion(LLCamera& camera)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
+    LL_PROFILE_GPU_ZONE("doOcclusion");
     if (LLPipeline::sUseOcclusion > 1 && !LLSpatialPartition::sTeleportRequested &&
 		(sCull->hasOcclusionGroups() || LLVOCachePartition::sNeedsOcclusionCheck))
 	{
@@ -9633,7 +9637,7 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbri
 void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& shadow_cam, LLCullResult& result, bool use_shader, bool use_occlusion, U32 target_width)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);
-
+    LL_PROFILE_GPU_ZONE("renderShadow");
     //disable occlusion culling for shadow passes (save setting to restore later)
     S32 occlude = LLPipeline::sUseOcclusion;
     if (!use_occlusion)
@@ -9720,7 +9724,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
         }
 
         LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE);
-
+        LL_PROFILE_GPU_ZONE("shadow simple");
         gGL.getTexUnit(0)->disable();
         for (U32 i = 0; i < sizeof(types) / sizeof(U32); ++i)
         {
@@ -9753,7 +9757,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
 
     {
         LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA);
-
+        LL_PROFILE_GPU_ZONE("shadow alpha");
         for (int i = 0; i < 2; ++i)
         {
             bool rigged = i == 1;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index c0b55906d63..bb2e1d65aec 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -635,6 +635,7 @@ class LLPipeline
 	static bool				sRenderAttachedLights;
 	static bool				sRenderAttachedParticles;
 	static bool				sRenderDeferred;
+    static bool				sRenderPBR;
 	static S32				sVisibleLightCount;
 	static bool				sRenderingHUDs;
     static F32              sDistortionWaterClipPlaneMargin;
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 5aff7a51276..90bb45d1bc0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -258,7 +258,21 @@
     <check_box.commit_callback
       function="Pref.RenderOptionUpdate" />
   </check_box>
-  
+
+  <check_box
+    control_name="RenderPBR"
+    height="16"
+    initial_value="true"
+    label="Physically Based Rendering"
+    layout="topleft"
+    left="30"
+    name="UsePBRShaders"
+    top_delta="24"
+    width="256">
+    <check_box.commit_callback
+      function="Pref.RenderOptionUpdate" />
+  </check_box>
+
   <slider
     control_name="IndirectMaxComplexity"
     tool_tip="Controls at what point a visually complex avatar is drawn as a JellyDoll"
@@ -274,7 +288,7 @@
     max_val="101"
     name="IndirectMaxComplexity"
     show_text="false"
-    top_delta="60"
+    top_delta="36"
     width="300">
     <slider.commit_callback
       function="Pref.UpdateIndirectMaxComplexity"
-- 
GitLab