diff options
| -rw-r--r-- | autobuild.xml | 24 | ||||
| -rw-r--r-- | indra/llrender/llgl.cpp | 6 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 1 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 7 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.h | 4 | ||||
| -rw-r--r-- | indra/llrender/llimagegl.cpp | 66 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 39 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 13 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl | 3 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl | 2 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl | 3 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 17 | 
12 files changed, 119 insertions, 66 deletions
| diff --git a/autobuild.xml b/autobuild.xml index d95e2952d0..62542be8d8 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1700,9 +1700,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>c90551bee423e9b494a46f29403f7f4a</string> +              <string>d1521becaf21bf7233173722af63f57d</string>                <key>url</key> -              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/34357/286135/kdu-7.10.7.525514-darwin64-525514.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15257/98440/kdu-7.10.4.513518-darwin64-513518.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1712,9 +1712,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>4fcb1fa70d8317f69284be3830df3a29</string> +              <string>43d7a6a69a54534a736f132e9c81795b</string>                <key>url</key> -              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/34358/286148/kdu-7.10.7.525514-linux-525514.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15255/98451/kdu-7.10.4.513518-linux-513518.tar.bz2</string>              </map>              <key>name</key>              <string>linux</string> @@ -1724,9 +1724,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>09cd4cdd385448b9c55fad2ced7685e2</string> +              <string>a705a665810a71e7b0114a97ae9a2224</string>                <key>url</key> -              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/34356/286142/kdu-7.10.7.525514-linux64-525514.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15256/98457/kdu-7.10.4.513518-linux64-513518.tar.bz2</string>              </map>              <key>name</key>              <string>linux64</string> @@ -1736,9 +1736,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>4da8daa8c254be1eb2e4a942e42cd61c</string> +              <string>0e5b37a03a3f873d15142473b193ec5f</string>                <key>url</key> -              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/34360/286161/kdu-7.10.7.525514-windows-525514.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15259/98463/kdu-7.10.4.513518-windows-513518.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -1748,16 +1748,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>eea37ff2c006dc9542bbaa1bb6799417</string> +              <string>da3b1ea90797b189d80ab5d50fdf05d4</string>                <key>url</key> -              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/34359/286155/kdu-7.10.7.525514-windows64-525514.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15260/98469/kdu-7.10.4.513518-windows64-513518.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>7.A.7.525512</string> +        <string>7.A.4.513518</string>        </map>        <key>libhunspell</key>        <map> @@ -2670,7 +2670,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>2cbec24a9c0a6f63fb7de8714d844dc2</string> +              <string>f7013e1f0b6a877090622fd73ec72cbc</string>                <key>url</key>                <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1114/2576/openjpeg-1.5.1.501102-darwin64-501102.tar.bz2</string>              </map> diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 54a41c9d23..d18512f613 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -999,6 +999,12 @@ void LLGLManager::initExtensions()  	mHassRGBFramebuffer = ExtensionExists("GL_EXT_framebuffer_sRGB", gGLHExts.mSysExts);  #endif +#ifdef GL_EXT_texture_sRGB_decode +    mHasTexturesRGBDecode = ExtensionExists("GL_EXT_texture_sRGB_decode", gGLHExts.mSysExts); +#else +    mHasTexturesRGBDecode = ExtensionExists("GL_ARB_texture_sRGB_decode", gGLHExts.mSysExts); +#endif +  	mHasMipMapGeneration = mHasFramebufferObject || mGLVersion >= 1.4f;  	mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts); diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 362fda5fb1..a7faea7d33 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -118,6 +118,7 @@ public:  	BOOL mHasDebugOutput;  	BOOL mHassRGBTexture;  	BOOL mHassRGBFramebuffer; +    BOOL mHasTexturesRGBDecode;  	// Vendor-specific extensions  	BOOL mIsATI; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 8f3a56e1cf..f8b5dd0559 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -974,7 +974,7 @@ S32 LLGLSLShader::unbindTexture(S32 uniform, LLTexUnit::eTextureType mode)      return uniform;  } -S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode) +S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode, LLTexUnit::eTextureColorSpace space)  {      if (uniform < 0 || uniform >= (S32)mTexture.size())      { @@ -986,11 +986,12 @@ S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode)      {          gGL.getTexUnit(index)->activate();          gGL.getTexUnit(index)->enable(mode); +        gGL.getTexUnit(index)->setTextureColorSpace(space);      }      return index;  } -S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode) +S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode, LLTexUnit::eTextureColorSpace space)  {      if (uniform < 0 || uniform >= (S32)mTexture.size())      { @@ -1000,7 +1001,7 @@ S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode)      S32 index = mTexture[uniform];      if (index != -1 && gGL.getTexUnit(index)->getCurrType() != LLTexUnit::TT_NONE)      { -        if (gDebugGL && gGL.getTexUnit(index)->getCurrType() != mode) +        if (gDebugGL && gGL.getTexUnit(index)->getCurrType() != mode && gGL.getTexUnit(index)->getCurrColorSpace() != space)          {              if (gDebugSession)              { diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index c1ce3d3aad..974d0ea005 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -153,8 +153,8 @@ public:  	//if given texture uniform is active in the shader,   	//the corresponding channel will be active upon return  	//returns channel texture is enabled in from [0-MAX) -	S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); -	S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); +	S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR); +    S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR);  	// bindTexture returns the texture unit we've bound the texture to.  	// You can reuse the return value to unbind a texture when required. diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 2d526a2113..2f1f702d2c 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1370,33 +1370,45 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S  	if( !mHasExplicitFormat )  	{ -		switch (mComponents) -		{ -			case 1: -			// Use luminance alpha (for fonts) -			mFormatInternal = GL_LUMINANCE8; -			mFormatPrimary = GL_LUMINANCE; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			case 2: -			// Use luminance alpha (for fonts) -			mFormatInternal = GL_LUMINANCE8_ALPHA8; -			mFormatPrimary = GL_LUMINANCE_ALPHA; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			case 3: -			mFormatInternal = GL_RGB8; -			mFormatPrimary = GL_RGB; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			case 4: -			mFormatInternal = GL_RGBA8; -			mFormatPrimary = GL_RGBA; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			default: -			LL_ERRS() << "Bad number of components for texture: " << (U32)getComponents() << LL_ENDL; -		} +        switch (mComponents) +        { +        case 1: +            // Use luminance alpha (for fonts) +            mFormatInternal = GL_LUMINANCE8; +            mFormatPrimary = GL_LUMINANCE; +            mFormatType = GL_UNSIGNED_BYTE; +            break; +        case 2: +            // Use luminance alpha (for fonts) +            mFormatInternal = GL_LUMINANCE8_ALPHA8; +            mFormatPrimary = GL_LUMINANCE_ALPHA; +            mFormatType = GL_UNSIGNED_BYTE; +            break; +        case 3: +            if (gGLManager.mHasTexturesRGBDecode) +            { +                mFormatInternal = GL_SRGB8; +            } +            else { +                mFormatInternal = GL_RGB8; +            } +            mFormatPrimary = GL_RGB; +            mFormatType = GL_UNSIGNED_BYTE; +            break; +        case 4: +            if (gGLManager.mHasTexturesRGBDecode) +            { +                mFormatInternal = GL_SRGB8_ALPHA8; +            } +            else { +                mFormatInternal = GL_RGBA8; +            } +            mFormatPrimary = GL_RGBA; +            mFormatType = GL_UNSIGNED_BYTE; +            break; +        default: +            LL_ERRS() << "Bad number of components for texture: " << (U32)getComponents() << LL_ENDL; +        }  		calcAlphaChannelOffsetAndStride() ;  	} diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 2bf7ad9902..5dc61d0e8f 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -105,7 +105,7 @@ LLTexUnit::LLTexUnit(S32 index)  	mCurrColorOp(TBO_MULT), mCurrAlphaOp(TBO_MULT),  	mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR),  	mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA), -	mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0), +    mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0), mTexColorSpace(TCS_LINEAR),  	mHasMipMaps(false),  	mIndex(index)  { @@ -162,6 +162,8 @@ void LLTexUnit::refreshState(void)  		setTextureCombiner(mCurrColorOp, mCurrColorSrc1, mCurrColorSrc2, false);  		setTextureCombiner(mCurrAlphaOp, mCurrAlphaSrc1, mCurrAlphaSrc2, true);  	} + +    setTextureColorSpace(mTexColorSpace);  }  void LLTexUnit::activate(void) @@ -191,7 +193,6 @@ void LLTexUnit::enable(eTextureType type)  			stop_glerror();  		}  		mCurrTexType = type; -  		gGL.flush();  		if (!LLGLSLShader::sNoFixedFunction &&   			type != LLTexUnit::TT_MULTISAMPLE_TEXTURE && @@ -219,6 +220,8 @@ void LLTexUnit::disable(void)  		{  			glDisable(sGLTextureType[mCurrTexType]);  		} + +        setTextureColorSpace(TCS_LINEAR);  		mCurrTexType = TT_NONE;  	} @@ -255,7 +258,8 @@ bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind)  						gl_tex->mTexOptionsDirty = false;  						setTextureAddressMode(gl_tex->mAddressMode);  						setTextureFilteringOption(gl_tex->mFilterOption); -					} +                    } +                    setTextureColorSpace(mTexColorSpace);  				}  			}  			else @@ -330,6 +334,7 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)  			setTextureFilteringOption(texture->mFilterOption);  			stop_glerror();  		} +        setTextureColorSpace(mTexColorSpace);  	}  	stop_glerror(); @@ -355,7 +360,7 @@ bool LLTexUnit::bind(LLCubeMap* cubeMap)  		{  			activate();  			enable(LLTexUnit::TT_CUBE_MAP); -			mCurrTexture = cubeMap->mImages[0]->getTexName(); +            mCurrTexture = cubeMap->mImages[0]->getTexName();  			glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mCurrTexture);  			mHasMipMaps = cubeMap->mImages[0]->mHasMipMaps;  			cubeMap->mImages[0]->updateBindStats(cubeMap->mImages[0]->mTextureMemory); @@ -364,7 +369,8 @@ bool LLTexUnit::bind(LLCubeMap* cubeMap)  				cubeMap->mImages[0]->mTexOptionsDirty = false;  				setTextureAddressMode(cubeMap->mImages[0]->mAddressMode);  				setTextureFilteringOption(cubeMap->mImages[0]->mFilterOption); -			} +            } +            setTextureColorSpace(mTexColorSpace);  			return true;  		}  		else @@ -415,7 +421,8 @@ bool LLTexUnit::bindManual(eTextureType type, U32 texture, bool hasMips)  		enable(type);  		mCurrTexture = texture;  		glBindTexture(sGLTextureType[type], texture); -		mHasMipMaps = hasMips; +        mHasMipMaps = hasMips; +        setTextureColorSpace(mTexColorSpace);  	}  	return true;  } @@ -435,6 +442,9 @@ void LLTexUnit::unbind(eTextureType type)  	if (mCurrTexType == type)  	{  		mCurrTexture = 0; + +        // Always make sure our texture color space is reset to linear.  SRGB sampling should be opt-in in the vast majority of cases.  Also prevents color space "popping". +        mTexColorSpace = TCS_LINEAR;  		if (LLGLSLShader::sNoFixedFunction && type == LLTexUnit::TT_TEXTURE)  		{  			glBindTexture(sGLTextureType[type], sWhiteTexture); @@ -838,6 +848,23 @@ void LLTexUnit::debugTextureUnit(void)  	}  } +void LLTexUnit::setTextureColorSpace(eTextureColorSpace space) { +    mTexColorSpace = space; +    if (gGLManager.mHasTexturesRGBDecode) { + +        if (space == TCS_SRGB) { +            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT); +        } +        else { +            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); +        } + +        if (gDebugGL) { +            assert_glerror(); +        } +    } +} +  LLLightState::LLLightState(S32 index)  : mIndex(index),    mEnabled(false), diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index ad9cd11283..41f4fe4017 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -131,6 +131,12 @@ public:  		TBS_ONE_MINUS_CONST_ALPHA  	} eTextureBlendSrc; +    typedef enum +    { +        TCS_LINEAR = 0, +        TCS_SRGB +    } eTextureColorSpace; +  	LLTexUnit(S32 index);  	// Refreshes renderer state of the texture unit to the cached values @@ -153,7 +159,7 @@ public:  	// Binds the LLImageGL to this texture unit   	// (automatically enables the unit for the LLImageGL's texture type)  	bool bind(LLImageGL* texture, bool for_rendering = false, bool forceBind = false); -	bool bind(LLTexture* texture, bool for_rendering = false, bool forceBind = false); +    bool bind(LLTexture* texture, bool for_rendering = false, bool forceBind = false);  	// Binds a cubemap to this texture unit   	// (automatically enables the texture unit for cubemaps) @@ -198,6 +204,10 @@ public:  	void setHasMipMaps(bool hasMips) { mHasMipMaps = hasMips; } +    void setTextureColorSpace(eTextureColorSpace space); + +    eTextureColorSpace getCurrColorSpace() { return mTexColorSpace; } +  protected:  	const S32			mIndex;  	U32					mCurrTexture; @@ -209,6 +219,7 @@ protected:  	eTextureBlendOp		mCurrAlphaOp;  	eTextureBlendSrc	mCurrAlphaSrc1;  	eTextureBlendSrc	mCurrAlphaSrc2; +    eTextureColorSpace  mTexColorSpace;  	S32					mCurrColorScale;  	S32					mCurrAlphaScale;  	bool				mHasMipMaps; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 57916eb3e5..6489508c00 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -78,7 +78,6 @@ vec3 linear_to_srgb(vec3 cl);  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -98,7 +97,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -116,7 +114,6 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = tc-vec2(0.5); diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 9e14c03a96..ab380f70e8 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -83,7 +83,6 @@ vec4 correctWithGamma(vec4 col)  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {      vec4 ret = texture2DLod(projectionMap, tc, lod); -    ret = correctWithGamma(ret);      vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -103,7 +102,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {      vec4 ret = texture2DLod(projectionMap, tc, lod); -    ret = correctWithGamma(ret);      vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 93b55ab9c1..a9482ea54c 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -82,7 +82,6 @@ vec4 correctWithGamma(vec4 col)  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -102,7 +101,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -120,7 +118,6 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret);  	vec2 dist = tc-vec2(0.5); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index f84cd594c9..313edca345 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8145,6 +8145,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      {          deferred_target->bindTexture(0,channel);          gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); +        gGL.getTexUnit(channel)->setTextureColorSpace(LLTexUnit::TCS_SRGB);      }      channel = shader.enableTexture(LLShaderMgr::DEFERRED_SPECULAR, deferred_target->getUsage()); @@ -8152,6 +8153,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      {          deferred_target->bindTexture(1, channel);          gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); +        gGL.getTexUnit(channel)->setTextureColorSpace(LLTexUnit::TCS_SRGB);      }      channel = shader.enableTexture(LLShaderMgr::DEFERRED_NORMAL, deferred_target->getUsage()); @@ -8159,6 +8161,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      {          deferred_target->bindTexture(2, channel);          gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); +        gGL.getTexUnit(channel)->setTextureColorSpace(LLTexUnit::TCS_LINEAR);      }      channel = shader.enableTexture(LLShaderMgr::DEFERRED_DEPTH, deferred_depth_target->getUsage()); @@ -8281,7 +8284,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_  	stop_glerror(); -	channel = shader.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); +	channel = shader.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP, LLTexUnit::TCS_SRGB);  	if (channel > -1)  	{  		LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL; @@ -8779,7 +8782,7 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)                  mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -                gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); +                gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION, LLTexUnit::TT_TEXTURE, LLTexUnit::TCS_SRGB);                  for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter)                  { @@ -8807,7 +8810,7 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)                      mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));                  } -                gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); +                gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION, LLTexUnit::TT_TEXTURE, LLTexUnit::TCS_SRGB);                  unbindDeferredShader(gDeferredSpotLightProgram);              } @@ -8863,7 +8866,7 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)                  bindDeferredShader(gDeferredMultiSpotLightProgram); -                gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); +                gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION, LLTexUnit::TT_TEXTURE, LLTexUnit::TCS_SRGB);                  mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); @@ -8894,7 +8897,7 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)                      mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);                  } -                gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); +                gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION, LLTexUnit::TT_TEXTURE, LLTexUnit::TCS_SRGB);                  unbindDeferredShader(gDeferredMultiSpotLightProgram);                  gGL.popMatrix(); @@ -9139,7 +9142,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)  		img = LLViewerFetchedTexture::sWhiteImagep;  	} -	S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); +	S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_PROJECTION, LLTexUnit::TT_TEXTURE, LLTexUnit::TCS_SRGB);  	if (channel > -1)  	{ @@ -9191,7 +9194,7 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)      shader.disableTexture(LLShaderMgr::DEFERRED_NOISE);      shader.disableTexture(LLShaderMgr::DEFERRED_LIGHTFUNC); -    S32 channel = shader.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); +    S32 channel = shader.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP, LLTexUnit::TCS_SRGB);      if (channel > -1)      {          LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL; | 
