diff --git a/indra/newview/alrenderutils.cpp b/indra/newview/alrenderutils.cpp
index 28b073a88b0cff459cfd78ef6c887ab40a49b657..809fa98c1cceb29a757385062e5c686e2e8d24d7 100644
--- a/indra/newview/alrenderutils.cpp
+++ b/indra/newview/alrenderutils.cpp
@@ -513,39 +513,16 @@ bool ALRenderUtil::setupColorGrade()
 	return true;
 }
 
-void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRenderTarget* bloom, LLRenderTarget* exposure)
+void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* exposure)
 {
 	LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 
-	dst->bindTarget();
-
 	LLGLSLShader* tone_shader = (mCGLut != 0 ) ? &gDeferredPostColorGradeLUTProgram[mTonemapType] : &gDeferredPostTonemapProgram[mTonemapType];
 
 	tone_shader->bind();
 
-	S32 channel = tone_shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
-	if (channel > -1)
-	{
-		src->bindTexture(0, channel, LLTexUnit::TFO_POINT);
-	}
-
-	if (bloom)
-	{
-		channel = tone_shader->enableTexture(LLShaderMgr::DEFERRED_EMISSIVE, bloom->getUsage());
-		if (channel > -1)
-		{
-			bloom->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
-		}
-	}
-
-	if (exposure)
-	{
-		channel = tone_shader->enableTexture(LLShaderMgr::EXPOSURE_MAP, exposure->getUsage());
-		if (channel > -1)
-		{
-			exposure->bindTexture(0, channel);
-		}
-	}
+	tone_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
+	tone_shader->bindTexture(LLShaderMgr::EXPOSURE_MAP, exposure, false, LLTexUnit::TFO_BILINEAR);
 
 	tone_shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, src->getWidth(), src->getHeight());
 	tone_shader->uniform1f(al_exposure, mTonemapExposure);
@@ -575,9 +552,10 @@ void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRen
 	}
 	}
 
+	S32 channel = -1;
 	if (mCGLut != 0)
 	{
-		S32 channel = tone_shader->enableTexture(LLShaderMgr::COLORGRADE_LUT, LLTexUnit::TT_TEXTURE_3D);
+		channel = tone_shader->enableTexture(LLShaderMgr::COLORGRADE_LUT, LLTexUnit::TT_TEXTURE_3D);
 		if (channel > -1)
 		{
 			gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE_3D, mCGLut);
@@ -592,8 +570,14 @@ void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRen
 	mRenderBuffer->drawArrays(LLRender::TRIANGLES, 0, 3);
 	stop_glerror();
 
+	if (channel > -1)
+	{
+		gGL.getTexUnit(channel)->unbind(LLTexUnit::TT_TEXTURE_3D);
+	}
+
+	tone_shader->unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
+	tone_shader->unbindTexture(LLShaderMgr::EXPOSURE_MAP, exposure->getUsage());
 	tone_shader->unbind();
-	dst->flush();
 }
 
 bool ALRenderUtil::setupSharpen()
@@ -641,7 +625,7 @@ bool ALRenderUtil::setupSharpen()
 	return true;
 }
 
-void ALRenderUtil::renderSharpen(LLRenderTarget* src, LLRenderTarget* dst)
+void ALRenderUtil::renderSharpen(LLRenderTarget* src)
 {
 	if (mSharpenMethod == ALSharpen::SHARPEN_NONE)
 	{
@@ -665,28 +649,14 @@ void ALRenderUtil::renderSharpen(LLRenderTarget* src, LLRenderTarget* dst)
 	LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 
 	// Bind setup:
-	if (dst)
-	{
-		dst->bindTarget();
-	}
-
 	sharpen_shader->bind();
 
-	S32 channel = sharpen_shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
-	if (channel > -1)
-	{
-		src->bindTexture(0, channel, LLTexUnit::TFO_POINT);
-	}
+	sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
 
 	// Draw
 	mRenderBuffer->setBuffer();
 	mRenderBuffer->drawArrays(LLRender::TRIANGLES, 0, 3);
 
-	if (dst)
-	{
-		dst->flush();
-	}
-
+	sharpen_shader->unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
 	sharpen_shader->unbind();
-	gGL.getTexUnit(0)->disable();
 }
diff --git a/indra/newview/alrenderutils.h b/indra/newview/alrenderutils.h
index adb1846d2e0fa62f5e996db74a7866deaa71fd86..3008416ee845193b547900b4d94e081cfc3e2238 100644
--- a/indra/newview/alrenderutils.h
+++ b/indra/newview/alrenderutils.h
@@ -62,7 +62,7 @@ class ALRenderUtil
 	};
 	bool setupTonemap();
 	bool setupColorGrade();
-	void renderTonemap(LLRenderTarget* src, LLRenderTarget* dst, LLRenderTarget* bloom, LLRenderTarget* exposure);
+	void renderTonemap(LLRenderTarget* src, LLRenderTarget* exposure);
 
 	enum ALSharpen : uint32_t
 	{
@@ -73,7 +73,7 @@ class ALRenderUtil
 	};
 
 	bool setupSharpen();
-	void renderSharpen(LLRenderTarget* src, LLRenderTarget* dst);
+	void renderSharpen(LLRenderTarget* src);
 	// End Deferred Only
 
 	U32 getSharpenMethod() { return mSharpenMethod; };
