diff options
| author | simon <none@none> | 2013-10-30 11:25:08 -0700 | 
|---|---|---|
| committer | simon <none@none> | 2013-10-30 11:25:08 -0700 | 
| commit | b95935ccf3f15d50a07f3888f13430b5f7951a66 (patch) | |
| tree | cbaa5bc036b7d5c42ebcb6457c23f00cb4313673 /indra/llrender | |
| parent | 1b43046bb14a71c4596acd0aaef90ff0d2f7a1b3 (diff) | |
| parent | 309d16ebdbd3b4d39271217beb9bc44d41db83d9 (diff) | |
Merge downstream code from viewer-bear
Diffstat (limited to 'indra/llrender')
| -rwxr-xr-x | indra/llrender/llrendertarget.cpp | 48 | 
1 files changed, 34 insertions, 14 deletions
| diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index b82b370d6e..fe8110904d 100755 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -364,35 +364,55 @@ void LLRenderTarget::release()  		sBytesAllocated -= mResX*mResY*4;  	} -	else if (mUseDepth && mFBO) -	{ //detach shared depth buffer +	else if (mFBO) +	{  		glBindFramebuffer(GL_FRAMEBUFFER, mFBO); -		if (mStencil) -		{ //attached as a renderbuffer -			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); -			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); -			mStencil = false; + +		if (mUseDepth) +		{ //detach shared depth buffer +			if (mStencil) +			{ //attached as a renderbuffer +				glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); +				glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); +				mStencil = false; +			} +			else +			{ //attached as a texture +				glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), 0, 0); +			} +			mUseDepth = false;  		} -		else -		{ //attached as a texture -			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), 0, 0); +	} + +	// Detach any extra color buffers (e.g. SRGB spec buffers) +	// +	if (mFBO && (mTex.size() > 1)) +	{		 +		S32 z; +		for (z = mTex.size() - 1; z >= 1; z--) +		{ +			sBytesAllocated -= mResX*mResY*4; +			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+z, LLTexUnit::getInternalType(mUsage), 0, 0); +			stop_glerror(); +			LLImageGL::deleteTextures(1, &mTex[z]);  		} -		mUseDepth = false;  	}  	if (mFBO)  	{  		glDeleteFramebuffers(1, (GLuint *) &mFBO); +		stop_glerror();  		mFBO = 0;  	}  	if (mTex.size() > 0)  	{ -		sBytesAllocated -= mResX*mResY*4*mTex.size(); -		LLImageGL::deleteTextures(mTex.size(), &mTex[0]); +		sBytesAllocated -= mResX*mResY*4; +		LLImageGL::deleteTextures(1, &mTex[0]); +	} +  		mTex.clear();  		mInternalFormat.clear(); -	}  	mResX = mResY = 0; | 
