diff options
Diffstat (limited to 'indra/llrender')
| -rwxr-xr-x | indra/llrender/llgl.cpp | 5 | ||||
| -rwxr-xr-x | indra/llrender/llglslshader.cpp | 5 | ||||
| -rwxr-xr-x | indra/llrender/llrender.cpp | 43 | ||||
| -rwxr-xr-x | indra/llrender/llrendertarget.cpp | 64 | ||||
| -rwxr-xr-x | indra/llrender/llrendertarget.h | 2 | ||||
| -rwxr-xr-x | indra/llrender/llshadermgr.cpp | 6 | ||||
| -rwxr-xr-x | indra/llrender/llshadermgr.h | 6 | ||||
| -rwxr-xr-x | indra/llrender/llvertexbuffer.cpp | 41 | 
8 files changed, 119 insertions, 53 deletions
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index c3005f1722..a157cd94c4 100755 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -647,7 +647,8 @@ bool LLGLManager::initGL()  		}  #if LL_DARWIN  		else if ((mGLRenderer.find("9400M") != std::string::npos) -			  || (mGLRenderer.find("9600M") != std::string::npos)) +			  || (mGLRenderer.find("9600M") != std::string::npos) +			  || (mGLRenderer.find("9800M") != std::string::npos))  		{  			mIsMobileGF = TRUE;  		} @@ -1155,7 +1156,7 @@ void LLGLManager::initExtensions()  	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);  	glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange);  	glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize); - +	  #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS  	LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;  	if (mHasVertexBufferObject) diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index ac16e30796..40aff36dac 100755 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -374,6 +374,11 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,  	// Create program  	mProgramObject = glCreateProgramObjectARB(); + +#if LL_DARWIN +    // work-around missing mix(vec3,vec3,bvec3) +    mDefines["OLD_SELECT"] = "1"; +#endif  	//compile new source  	vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin(); diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index c60eb8d9d9..f2f1b62be0 100755 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -1849,35 +1849,36 @@ void LLRender::flush()  			sUIVerts += mCount;  		} -		if (gDebugGL) +		//store mCount in a local variable to avoid re-entrance (drawArrays may call flush) +		U32 count = mCount; + +		if (mMode == LLRender::QUADS && !sGLCoreProfile)  		{ -			if (mMode == LLRender::QUADS && !sGLCoreProfile) +			if (mCount%4 != 0)  			{ -				if (mCount%4 != 0) -				{ -					llerrs << "Incomplete quad rendered." << llendl; -				} +				count -= (mCount % 4); +				llwarns << "Incomplete quad requested." << llendl;  			} -			 -			if (mMode == LLRender::TRIANGLES) +		} + +		if (mMode == LLRender::TRIANGLES) +		{ +			if (mCount%3 != 0)  			{ -				if (mCount%3 != 0) -				{ -					llerrs << "Incomplete triangle rendered." << llendl; -				} +				count -= (mCount % 3); +				llwarns << "Incomplete triangle requested." << llendl;  			} -			 -			if (mMode == LLRender::LINES) +		} + +		if (mMode == LLRender::LINES) +		{ +			if (mCount%2 != 0)  			{ -				if (mCount%2 != 0) -				{ -					llerrs << "Incomplete line rendered." << llendl; -				} +				count -= (mCount % 2); +				llwarns << "Incomplete line requested." << llendl;  			}  		} - -		//store mCount in a local variable to avoid re-entrance (drawArrays may call flush) -		U32 count = mCount; +		  		mCount = 0;  		if (mBuffer->useVBOs() && !mBuffer->isLocked()) diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 5ea8387c04..c0602d79bd 100755 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -79,7 +79,7 @@ LLRenderTarget::~LLRenderTarget()  	release();  } -void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt) +void LLRenderTarget::resize(U32 resx, U32 resy)  {   	//for accounting, get the number of pixels added/subtracted  	S32 pix_diff = (resx*resy)-(mResX*mResY); @@ -87,10 +87,12 @@ void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)  	mResX = resx;  	mResY = resy; +	llassert(mInternalFormat.size() == mTex.size()); +  	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); +		LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, mInternalFormat[i], mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL, false);  		sBytesAllocated += pix_diff*4;  	} @@ -260,7 +262,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)  	}  #endif -     +  	return true;  } @@ -362,36 +364,56 @@ 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(mUsage, mInternalFormat[z], 0, 1, &mTex[z], true);  		} -		mUseDepth = false;  	}  	if (mFBO)  	{  		glDeleteFramebuffers(1, (GLuint *) &mFBO); +		stop_glerror();  		mFBO = 0;  	}  	if (mTex.size() > 0)  	{ -		sBytesAllocated -= mResX*mResY*4*mTex.size(); -		LLImageGL::deleteTextures(mUsage, mInternalFormat[0], 0, mTex.size(), &mTex[0], true); -		mTex.clear(); -		mInternalFormat.clear(); +		sBytesAllocated -= mResX*mResY*4; +		LLImageGL::deleteTextures(mUsage, mInternalFormat[0], 0, 1, &mTex[0], true);  	} -	 + +	mTex.clear(); +	mInternalFormat.clear(); +  	mResX = mResY = 0;  	sBoundTarget = NULL; @@ -575,8 +597,10 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0  {  	if (!source.mFBO)  	{ -		llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl; +		llwarns << "Cannot copy framebuffer contents for non FBO render targets." << llendl; +		return;  	} +  	{  		GLboolean write_depth = mask & GL_DEPTH_BUFFER_BIT ? TRUE : FALSE; diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 66a9874a6b..336441661c 100755 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -79,7 +79,7 @@ public:  	// 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); +	void resize(U32 resx, U32 resy);  	//add color buffer attachment  	//limit of 4 color attachments per render target diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index fea4ee2819..63404abeff 100755 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1137,11 +1137,13 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("projectionMap");  	mReservedUniforms.push_back("global_gamma"); -	mReservedUniforms.push_back("texture_gamma"); -	 +	mReservedUniforms.push_back("texture_gamma");	 +  	mReservedUniforms.push_back("specular_color");  	mReservedUniforms.push_back("env_intensity"); +	mReservedUniforms.push_back("display_gamma"); +  	llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);  	std::set<std::string> dupe_check; diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index c049e935b8..3c282bf24f 100755 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -167,11 +167,13 @@ public:  		DEFERRED_PROJECTION,  		GLOBAL_GAMMA, -		TEXTURE_GAMMA, -		 +		TEXTURE_GAMMA,		 +  		SPECULAR_COLOR,  		ENVIRONMENT_INTENSITY, +		DISPLAY_GAMMA, +  		END_RESERVED_UNIFORMS  	} eGLSLReservedUniforms; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 01541026b1..6a7cec3bad 100755 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -753,10 +753,10 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi  	U16* idx = ((U16*) getIndicesPointer())+indices_offset;  	stop_glerror(); -	LLGLSLShader::startProfile(); -	glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,  +		LLGLSLShader::startProfile(); +		glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,   		idx); -	LLGLSLShader::stopProfile(count, mode); +		LLGLSLShader::stopProfile(count, mode);  	stop_glerror(); @@ -2236,10 +2236,41 @@ void LLVertexBuffer::setBuffer(U32 data_mask)  					required_mask |= required;  				}  			} - +          			if ((data_mask & required_mask) != required_mask)  			{ -				llwarns << "Shader consumption mismatches data provision." << llendl; +				 +				U32 unsatisfied_mask = (required_mask & ~data_mask); +				U32 i = 0; + +				while (i < TYPE_MAX) +				{ +                    U32 unsatisfied_flag = unsatisfied_mask & (1 << i); +					switch (unsatisfied_flag) +					{ +						case MAP_VERTEX: llinfos << "Missing vert pos" << llendl; break; +						case MAP_NORMAL: llinfos << "Missing normals" << llendl; break; +						case MAP_TEXCOORD0: llinfos << "Missing TC 0" << llendl; break; +						case MAP_TEXCOORD1: llinfos << "Missing TC 1" << llendl; break; +						case MAP_TEXCOORD2: llinfos << "Missing TC 2" << llendl; break; +						case MAP_TEXCOORD3: llinfos << "Missing TC 3" << llendl; break; +						case MAP_COLOR: llinfos << "Missing vert color" << llendl; break; +						case MAP_EMISSIVE: llinfos << "Missing emissive" << llendl; break; +						case MAP_TANGENT: llinfos << "Missing tangent" << llendl; break; +						case MAP_WEIGHT: llinfos << "Missing weight" << llendl; break; +						case MAP_WEIGHT4: llinfos << "Missing weightx4" << llendl; break; +						case MAP_CLOTHWEIGHT: llinfos << "Missing clothweight" << llendl; break; +						case MAP_TEXTURE_INDEX: llinfos << "Missing tex index" << llendl; break; +						default: llinfos << "Missing who effin knows: " << unsatisfied_flag << llendl; +					}					 +				} + +            if (unsatisfied_mask & (1 << TYPE_INDEX)) +            { +               llinfos << "Missing indices" << llendl; +            } + +				llerrs << "Shader consumption mismatches data provision." << llendl;  			}  		}  	}  | 
