diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llimagegl.cpp | 2 | ||||
| -rw-r--r-- | indra/llrender/llrendertarget.cpp | 36 | ||||
| -rw-r--r-- | indra/llrender/llrendertarget.h | 8 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 6 | 
4 files changed, 46 insertions, 6 deletions
| diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 659d3ca409..a842211764 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -237,9 +237,11 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)  //---------------------------------------------------------------------------- +static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_STATS("Image Stats");  // static  void LLImageGL::updateStats(F32 current_time)  { +	LLFastTimer t(FTM_IMAGE_UPDATE_STATS);  	sLastFrameTime = current_time;  	sBoundTextureMemoryInBytes = sCurBoundTextureMemory;  	sCurBoundTextureMemory = 0; diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 99f0da330c..cc5c232380 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -69,6 +69,42 @@ LLRenderTarget::~LLRenderTarget()  	release();  } +void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt) +{  +	//for accounting, get the number of pixels added/subtracted +	S32 pix_diff = (resx*resy)-(mResX*mResY); +		 +	mResX = resx; +	mResY = resy; + +	for (U32 i = 0; i < mTex.size(); ++i) +	{ //resize color attachments +		gGL.getTexUnit(0)->bindManual(mUsage, mTex[i]); +		LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL, false); +		sBytesAllocated += pix_diff*4; +	} + +	if (mDepth) +	{ //resize depth attachment +		if (mStencil) +		{ +			//use render buffers where stencil buffers are in play +			glBindRenderbuffer(GL_RENDERBUFFER, mDepth); +			glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mResX, mResY); +			glBindRenderbuffer(GL_RENDERBUFFER, 0); +		} +		else +		{ +			gGL.getTexUnit(0)->bindManual(mUsage, mDepth); +			U32 internal_type = LLTexUnit::getInternalType(mUsage); +			LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL, false); +		} + +		sBytesAllocated += pix_diff*4; +	} +} +	 +  bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)  {  	stop_glerror(); diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 8360458840..e1a51304f1 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -57,8 +57,6 @@  */ -class LLMultisampleBuffer; -  class LLRenderTarget  {  public: @@ -74,6 +72,12 @@ public:  	//multiple calls will release previously allocated resources  	bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0); +	//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 +	// DO NOT use for screen space buffers or for scratch space for an image that might be uploaded +	// DO use for render targets that resize often and aren't likely to ruin someone's day if they break +	void resize(U32 resx, U32 resy, U32 color_fmt); +  	//add color buffer attachment  	//limit of 4 color attachments per render target  	bool addColorAttachment(U32 color_fmt); diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 953546a36f..ece794b7f1 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -38,10 +38,6 @@  #include "llglslshader.h"  #include "llmemory.h" -#if LL_DARWIN -#define LL_VBO_POOLING 1 -#else -#endif  //Next Highest Power Of Two  //helper function, returns first number > v that is a power of 2, or v if v is already a power of 2  U32 nhpo2(U32 v) @@ -290,10 +286,12 @@ void LLVBOPool::seedPool()  				allocate(dummy_name, size, true);  			}  		} +		}  	}  } +  void LLVBOPool::cleanup()  {  	U32 size = LL_VBO_BLOCK_SIZE; | 
