diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 4 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.h | 2 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 7 | ||||
| -rw-r--r-- | indra/llrender/llrendertarget.cpp | 15 | ||||
| -rw-r--r-- | indra/llrender/llrendertarget.h | 4 | 
5 files changed, 27 insertions, 5 deletions
| diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index b12de563e4..04ac2476a7 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -1085,7 +1085,7 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLTexture* texture, LLTexUnit::eTextu      return uniform;  } -S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth, LLTexUnit::eTextureFilterOptions mode) +S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth, LLTexUnit::eTextureFilterOptions mode, U32 index)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER; @@ -1103,7 +1103,7 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth,          }          else {              bool has_mips = mode == LLTexUnit::TFO_TRILINEAR || mode == LLTexUnit::TFO_ANISOTROPIC; -            gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(0), has_mips); +            gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(index), has_mips);          }          gGL.getTexUnit(uniform)->setTextureFilteringOption(mode); diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 37f86acd4e..9d187c972c 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -244,7 +244,7 @@ public:      S32 bindTexture(const std::string& uniform, LLTexture* texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR);      S32 bindTexture(S32 uniform, LLTexture* texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR);      S32 bindTexture(const std::string& uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR); -    S32 bindTexture(S32 uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR); +    S32 bindTexture(S32 uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR, U32 index = 0);      S32 unbindTexture(const std::string& uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);      S32 unbindTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 6f61627235..909a1de2b3 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -87,6 +87,13 @@ public:  		TFO_ANISOTROPIC			// Equal to: min=anisotropic, max=anisotropic, mip=linear.  	} eTextureFilterOptions; +	typedef enum +	{ +		TMG_NONE = 0,			// Mipmaps are not automatically generated for this texture. +		TMG_AUTO,				// Mipmaps are automatically generated for this texture. +		TMG_MANUAL				// Mipmaps are manually generated for this texture. +	} eTextureMipGeneration; +  	typedef enum   	{  		TB_REPLACE = 0, diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 7f507a0b58..629664b76d 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -102,7 +102,7 @@ void LLRenderTarget::resize(U32 resx, U32 resy)  } -bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLTexUnit::eTextureType usage) +bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLTexUnit::eTextureType usage, LLTexUnit::eTextureMipGeneration generateMipMaps)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;      llassert(usage == LLTexUnit::TT_TEXTURE); @@ -118,6 +118,13 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLT      mUsage = usage;      mUseDepth = depth; + +    mGenerateMipMaps = generateMipMaps; + +    if (mGenerateMipMaps != LLTexUnit::TMG_NONE) { +        // Calculate the number of mip levels based upon resolution that we should have. +        mMipLevels = 1 + floor(log10((float)llmax(mResX, mResY))/log10(2.0)); +    }      if (depth)      { @@ -512,6 +519,12 @@ void LLRenderTarget::flush()      llassert(sCurFBO == mFBO);      llassert(sBoundTarget == this); +    if (mGenerateMipMaps == LLTexUnit::TMG_AUTO) { +        LL_PROFILE_GPU_ZONE("rt generate mipmaps"); +        bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR); +        glGenerateMipmap(GL_TEXTURE_2D); +    } +      if (mPreviousRT)      {          // a bit hacky -- pop the RT stack back two frames and push diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 71727bf09d..9fcea35e3d 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -80,7 +80,7 @@ public:      // color_fmt - GL color format (e.g. GL_RGB)      // depth - if true, allocate a depth buffer      // usage - deprecated, should always be TT_TEXTURE -	bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth = false, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE); +	bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth = false, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureMipGeneration generateMipMaps = LLTexUnit::TMG_NONE);  	//resize existing attachments to use new resolution and color format  	// CAUTION: if the GL runs out of memory attempting to resize, this render target will be undefined @@ -179,6 +179,8 @@ protected:      U32 mDepth;      bool mUseDepth; +	LLTexUnit::eTextureMipGeneration mGenerateMipMaps; +	U32 mMipLevels;  	LLTexUnit::eTextureType mUsage; | 
