diff --git a/indra/newview/alrenderutils.cpp b/indra/newview/alrenderutils.cpp
index 0238e601e839c41422d9c18422b1575e0c886f61..f30bb41b279eca1f778ff46c7deaae552b4b0f76 100644
--- a/indra/newview/alrenderutils.cpp
+++ b/indra/newview/alrenderutils.cpp
@@ -144,6 +144,8 @@ void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* dst)
 	LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 
 	dst->bindTarget();
+	glClearColor(0, 0, 0, 0);
+	dst->clear(GL_COLOR_BUFFER_BIT);
 
 	LLGLSLShader* tone_shader = (mCGLut != 0 ) ? &gDeferredPostColorGradeLUTProgram[mTonemapType] : &gDeferredPostTonemapProgram[mTonemapType];
 
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 3ecc43c4c3ed15e4585d968616befae18c112661..15f9b4d82140c82719300def23f9e7825cb11a1b 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -161,7 +161,6 @@ void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)
 	if (pass == 1 && !LLPipeline::sImpostorRender)
 	{
 		gPipeline.mDeferredDepth.flush();
-		gPipeline.mScreen.bindTarget();
 		gObjectFullbrightAlphaMaskProgram.unbind();
 	}
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 060b66a1d478c14c0f9dd4701551b6f1e240a4a4..85895e849be48d41dbf0a1cea7292adb6e7156b4 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -961,18 +961,8 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 		if (!mOcclusionDepth.allocate(resX/occlusion_divisor, resY/occlusion_divisor, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
 		if (!addDeferredAttachments(mDeferredScreen)) return false;
 	
-		GLuint screenFormat = GL_RGBA16;
-		if (gGLManager.mGLVersion < 4.f && gGLManager.mIsATI)
-		{
-			screenFormat = GL_RGBA12;
-		}
-
-		if (gGLManager.mGLVersion < 4.f && gGLManager.mIsNVIDIA)
-		{
-			screenFormat = GL_RGBA16F;
-		}
-
-		if (!mScreen.allocate(resX, resY, screenFormat, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
+		if (!mHDRScreen.allocate(resX, resY, GL_RGBA16F, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples, GL_RGBA, GL_FLOAT)) return false;
+		if (!mScreen.allocate(resX, resY, GL_RGBA8, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
 		if (samples > 0)
 		{
 			if (!mFXAABuffer.allocate(resX, resY, GL_SRGB8_ALPHA8, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
@@ -1019,6 +1009,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
         mSMAABlendBuffer.release();
         mSMAAEdgeBuffer.release();
         mScratchBuffer.release();
+		mHDRScreen.release();
 		mScreen.release();
 		mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first
 // [RLVa:KB] - @setsphere
@@ -1044,6 +1035,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 	if (LLPipeline::sRenderDeferred)
 	{ //share depth buffer between deferred targets
 		mDeferredScreen.shareDepthBuffer(mScreen);
+		mDeferredScreen.shareDepthBuffer(mHDRScreen);
 	}
 
 	gGL.getTexUnit(0)->disable();
@@ -1333,6 +1325,7 @@ void LLPipeline::releaseScreenBuffers()
 {
 	mUIScreen.release();
 	mScreen.release();
+	mHDRScreen.release();
 	mFXAABuffer.release();
     mSMAABlendBuffer.release();
     mSMAAEdgeBuffer.release();
@@ -9019,10 +9012,10 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target)
         gGL.popMatrix();
         stop_glerror();
 
-        screen_target->bindTarget();
+		mHDRScreen.bindTarget();
         // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
         glClearColor(0, 0, 0, 0);
-        screen_target->clear(GL_COLOR_BUFFER_BIT);
+		mHDRScreen.clear(GL_COLOR_BUFFER_BIT);
 
         if (RenderDeferredAtmospheric)
         {  // apply sunlight contribution
@@ -9345,9 +9338,9 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target)
         gGL.setColorMask(true, true);
     }
 
-    screen_target->flush();
+	mHDRScreen.flush();
 
-	screen_target->bindTarget();
+	mHDRScreen.bindTarget();
 
     {  // render non-deferred geometry (alpha, fullbright, glow)
         LLGLDisable blend(GL_BLEND);
@@ -9382,11 +9375,12 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target)
         popRenderTypeMask();
     }
 
-	 screen_target->flush();
+	mHDRScreen.flush();
 
 	// Tonemapping & Gamma Correction
 	{
-		 mALRenderUtil->renderTonemap(screen_target, screen_target);
+		gGL.setColorMask(true, true);
+		mALRenderUtil->renderTonemap(&mHDRScreen, screen_target);
 	}
 
     screen_target->bindTarget();
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 274320c84afb94673ddba68a0316e3eef8ce448a..fc16ea6129f1896033340e9af18b063ad7a64119 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -619,6 +619,7 @@ class LLPipeline
 	U32 					mScreenHeight;
 	
 	LLRenderTarget			mScreen;
+	LLRenderTarget			mHDRScreen;
 	LLRenderTarget			mUIScreen;
 	LLRenderTarget			mDeferredScreen;
 	LLRenderTarget			mFXAABuffer;