diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a110c018ec0a77c59f67cd7ec152e4ce72b646ac
--- /dev/null
+++ b/.github/workflows/build.yaml
@@ -0,0 +1,93 @@
+name: Build
+
+on:
+  workflow_dispatch:
+  pull_request:
+  push:
+    branches: [main, contribute]
+    tags: ["*"]
+
+jobs:
+  build:
+    strategy:
+      matrix:
+        runner: [windows-large]
+        configuration: [ReleaseOS]
+        addrsize: [64]
+        include:
+          - runner: windows-large
+            configuration: ReleaseOS
+            addrsize: 32
+    runs-on: ${{ matrix.runner }}
+    env:
+      AUTOBUILD_CONFIGURATION: ${{ matrix.configuration }}
+      AUTOBUILD_ADDRSIZE: ${{ matrix.addrsize }}
+      AUTOBUILD_INSTALLABLE_CACHE: ${{ github.workspace }}/.autobuild-installables
+      AUTOBUILD_VARIABLES_FILE: ${{ github.workspace }}/.build-variables/variables
+      AUTOBUILD_VSVER: "170" # vs2k22
+      LOGFAIL: debug # Show details when tests fail
+      GIT_REF: ${{ github.head_ref || github.ref }}
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v3
+        with:
+          ref: ${{ github.event.pull_request.head.sha || github.sha }}
+
+      - name: Checkout build variables
+        uses: actions/checkout@v3
+        with:
+          repository: secondlife/build-variables
+          ref: viewer
+          path: .build-variables
+
+      - name: Install autobuild and python dependencies
+        run: pip3 install autobuild llbase
+
+      - name: Cache autobuild packages
+        uses: actions/cache@v3
+        id: cache-installables
+        with:
+          path: .autobuild-installables
+          key: ${{ runner.os }}-${{ matrix.addrsize }}-${{ matrix.configuration }}-${{ hashFiles('autobuild.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-${{ matrix.addrsize }}-${{ matrix.configuration }}-
+            ${{ runner.os }}-${{ matrix.addrsize }}-
+
+      - name: Install windows dependencies
+        if: runner.os == 'Windows'
+        run: choco install nsis-unicode
+
+      - name: Build
+        id: build
+        shell: bash
+        env:
+          RUNNER_OS: ${{ runner.os }}
+        run: |
+          # On windows we need to point the build to the correct python
+          # as neither CMake's FindPython nor our custom Python.cmake module
+          # will resolve the correct interpreter location.
+          if [[ "$RUNNER_OS" == "Windows" ]]; then
+            export PYTHON="$(cygpath -m "$(which python)")"
+            echo "Python location: $PYTHON"
+          fi
+          
+          autobuild configure -- -DVIEWER_CHANNEL="Second Life Test ${GIT_REF##*/}"
+          autobuild  build --no-configure
+
+          # Find artifacts
+          if [[ "$RUNNER_OS" == "Windows" ]]; then
+            installer_path=$(find ./build-*/newview/ | grep '_Setup\.exe')
+            installer_name="$(basename $installer_path)"
+          elif [[ "$RUNNER_OS" == "macOS" ]]; then
+            installer_path=$(find ./build-*/newview/ | grep '\.dmg')
+            installer_name="$(basename $installer_path)"
+          fi
+
+          echo "installer_path=$installer_path" >> $GITHUB_OUTPUT
+          echo "installer_name=$installer_name" >> $GITHUB_OUTPUT
+      
+      - name: Upload installer
+        uses: actions/upload-artifact@v3
+        with:
+          name: ${{ steps.build.outputs.installer_name }}
+          path: ${{ steps.build.outputs.installer_path }}
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index a6c37160523f19ca494dd90096f1c3b3d1854f0f..2e974fc9fa89684f5030e860dc05ee0011f1368d 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -87,12 +87,27 @@ void APIENTRY gl_debug_callback(GLenum source,
                                 const GLchar* message,
                                 GLvoid* userParam)
 {
-    if (severity != GL_DEBUG_SEVERITY_HIGH  //&&
-        //severity != GL_DEBUG_SEVERITY_MEDIUM &&
-        //severity != GL_DEBUG_SEVERITY_LOW
+    /*if (severity != GL_DEBUG_SEVERITY_HIGH &&
+        severity != GL_DEBUG_SEVERITY_MEDIUM &&
+        severity != GL_DEBUG_SEVERITY_LOW
         )
     { //suppress out-of-spec messages sent by nvidia driver (mostly vertexbuffer hints)
         return;
+    }*/
+
+    // list of messages to suppress
+    const char* suppress[] =
+    {
+        "Buffer detailed info:",
+        "Program undefined behavior warning: The current GL state uses a sampler (0) that has depth comparisons enabled"
+    };
+
+    for (const char* msg : suppress)
+    {
+        if (strncmp(msg, message, strlen(msg)) == 0)
+        {
+            return;
+        }
     }
 
     if (severity == GL_DEBUG_SEVERITY_HIGH)
@@ -134,7 +149,8 @@ void APIENTRY gl_debug_callback(GLenum source,
         glGetBufferParameteriv(GL_UNIFORM_BUFFER, GL_BUFFER_SIZE, &ubo_size);
         glGetBufferParameteriv(GL_UNIFORM_BUFFER, GL_BUFFER_IMMUTABLE_STORAGE, &ubo_immutable);
     }
-    //if (severity == GL_DEBUG_SEVERITY_HIGH)
+    
+    if (severity == GL_DEBUG_SEVERITY_HIGH)
     {
         LL_ERRS() << "Halting on GL Error" << LL_ENDL;
     }
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 076c16beb4c8b2572d31bd3f014e52284ab6d155..30c5165fd9483a60aea318e279064026638ba0e4 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10940,7 +10940,7 @@
     <key>Comment</key>
     <string>Amount to over-brighten sun for HDR effect during the day</string>
     <key>Persist</key>
-    <integer>1</integer>
+    <integer>0</integer>
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
@@ -10951,7 +10951,7 @@
     <key>Comment</key>
     <string>Maximum effective probe ambiance for local lights</string>
     <key>Persist</key>
-    <integer>1</integer>
+    <integer>0</integer>
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
@@ -10962,7 +10962,7 @@
     <key>Comment</key>
     <string>Minimum dynamic exposure amount</string>
     <key>Persist</key>
-    <integer>1</integer>
+    <integer>0</integer>
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
@@ -10973,7 +10973,7 @@
     <key>Comment</key>
     <string>Maximum dynamic exposure amount</string>
     <key>Persist</key>
-    <integer>1</integer>
+    <integer>0</integer>
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
@@ -10984,7 +10984,7 @@
     <key>Comment</key>
     <string>Luminance coefficient for dynamic exposure</string>
     <key>Persist</key>
-    <integer>1</integer>
+    <integer>0</integer>
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
index be90b744f204dffd2144a0f8e00922f4b4aaeba0..886a344a72f477e439ef9b0bc548db20882bc72e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
@@ -113,7 +113,7 @@ void main()
     col /= defined_weight.xyxx;
     //col.y *= col.y;
     
-    frag_color = col;
+    frag_color = max(col, vec4(0));
 
 #ifdef IS_AMD_CARD
     // If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts.
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
index 749ec3a6acc841ec42f83eb8878a54b4ce097424..c18bca066d0ad71c41d0dc4ca7db13333a09cc0b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -25,11 +25,7 @@
 
 /*[EXTRA_CODE_HERE]*/
  
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform float minimum_alpha;
 uniform sampler2D diffuseMap;
@@ -65,4 +61,5 @@ void main()
 		//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
 		vec3 nvn = normalize(tnorm);
 		frag_data[2] = vec4(encode_normal(nvn), vertex_color.a, GBUFFER_FLAG_HAS_ATMOS);
+        frag_data[3] = vec4(0);
 }
diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl
index 4bf16b50bf34f9bf268d5d4d0752f4edce4de798..aa61e10c7f45878d51c1257c58b6b1118b8517ff 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl
@@ -531,7 +531,7 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
     specContrib *= NdotL;
     specContrib = max(specContrib, vec3(0));
 
-    return color;
+    return clamp(color, vec3(0), vec3(10));
 }
 
 vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor, 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
index 3bf148502c023ae09ad460dbc266f3c707431ca3..afc05b8bb54075c2796a70b63da7f2fc240ec03f 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
@@ -25,11 +25,7 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform float minimum_alpha;
 
@@ -54,5 +50,6 @@ void main()
 	frag_data[1] = vec4(0,0,0,0); // spec
 	vec3 nvn = normalize(vary_normal);
 	frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
index e15239b59d897dddc8386274e2c4731815abb6ff..078197f9a8c38398a05d03c53a7db8bf5042ec95 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
@@ -25,11 +25,7 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 VARYING vec3 vary_normal;
 
@@ -53,4 +49,5 @@ void main()
 	frag_data[1] = vec4(0,0,0,0);
 	vec3 nvn = normalize(vary_normal);
 	frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
index b0ff2334149f7fd0af7db8aebc923463b01b78ba..307dda6b73ef10d1ca25ffae5917b85870dac87c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
@@ -25,11 +25,7 @@
  
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform float minimum_alpha;
 
@@ -53,5 +49,6 @@ void main()
 	frag_data[1] = vec4(0,0,0,0); // spec
 	vec3 nvn = normalize(vary_normal);
 	frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
index b2d2e2fa71fa475bda4f9f58c997b51a881008d4..24e290c6147a2c5e3798fc18952a6c505aea90a2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
@@ -25,11 +25,7 @@
 
 /*[EXTRA_CODE_HERE]*/
  
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform sampler2D diffuseMap;
 
@@ -47,5 +43,6 @@ void main()
 	//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
 	vec3 nvn = normalize(vary_normal);
 	frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
index b4bc114dd55e84fd966b36a5ca20dc6b61520e98..be870b2424d69ae21c6764ddb5d3f9693be9e3b0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
@@ -25,11 +25,7 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 VARYING vec3 vary_normal;
 VARYING vec4 vertex_color;
@@ -49,4 +45,5 @@ void main()
 	frag_data[1] = vec4(spec, vertex_color.a); // spec
 	vec3 nvn = normalize(vary_normal);
 	frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl
index ba20ecd3877029c8e76896c901b131e3f3fb9156..a999eab759c5a3e7fec662a2294a442672f6a8d8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl
@@ -39,6 +39,6 @@ void main()
 	vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
 	color.rgb = fullbrightAtmosTransport(color.rgb);
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
index 3eda2b90502a399a208baeaeb79bc54d8680c0d1..7ed8e4c8ce375b39ce4bf1359e83c8e9f88efd98 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
@@ -55,6 +55,6 @@ void main()
 
     s = mix(prev, s, min(dt*2.0*abs(prev-s), 0.04));
     
-    frag_color = vec4(s, s, s, dt);
+    frag_color = max(vec4(s, s, s, dt), vec4(0.0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index 5f659135365d6a8b02ce9b6f1dce2c22846c28c9..7ea641f3c754d8c7b593047d6c3deac178a378e7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -90,7 +90,6 @@ void main()
     
 #endif
 
-    frag_color.rgb = color.rgb;
-    frag_color.a   = color.a;
+    frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/highlightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/highlightF.glsl
index 75f914cb029dae600efc21e909908382742fbbb1..74df43b7c36e01ad65e48be6f756559b56d1e80a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/highlightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/highlightF.glsl
@@ -23,11 +23,7 @@
  * $/LicenseInfo$
  */
  
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform vec4 color;
 uniform sampler2D diffuseMap;
@@ -39,4 +35,5 @@ void main()
 	frag_data[0] = color*texture2D(diffuseMap, vary_texcoord0.xy);
 	frag_data[1] = vec4(0.0);
 	frag_data[2] = vec4(0.0, 1.0, 0.0, GBUFFER_FLAG_SKIP_ATMOS);
+    frag_data[3] = vec4(0);
 }
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
index 51afda2791b87620d68f27658690041266ee6089..5e67442b3acefb3a04f557439fdf9c29a9567af8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
@@ -25,11 +25,7 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform float minimum_alpha;
 
@@ -58,4 +54,5 @@ void main()
 	frag_data[0] = vec4(col.rgb, 0.0);
 	frag_data[1] = spec;
 	frag_data[2] = vec4(encode_normal(norm.xyz),0,GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 4b98e6708ff7668c761c5f9e81179fad42743ec1..4dee23372f0fe9fa16711557047426c20b9e00ff 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -32,7 +32,7 @@
 #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
 out vec4 frag_color;
 #else
-out vec4 frag_data[3];
+out vec4 frag_data[4];
 #endif
 
 void main()
@@ -44,6 +44,7 @@ void main()
     frag_data[0] = vec4(0.5, 0, 1, 0);    // gbuffer is sRGB for legacy materials
     frag_data[1] = vec4(0); // XYZ = Specular color. W = Specular exponent.
     frag_data[2] = vec4(0); // XY = Normal.  Z = Env. intensity. W = 1 skip atmos (mask off fog)
+    frag_data[3] = vec4(0);
 #endif
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
index 6659e67a7abafa70597d9393ff91293135957dac..8e5a6c90e03fa19f2fea494d87c86d938bde5265 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
@@ -101,10 +101,10 @@ void main()
     //emissive = vNt * 0.5 + 0.5;
     //emissive = tnorm*0.5+0.5;
     // See: C++: addDeferredAttachments(), GLSL: softenLightF
-    frag_data[0] = vec4(col, 0.0);                                                   // Diffuse
-    frag_data[1] = vec4(spec.rgb,vertex_color.a);                                    // PBR linear packed Occlusion, Roughness, Metal.
-    frag_data[2] = vec4(encode_normal(tnorm), vertex_color.a, GBUFFER_FLAG_HAS_PBR); // normal, environment intensity, flags
-    frag_data[3] = vec4(emissive,0);                                                // PBR sRGB Emissive
+    frag_data[0] = max(vec4(col, 0.0), vec4(0));                                                   // Diffuse
+    frag_data[1] = max(vec4(spec.rgb,vertex_color.a), vec4(0));                                    // PBR linear packed Occlusion, Roughness, Metal.
+    frag_data[2] = max(vec4(encode_normal(tnorm), vertex_color.a, GBUFFER_FLAG_HAS_PBR), vec4(0)); // normal, environment intensity, flags
+    frag_data[3] = max(vec4(emissive,0), vec4(0));                                                // PBR sRGB Emissive
 }
 
 #else
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
index 859e6fd79652b9d0eb1bdc5e1cd89585a86fede8..fdbc1d97163b7ab611a7077282e9b564db562025 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
@@ -188,10 +188,7 @@ void main()
     vec3 seed = (diff.rgb+vec3(1.0))*vec3(tc.xy, tc.x+tc.y);
     vec3 nz = vec3(noise(seed.rg), noise(seed.gb), noise(seed.rb));
     diff.rgb += nz*0.003;
-    //diff.rgb = nz;
-
-    //float exp_sample = texture(exposureMap, vec2(0.5,0.5)).r;
-    //diff.g = exp_sample;
-    frag_color = diff;
+    
+    frag_color = max(diff, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
index d6c14c48c9384c576c55f6ce27fb3536cc5aac01..3464212c8436b57cb5117df7577c0fda968c46fc 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
@@ -25,11 +25,7 @@
  
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform sampler2D detail_0;
 uniform sampler2D detail_1;
@@ -64,5 +60,6 @@ void main()
     frag_data[1] = vec4(0.0,0.0,0.0,-1.0);
     vec3 nvn = normalize(vary_normal);
     frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
index dc0e5b0ce3cbdce7f8b5bc5f1fed2651b53e8eac..d857e47b90278310a28221b9d2c794d8a2b1e9f3 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
@@ -25,11 +25,7 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform sampler2D diffuseMap;
 
@@ -53,4 +49,5 @@ void main()
 	frag_data[1] = vec4(0,0,0,0);
 	vec3 nvn = normalize(vary_normal);
 	frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(0);
 }
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
index c1f6af9f577127be6addddad531dfb91173f3f2f..301e8aba269a734f8e4b69a9a84b6072ff2f3645 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
@@ -56,5 +56,5 @@ void main()
 	col += kern[6] * texture2D(diffuseMap, vary_texcoord2.zw);	
 	col += kern[7] * texture2D(diffuseMap, vary_texcoord3.zw);	
 	
-	frag_color = vec4(col.rgb * glowStrength, col.a);
+	frag_color = max(vec4(col.rgb * glowStrength, col.a), vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
index 745999fc2f86be3e6046a6a7f386c6c223e8577c..cfdb393b348297af48c4e493277f8c98913abb2f 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
@@ -69,7 +69,6 @@ vec4 applyWaterFogView(vec3 pos, vec4 color)
     float D = pow(0.98, l*kd);
     
     color.rgb = color.rgb * D + kc.rgb * L;
-    color.a = kc.a + color.a;
 
     return color;
 }
diff --git a/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl b/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl
index f520f301d9b478d4f8b9c8c3ac476ddf1f6e6600..69c1983b4dcddfb80e152e35567577b4cb734ec9 100644
--- a/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl
@@ -44,5 +44,5 @@ void main()
 		discard;
 	}
 
-	frag_color = col;
+	frag_color = max(col, vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/interface/clipF.glsl b/indra/newview/app_settings/shaders/class1/interface/clipF.glsl
index ac2bc8703b9530cf6804c18d4bc705e8425fab80..9454bbf21e39b24ca4536b5aff68e9c5dff97c57 100644
--- a/indra/newview/app_settings/shaders/class1/interface/clipF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/clipF.glsl
@@ -42,5 +42,5 @@ void main()
 		discard;
 	}
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/interface/debugF.glsl b/indra/newview/app_settings/shaders/class1/interface/debugF.glsl
index 67c6baddbbd1b4278b596430fb6d89a48c05ce5e..cb8d6a8c033d0a834c1e28b7b7f46d47e39bebb2 100644
--- a/indra/newview/app_settings/shaders/class1/interface/debugF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/debugF.glsl
@@ -33,5 +33,5 @@ uniform vec4 color;
 
 void main() 
 {
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl b/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl
index 188fac54601e71a4be06e5cc9908ef284142dca9..eca591d387cebcbc4aa46abd720e8eb0220e141f 100644
--- a/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl
@@ -49,5 +49,5 @@ void main()
         col += texture(diffuseRect, tc).rgb * w[i];
     }
 
-    frag_color = vec4(col, 0.0);
+    frag_color = max(vec4(col, 0.0), vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
index 6cc9bbbea23b16b73d47b564ecaa8c2b8694b8bc..58c9e5ad0a59d12d8c719e7f9e484ce94ec8fa9e 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
@@ -36,5 +36,5 @@ VARYING vec2 vary_texcoord0;
 
 void main() 
 {
-	frag_color = color*texture2D(diffuseMap, vary_texcoord0.xy);
+	frag_color = max(color*texture2D(diffuseMap, vary_texcoord0.xy), vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
index a1839d4a6777a11bfaf2e45f678aecb0185c2b35..cd5d97c7856428d7bf69829953c6b03867d88e27 100644
--- a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
@@ -162,6 +162,6 @@ vec4 prefilterEnvMap(vec3 R)
 void main()
 {		
 	vec3 N = normalize(vary_dir);
-	frag_color = prefilterEnvMap(N);
+	frag_color = max(prefilterEnvMap(N), vec4(0));
 }
 // =============================================================================================================
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
index b2c83a0f4436603ae0a08c95b9aedfa6c547900e..eaf0f71b415c703b5809a9fef08df5a5f3367440 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
@@ -51,6 +51,6 @@ void default_lighting()
 	color.rgb = atmosLighting(color.rgb);
 	color.rgb = scaleSoftClip(color.rgb);
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
index d87403c78ff86e859c0311088ef52462bfa4d5b0..fc76c0cc009fa795ff15bb9246c0bd802aad49b9 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
@@ -54,6 +54,6 @@ void default_lighting()
 
 	color.rgb = scaleSoftClip(color.rgb);
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
index 9fd189358be03342fdfad33ee34ea5825e36b595..6b86d717da6cf752c989ea4bd11b5e70d4ff8717 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
@@ -43,6 +43,6 @@ void default_lighting()
 
 	color.rgb = scaleSoftClip(color.rgb);
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
index f9c7ad2ab37a345866e26ea2800ff2853408ca2d..59c1bc1446b031968e506fb956ab1aae40690828 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
@@ -45,6 +45,6 @@ void default_lighting()
 
 	color.rgb = scaleSoftClip(color.rgb);
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl
index 9c89c095737a0925f62045e749e449d8ec317483..7da8e9054a05e7292431b7578a61337e39cc4e48 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl
@@ -50,6 +50,6 @@ void default_lighting_water()
 
 	color.rgb = atmosLighting(color.rgb);
 
-	frag_color = applyWaterFog(color);
+	frag_color = max(applyWaterFog(color), vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl
index 9de7a0318070dff113c4e7fcbe6dd9bb6f50f778..f767c17f8619218f8e18503b1058c3fcb928e529 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl
@@ -54,6 +54,6 @@ void default_lighting_water()
 
 	color = applyWaterFog(color);
 	
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
index 57ed993a6642442572e0e01549cd707227fe2c4c..2530bdcc744841d90582ace2b3878284cba133b1 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
@@ -41,6 +41,6 @@ void default_lighting_water()
 
 	color.rgb = atmosLighting(color.rgb);
 
-	frag_color = applyWaterFog(color);
+	frag_color = max(applyWaterFog(color), vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl
index af5da1411ba08f7cb920caf036609d6111b29c3d..7f112d74352d62e44f7d3811e8c6115eb8b4a031 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl
@@ -43,6 +43,6 @@ void default_lighting_water()
 
 	color.rgb = atmosLighting(color.rgb);
 
-	frag_color = applyWaterFog(color);
+	frag_color = max(applyWaterFog(color), vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
index d55f0db530b0db95788ea39ce428124d67ae969d..1deb374cd0a7b4dcb5e068961898272bcfc59e94 100644
--- a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
@@ -40,5 +40,5 @@ void main()
 	float tex0 = texture2D(texture0, vary_texcoord0.xy).a;
 	float tex1 = texture2D(texture1, vary_texcoord1.xy).a;
 
-	frag_color = vec4(tex0+(1.0-tex1)-0.5);
+	frag_color = max(vec4(tex0+(1.0-tex1)-0.5), vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
index add437d144d8d3fd449fe8334b788b755d7cd122..467a9949e4197adbdcdac868d4ed25d824a3cdb6 100644
--- a/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
@@ -44,5 +44,5 @@ void main()
 		discard;
 	}
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewF.glsl b/indra/newview/app_settings/shaders/class1/objects/previewF.glsl
index 284da3d0ac0e351c9feaf997d12fd38f77d7a21b..687d6b748254d419fb503c8db0efd114410df4fb 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewF.glsl
@@ -37,5 +37,5 @@ VARYING vec2 vary_texcoord0;
 void main()
 {
 	vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewPhysicsF.glsl b/indra/newview/app_settings/shaders/class1/objects/previewPhysicsF.glsl
index 3a5e6fdf7c440e14e541af9553c1824b502ec1b6..b56fc97a856470ceb268c101f2c150ed70ebdb5d 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewPhysicsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewPhysicsF.glsl
@@ -38,5 +38,5 @@ VARYING vec2 vary_texcoord0;
 
 void main()
 {
-    frag_color = texture2D(diffuseMap,vary_texcoord0.xy) * color;
+    frag_color = max(texture2D(diffuseMap,vary_texcoord0.xy) * color, vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index 3e50174cdd179015ad7d2a2e6e1dba71975241c3..eff6438d5bce71722358f9b7d0c9940729bf4124 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -304,6 +304,6 @@ void main()
     color.rgb = linear_to_srgb(color.rgb);
 #endif
 
-    frag_color = color;
+    frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class2/interface/irradianceGenF.glsl b/indra/newview/app_settings/shaders/class2/interface/irradianceGenF.glsl
index d21af946e05c0972824319da20d35bd5c0c02324..0753e73dc8ac164d71b19a6a23c5df204a1be87d 100644
--- a/indra/newview/app_settings/shaders/class2/interface/irradianceGenF.glsl
+++ b/indra/newview/app_settings/shaders/class2/interface/irradianceGenF.glsl
@@ -209,6 +209,6 @@ void main()
 
     color = filterColor(vary_dir);
     
-    frag_color = color;
+    frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class2/interface/reflectionprobeF.glsl b/indra/newview/app_settings/shaders/class2/interface/reflectionprobeF.glsl
index 986b233e0beadc735fcc5e121831a49ba2ef538d..c85853199880dd4377e2e6728c955323601e09ef 100644
--- a/indra/newview/app_settings/shaders/class2/interface/reflectionprobeF.glsl
+++ b/indra/newview/app_settings/shaders/class2/interface/reflectionprobeF.glsl
@@ -38,5 +38,5 @@ void main()
     float depth        = getDepth(tc.xy);
     vec4  pos          = getPositionWithDepth(tc, depth);
 
-    frag_color = sampleReflectionProbesDebug(pos.xyz);
+    frag_color = max(sampleReflectionProbesDebug(pos.xyz), vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
index f6bed16c8435da03359f5db096226a0371439a44..6b7dc7ac1d4335582220ed8bbbeb6199808a1833 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
@@ -92,6 +92,6 @@ void main()
 
 	color.a = 1.0;
 
-	frag_color = color;
+	frag_color = max(color, vec4(0));
 }
 
diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
index 02ab4494f6ea19bbf592c75220431c99b9a589df..1aef971d3a55dfb3d7e421f7a598f06e67442f87 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
@@ -183,7 +183,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe
 
 #else
 #ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
+out vec4 frag_data[4];
 #else
 #define frag_data gl_FragData
 #endif
@@ -412,13 +412,14 @@ void main()
     color = temp.rgb;
 #endif
 
-    frag_color = vec4(color, al);
+    frag_color = max(vec4(color, al), vec4(0));
 
 #else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer 
     // deferred path               // See: C++: addDeferredAttachment(), shader: softenLightF.glsl
     frag_data[0] = vec4(diffcol.rgb, emissive);        // gbuffer is sRGB for legacy materials
     frag_data[1] = vec4(spec.rgb, glossiness);           // XYZ = Specular color. W = Specular exponent.
     frag_data[2] = vec4(encode_normal(norm), env, GBUFFER_FLAG_HAS_ATMOS);;   // XY = Normal.  Z = Env. intensity. W = 1 skip atmos (mask off fog)
+    frag_data[3] = vec4(0);
 #endif
 }
 
diff --git a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl
index 3ed785edef302d5485da3628abe62a94cd0a83fb..acba8055da4760ba0547b00580758557da71dbc1 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl
@@ -71,7 +71,7 @@ void main()
     vec4 diffuse = texture2D(diffuseRect, tc);
     vec3 specCol = spec.rgb;
 
-    frag_color = texture(diffuseMap, tc);
+    vec4 fcol = texture(diffuseMap, tc);
 
     if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR)) 
     {
@@ -92,5 +92,6 @@ void main()
 
     collectedColor.rgb *= specCol.rgb;
 
-    frag_color += collectedColor * w;
+    fcol += collectedColor * w;
+    frag_color = max(fcol, vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index 51ab543e6e89c5047a3f8e16d50907aff32060ee..2c0ee0c3cae62fd3efb3298cb31e0c0656991794 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -269,6 +269,6 @@ void main()
         color       = fogged.rgb;
     #endif
 
-    frag_color.rgb = color.rgb; //output linear since local lights will be added to this shader's results
+    frag_color.rgb = max(color.rgb, vec3(0)); //output linear since local lights will be added to this shader's results
     frag_color.a = 0.0;
 }
diff --git a/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl
index 83454631d427d7e28b968b845ce6cce9e56c46f7..21c30012abc5f9bfa11b9b654f70b5d3188cd322 100644
--- a/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl
@@ -77,5 +77,5 @@ void main()
     vec4 fb = vec4(waterFogColorLinear, 0.0);
 #endif
     
-	frag_color = applyWaterFogViewLinearNoClip(vary_position, fb, vec3(1));
+	frag_color = max(applyWaterFogViewLinearNoClip(vary_position, fb, vec3(1)), vec4(0));
 }
diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
index ec0439fa97c66c7ea6ab4ae1a73a6b1b16c5de8a..3d4f4fc17bcc2a667ecf1591e81f1988af3be981 100644
--- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
@@ -286,6 +286,6 @@ void main()
 
     float spec = min(max(max(punctual.r, punctual.g), punctual.b), 0.05);
     
-    frag_color = vec4(color, spec); //*sunAngle2);
+    frag_color = max(vec4(color, spec), vec4(0));
 }
 
diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp
index 66175364d28a6262ef0219926a423824feeb647d..0606e31ac390998ff21ccbda3393328a714f1c28 100644
--- a/indra/newview/llreflectionmap.cpp
+++ b/indra/newview/llreflectionmap.cpp
@@ -263,6 +263,11 @@ bool LLReflectionMap::isActive()
 void LLReflectionMap::doOcclusion(const LLVector4a& eye)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
+    if (LLGLSLShader::sProfileEnabled)
+    {
+        return;
+    }
+
 #if 1
     // super sloppy, but we're doing an occlusion cull against a bounding cube of
     // a bounding sphere, pad radius so we assume if the eye is within
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 26e4a49fb2990ff504530726a4597058ace409a7..d1531b3fc069776a8d4c9f46677b16e8efd60ad1 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -4038,7 +4038,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
         }
     }
 
-    bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion;
+    bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion && !LLGLSLShader::sProfileEnabled;
 
     setupHWLights();
 
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
index 4e2bcf0ee11a97d514af23576d663b0986e95360..cedeab463ed3dec4e73ae8599a112ebba9a4a5e7 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
@@ -822,7 +822,7 @@
     layout="topleft"
     left="420"
     min_val="0.5"
-    max_val="4.0"
+    max_val="1.5"
     name="RenderExposure"
     show_text="true"
     top_delta="20"