diff --git a/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl b/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl
index 9c50f84735dc4d7d876677b82922db47a9898e96..436e6720dd6e1d7d395b289db817d88547638399 100644
--- a/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl
+++ b/indra/newview/app_settings/shaders/class1/alchemy/DLSF.glsl
@@ -49,9 +49,6 @@ uniform vec3 sharpen_params;
 #define kDenoiseMin (0.001)
 #define kDenoiseMax (-0.1)
 
-vec3 linear_to_srgb(vec3 cl);
-vec3 srgb_to_linear(vec3 cl);
-
 float GetLuma(vec4 p)
 {
     return 0.212655 * p.r + 0.715158 * p.g + 0.072187 * p.b;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 38f844fc69dbb044dbcc68c97ab232a3c8d46b76..26e4a49fb2990ff504530726a4597058ace409a7 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7310,6 +7310,8 @@ void LLPipeline::renderFinalize()
     gGL.setColorMask(true, true);
     glClearColor(0, 0, 0, 0);
 
+	LLRenderTarget* bound_target = &mPostMap;
+	LLRenderTarget* post_target = &mPostFXMap;
     if (!gCubeSnapshot)
 	{
         LLRenderTarget* screen_target = screenTarget();
@@ -7429,17 +7431,15 @@ void LLPipeline::renderFinalize()
             mExposureMap.flush();
         }
 
-#if 1
-		mALRenderUtil->renderTonemap(screenTarget(), &mPostMap, &mGlow[1], &mExposureMap);
-
-		mALRenderUtil->renderSharpen(&mPostMap, &mPostMap);
-#else
-        mPostMap.bindTarget();
+        bound_target->bindTarget();
 
         // gamma correct lighting
         {
-            LL_PROFILE_GPU_ZONE("gamma correct");
 
+            LL_PROFILE_GPU_ZONE("gamma correct");
+#if 1
+			mALRenderUtil->renderTonemap(screenTarget(), &mExposureMap);
+#else
             LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 
             // Apply gamma correction to the frame here.
@@ -7466,10 +7466,20 @@ void LLPipeline::renderFinalize()
 
             gGL.getTexUnit(channel)->unbind(screenTarget()->getUsage());
             gDeferredPostGammaCorrectProgram.unbind();
-        }
-
-        mPostMap.flush();
 #endif
+		}
+
+        bound_target->flush();
+
+		std::swap(bound_target, post_target);
+
+		if(mALRenderUtil->getSharpenMethod() != ALRenderUtil::SHARPEN_NONE)
+		{
+			bound_target->bindTarget();
+			mALRenderUtil->renderSharpen(post_target);
+			bound_target->flush();
+			std::swap(bound_target, post_target);
+		}
 
         LLVertexBuffer::unbind();
     }
@@ -7500,7 +7510,7 @@ void LLPipeline::renderFinalize()
 
 			gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
 
-			gGlowExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, &mPostMap);
+			gGlowExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, post_target);
 
 			gGL.color4f(1, 1, 1, 1);
 			gPipeline.enableLightsFullbright();
@@ -7570,19 +7580,17 @@ void LLPipeline::renderFinalize()
 	}
 
 // [RLVa:KB] - @setsphere
-	LLRenderTarget* pRenderBuffer = &mPostMap;
 	if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE))
 	{
-		LLShaderEffectParams params(pRenderBuffer, &mPostFXMap, false);
+		LLShaderEffectParams params(post_target, bound_target, false);
 		LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere, &params);
-		pRenderBuffer = params.m_pDstBuffer;
+		std::swap(bound_target, post_target);
 	}
 // [/RLVa:KB]
 
 	{
         llassert(!gCubeSnapshot);
 		bool multisample = RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete();
-		LLGLSLShader* shader = &gGlowCombineProgram;
 
 		S32 width = screenTarget()->getWidth();
 		S32 height = screenTarget()->getHeight();
@@ -7616,15 +7624,15 @@ void LLPipeline::renderFinalize()
 
 			glViewport(0, 0, width, height);
 
-			shader = &gGlowCombineFXAAProgram;
+			LLGLSLShader* shader = &gGlowCombineFXAAProgram;
 
 			shader->bind();
 			shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height);
 
-			channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, pRenderBuffer->getUsage());
+			channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, post_target->getUsage());
 			if (channel > -1)
 			{
-				pRenderBuffer->bindTexture(0, channel);
+				post_target->bindTexture(0, channel);
 			}
 
 			channel = shader->enableTexture(LLShaderMgr::DEFERRED_EMISSIVE, mGlow[1].getUsage());
@@ -7641,7 +7649,7 @@ void LLPipeline::renderFinalize()
 
 			gGL.flush();
 
-			shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mPostMap.getUsage());
+			shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, post_target->getUsage());
 			shader->unbind();
 
 			mRT->fxaaBuffer.flush();
@@ -7690,11 +7698,11 @@ void LLPipeline::renderFinalize()
 
             LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
 
-			shader->bind();
+			gGlowCombineProgram.bind();
 
-			shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, pRenderBuffer);
-			shader->bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
-			shader->bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]);
+			gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, post_target);
+			gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
+			gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]);
 
 			gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
 			gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
@@ -7706,7 +7714,7 @@ void LLPipeline::renderFinalize()
             mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
 
 			gGL.flush();
-			shader->unbind();
+			gGlowCombineProgram.unbind();
 		}
 	}