diff --git a/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl
similarity index 64%
rename from indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl
rename to indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl
index 9edcf16f2b5183c208d1538eaf71c2f078aab7bd..2f99e88936104da5bf0cfde34f02e7d56839627e 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl
@@ -1,6 +1,6 @@
 /**
  *
- * Copyright (c) 2018, Kitty Barnett
+ * Copyright (c) 2018-2020, Kitty Barnett
  *
  * The source code in this file is provided to you under the terms of the
  * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
@@ -48,35 +48,21 @@ vec4 getPosition_d(vec2 pos_screen, float depth)
 
 void main()
 {
-	vec2 fragTC = vary_fragcoord.xy;
-	float fragDepth = texture2DRect(depthMap, fragTC.xy).r;
+	vec2 fragTC = vary_fragcoord.st;
+	float fragDepth = texture2DRect(depthMap, fragTC).x;
 	vec3 fragPosLocal = getPosition_d(fragTC, fragDepth).xyz;
-
 	vec3 fragColor = texture2DRect(diffuseRect, fragTC).rgb;
-	{
-		vec2 blendStart = rlvEffectParam1.xy;
-		vec2 blendEnd = rlvEffectParam1.zw;
-		vec3 blendColor = rlvEffectParam2.rgb;
+	float distance = length(fragPosLocal.xyz - avPosLocal.xyz);
+
+	vec2 sphereMinMaxDist = rlvEffectParam1.yw;
+	vec2 sphereMinMaxValue = rlvEffectParam1.xz;
+	vec3 sphereColour = rlvEffectParam2.rgb;
 
-		float cutoff = blendStart.y;
-		float cutoff2 = blendEnd.y;
-		float minAlpha = blendStart.x;
-		float maxAlpha = blendEnd.x;
+	// Linear non-branching interpolation of the strength of the sphere effect (replaces if/elseif/else for x < min, min <= x <= max and x > max)
+	float effectStrength = mix(sphereMinMaxValue.x, 0, distance < sphereMinMaxDist.x) +
+	                       mix(0, sphereMinMaxValue.y - sphereMinMaxValue.x, clamp((distance - sphereMinMaxDist.x) / (sphereMinMaxDist.y - sphereMinMaxDist.x), 0.0, 1.0));
 
-		float distance = length(fragPosLocal.xyz - avPosLocal.xyz);
-		if (distance < cutoff)
-		{
-			discard;
-		}
-		else if (distance < cutoff2)
-		{
-			fragColor = mix(fragColor, blendColor, minAlpha + (distance - cutoff) * (maxAlpha - minAlpha) / (cutoff2 - cutoff));
-		}
-		else
-		{
-			fragColor = mix(fragColor, blendColor, maxAlpha);
-		}
-	}
+	fragColor = mix(fragColor, sphereColour, effectStrength);
 
 	frag_color.rgb = fragColor;
 	frag_color.a = 0.0;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvV.glsl
similarity index 100%
rename from indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl
rename to indra/newview/app_settings/shaders/class1/deferred/rlvV.glsl
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index f493299ccaf7026774604a86bf532737720329ae..f039a9575e3a2710dab81ad22527b21c417615d0 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -9081,8 +9081,6 @@ void LLPipeline::renderDeferredLighting()
 		}
 	}
 
-	mScreen.flush();
-						
 // [RLVa:KB] - @setsphere
 	if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE))
 	{
@@ -9090,7 +9088,7 @@ void LLPipeline::renderDeferredLighting()
 
 		LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 
-		mScreen.bindTarget();
+		//mScreen.bindTarget();
 		gDeferredRlvProgram.bind();
 
 		S32 nDiffuseChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
@@ -9115,32 +9113,8 @@ void LLPipeline::renderDeferredLighting()
 		gGL.pushMatrix();
 		gGL.loadMatrix(gGLModelView);
 
-		int nRenderMethod = 0;
-		switch (nRenderMethod)
-		{
-			case 0:
-				{
-					LLVector2 tc1(0, 0);
-					LLVector2 tc2((F32)mScreen.getWidth() * 2, (F32)mScreen.getHeight() * 2);
-
-					gGL.begin(LLRender::TRIANGLE_STRIP);
-					gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
-					gGL.vertex2f(-1, -1);
-
-					gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
-					gGL.vertex2f(-1, 3);
-
-					gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
-					gGL.vertex2f(3, -1);
-
-					gGL.end();
-				}
-				break;
-			case 1:
-				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
-				mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-				break;
-		}
+		mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+		mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
 
 		gGL.matrixMode(LLRender::MM_PROJECTION);
 		gGL.popMatrix();
@@ -9153,9 +9127,12 @@ void LLPipeline::renderDeferredLighting()
 		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.getTexUnit(0)->activate();
 
-		mScreen.flush();
+		//mScreen.flush();
 	}
 // [/RLVa:KB]
+
+	mScreen.flush();
+						
 }
 
 void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target)