diff options
| author | Dave Parks <davep@lindenlab.com> | 2011-08-08 15:29:23 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2011-08-08 15:29:23 -0500 | 
| commit | 14f6bbadef2c39e58a3b54c0c6212949acf50e45 (patch) | |
| tree | 295c3bd149b343cd334885133f101963219d7f39 /indra/llrender | |
| parent | 333608e889827342c79d3eee2006b1a704985740 (diff) | |
SH-2242 Work in progress migrating to glVertexAttrib everywhere
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llgl.cpp | 79 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 12 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 4 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 99 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 6 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 352 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.h | 10 | 
7 files changed, 406 insertions, 156 deletions
| diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 2f6ef2b663..f58d4937d4 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -1329,8 +1329,6 @@ void LLGLState::initClass()  	sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;  	glDisable(GL_MULTISAMPLE_ARB); - -	glEnableClientState(GL_VERTEX_ARRAY);  }  //static @@ -1604,7 +1602,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)  void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)  { -	if (!gDebugGL) +	if (!gDebugGL || LLGLSLShader::sNoFixedFunction)  	{  		return;  	} @@ -1661,7 +1659,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)  	}; -	for (S32 j = 0; j < 4; j++) +	for (S32 j = 1; j < 4; j++)  	{  		if (glIsEnabled(value[j]))  		{ @@ -1875,79 +1873,6 @@ void LLGLManager::initGLStates()  //////////////////////////////////////////////////////////////////////////////// -void enable_vertex_weighting(const S32 index) -{ -#if GL_ARB_vertex_program -	if (index > 0) glEnableVertexAttribArrayARB(index);	// vertex weights -#endif -} - -void disable_vertex_weighting(const S32 index) -{ -#if GL_ARB_vertex_program -	if (index > 0) glDisableVertexAttribArrayARB(index);	// vertex weights -#endif -} - -void enable_binormals(const S32 index) -{ -#if GL_ARB_vertex_program -	if (index > 0) -	{ -		glEnableVertexAttribArrayARB(index);	// binormals -	} -#endif -} - -void disable_binormals(const S32 index) -{ -#if GL_ARB_vertex_program -	if (index > 0) -	{ -		glDisableVertexAttribArrayARB(index);	// binormals -	} -#endif -} - - -void enable_cloth_weights(const S32 index) -{ -#if GL_ARB_vertex_program -	if (index > 0)	glEnableVertexAttribArrayARB(index); -#endif -} - -void disable_cloth_weights(const S32 index) -{ -#if GL_ARB_vertex_program -	if (index > 0) glDisableVertexAttribArrayARB(index); -#endif -} - -void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights) -{ -#if GL_ARB_vertex_program -	if (index > 0) glVertexAttribPointerARB(index, 1, GL_FLOAT, FALSE, stride, weights); -	stop_glerror(); -#endif -} - -void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights) -{ -#if GL_ARB_vertex_program -	if (index > 0) glVertexAttribPointerARB(index, 4, GL_FLOAT, TRUE, stride, weights); -	stop_glerror(); -#endif -} - -void set_binormals(const S32 index, const U32 stride,const LLVector3 *binormals) -{ -#if GL_ARB_vertex_program -	if (index > 0) glVertexAttribPointerARB(index, 3, GL_FLOAT, FALSE, stride, binormals); -	stop_glerror(); -#endif -} -  void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific )  {  	// GL_VERSION returns a null-terminated string with the format:  diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index d736133f3f..495e523c31 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -252,7 +252,7 @@ public:  	static void dumpStates();  	static void checkStates(const std::string& msg = "");  	static void checkTextureChannels(const std::string& msg = ""); -	static void checkClientArrays(const std::string& msg = "", U32 data_mask = 0x0001); +	static void checkClientArrays(const std::string& msg = "", U32 data_mask = 0);  protected:  	static boost::unordered_map<LLGLenum, LLGLboolean> sStateMap; @@ -419,15 +419,7 @@ extern LLMatrix4 gGLObliqueProjectionInverse;  #include "llglstates.h"  void init_glstates(); -void enable_vertex_weighting(const S32 index); -void disable_vertex_weighting(const S32 index); -void enable_binormals(const S32 index); -void disable_binormals(const S32 index); -void enable_cloth_weights(const S32 index); -void disable_cloth_weights(const S32 index); -void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights); -void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights); -void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals); +  void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific );  extern BOOL gClothRipple; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index f51d83abe4..b6cb84d10c 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -31,6 +31,7 @@  #include "llshadermgr.h"  #include "llfile.h"  #include "llrender.h" +#include "llvertexbuffer.h"  #if LL_DARWIN  #include "OpenGL/OpenGL.h" @@ -386,6 +387,7 @@ void LLGLSLShader::bind()  	gGL.flush();  	if (gGLManager.mHasShaderObjects)  	{ +		LLVertexBuffer::unbind();  		glUseProgramObjectARB(mProgramObject);  		sCurBoundShader = mProgramObject;  		sCurBoundShaderPtr = this; @@ -411,6 +413,7 @@ void LLGLSLShader::unbind()  				stop_glerror();  			}  		} +		LLVertexBuffer::unbind();  		glUseProgramObjectARB(0);  		sCurBoundShader = 0;  		sCurBoundShaderPtr = NULL; @@ -420,6 +423,7 @@ void LLGLSLShader::unbind()  void LLGLSLShader::bindNoShader(void)  { +	LLVertexBuffer::unbind();  	glUseProgramObjectARB(0);  	sCurBoundShader = 0;  	sCurBoundShaderPtr = NULL; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index d72918b15d..da85bc202c 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -1580,6 +1580,105 @@ void LLRender::color3fv(const GLfloat* c)  	color4f(c[0],c[1],c[2],1);  } +void LLRender::diffuseColor3f(F32 r, F32 g, F32 b) +{ +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +	S32 loc = -1; +	if (shader) +	{ +		loc = shader->getAttribLocation(LLVertexBuffer::TYPE_COLOR); +	} + +	if (loc >= 0) +	{ +		glVertexAttrib3fARB(loc, r,g,b); +	} +	else +	{ +		glColor3f(r,g,b); +	} +} + +void LLRender::diffuseColor3fv(const F32* c) +{ +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +	S32 loc = -1; +	if (shader) +	{ +		loc = shader->getAttribLocation(LLVertexBuffer::TYPE_COLOR); +	} + +	if (loc >= 0) +	{ +		glVertexAttrib3fvARB(loc, c); +	} +	else +	{ +		glColor3fv(c); +	} +} + +void LLRender::diffuseColor4f(F32 r, F32 g, F32 b, F32 a) +{ +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +	S32 loc = -1; +	if (shader) +	{ +		loc = shader->getAttribLocation(LLVertexBuffer::TYPE_COLOR); +	} + +	if (loc >= 0) +	{ +		glVertexAttrib4fARB(loc, r,g,b,a); +	} +	else +	{ +		glColor4f(r,g,b,a); +	} + +} + +void LLRender::diffuseColor4fv(const F32* c) +{ +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +	S32 loc = -1; +	if (shader) +	{ +		loc = shader->getAttribLocation(LLVertexBuffer::TYPE_COLOR); +	} + +	if (loc >= 0) +	{ +		glVertexAttrib4fvARB(loc, c); +	} +	else +	{ +		glColor4fv(c); +	} +} + +void LLRender::diffuseColor4ubv(const U8* c) +{ +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +	S32 loc = -1; +	if (shader) +	{ +		loc = shader->getAttribLocation(LLVertexBuffer::TYPE_COLOR); +	} + +	if (loc >= 0) +	{ +		glVertexAttrib4ubvARB(loc, c); +	} +	else +	{ +		glColor4ubv(c); +	} +} + + + +  void LLRender::debugTexUnits(void)  {  	LL_INFOS("TextureUnit") << "Active TexUnit: " << mCurrTextureUnitIndex << LL_ENDL; diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 9eedebe2ce..5f97bff1c4 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -350,6 +350,12 @@ public:  	void color3fv(const GLfloat* c);  	void color4ubv(const GLubyte* c); +	void diffuseColor3f(F32 r, F32 g, F32 b); +	void diffuseColor3fv(const F32* c); +	void diffuseColor4f(F32 r, F32 g, F32 b, F32 a); +	void diffuseColor4fv(const F32* c); +	void diffuseColor4ubv(const U8* c); +  	void vertexBatchPreTransformed(LLVector3* verts, S32 vert_count);  	void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count);  	void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U*, S32 vert_count); diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 1180afa631..30f73bf2c6 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -130,6 +130,7 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =  	sizeof(LLVector2), // TYPE_TEXCOORD2,  	sizeof(LLVector2), // TYPE_TEXCOORD3,  	sizeof(LLColor4U), // TYPE_COLOR, +	sizeof(U8),		   // TYPE_EMISSIVE  	sizeof(LLVector4), // TYPE_BINORMAL,  	sizeof(F32),	   // TYPE_WEIGHT,  	sizeof(LLVector4), // TYPE_WEIGHT4, @@ -156,36 +157,79 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)  		llerrs << "Cannot use LLGLImmediate and LLVertexBuffer simultaneously!" << llendl;  	}*/ +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +  	if (sLastMask != data_mask)  	{ +		llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL); +		static LLGLSLShader* last_shader = LLGLSLShader::sCurBoundShaderPtr; +		llassert(sLastMask == 0 || last_shader == shader); +		last_shader = shader; +  		U32 mask[] =  		{  			MAP_VERTEX,  			MAP_NORMAL,  			MAP_TEXCOORD0,  			MAP_COLOR, +			MAP_EMISSIVE, +			MAP_WEIGHT, +			MAP_WEIGHT4, +			MAP_BINORMAL, +			MAP_CLOTHWEIGHT,  		}; +		U32 type[] = +		{ +			TYPE_VERTEX, +			TYPE_NORMAL, +			TYPE_TEXCOORD0, +			TYPE_COLOR, +			TYPE_EMISSIVE, +			TYPE_WEIGHT, +			TYPE_WEIGHT4, +			TYPE_BINORMAL, +			TYPE_CLOTHWEIGHT, +		}; +  		GLenum array[] =  		{  			GL_VERTEX_ARRAY,  			GL_NORMAL_ARRAY,  			GL_TEXTURE_COORD_ARRAY,  			GL_COLOR_ARRAY, +			0, +			0, +			0, +			0, +			0,  		};  		BOOL error = FALSE; -		for (U32 i = 0; i < 4; ++i) +		for (U32 i = 0; i < 9; ++i)  		{ +			S32 loc = -1; +			if (shader) +			{ +				loc = shader->getAttribLocation(type[i]); +			} +  			if (sLastMask & mask[i])  			{ //was enabled -				if (!(data_mask & mask[i]) && i > 0) +				if (!(data_mask & mask[i]))  				{ //needs to be disabled -					glDisableClientState(array[i]); +					if (loc >= 0) +					{ +						glDisableVertexAttribArrayARB(loc); +					} +					else if (!shader) +					{ +						glDisableClientState(array[i]); +					}  				} -				else if (gDebugGL) -				{ //needs to be enabled, make sure it was (DEBUG TEMPORARY) -					if (i > 0 && !glIsEnabled(array[i])) +				else if (gDebugGL && !shader && array[i]) +				{ //needs to be enabled, make sure it was (DEBUG) +					if (loc < 0 && !glIsEnabled(array[i]))  					{  						if (gDebugSession)  						{ @@ -201,11 +245,18 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)  			}  			else   			{	//was disabled -				if (data_mask & mask[i] && i > 0) +				if (data_mask & mask[i])  				{ //needs to be enabled -					glEnableClientState(array[i]); +					if (loc >= 0) +					{ +						glEnableVertexAttribArrayARB(loc); +					} +					else if (!shader) +					{ +						glEnableClientState(array[i]); +					}  				} -				else if (gDebugGL && i > 0 && glIsEnabled(array[i])) +				else if (!shader && array[i] && gDebugGL && glIsEnabled(array[i]))  				{ //needs to be disabled, make sure it was (DEBUG TEMPORARY)  					if (gDebugSession)  					{ @@ -232,62 +283,71 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)  			MAP_TEXCOORD3  		}; +		U32 type_tc[] =  +		{ +			TYPE_TEXCOORD1, +			TYPE_TEXCOORD2, +			TYPE_TEXCOORD3 +		}; +  		for (U32 i = 0; i < 3; i++)  		{ +			S32 loc = -1; +			if (shader) +			{ +				loc = shader->getAttribLocation(type_tc[i]); +			} +  			if (sLastMask & map_tc[i])  			{  				if (!(data_mask & map_tc[i])) -				{ -					glClientActiveTextureARB(GL_TEXTURE1_ARB+i); -					glDisableClientState(GL_TEXTURE_COORD_ARRAY); -					glClientActiveTextureARB(GL_TEXTURE0_ARB); +				{ //disable +					if (loc >= 0) +					{ +						glDisableVertexAttribArrayARB(loc); +					} +					else if (!shader) +					{ +						glClientActiveTextureARB(GL_TEXTURE1_ARB+i); +						glDisableClientState(GL_TEXTURE_COORD_ARRAY); +						glClientActiveTextureARB(GL_TEXTURE0_ARB); +					}  				}  			}  			else if (data_mask & map_tc[i])  			{ -				glClientActiveTextureARB(GL_TEXTURE1_ARB+i); -				glEnableClientState(GL_TEXTURE_COORD_ARRAY); -				glClientActiveTextureARB(GL_TEXTURE0_ARB); +				if (loc >= 0) +				{ +					glEnableVertexAttribArrayARB(loc); +				} +				else if (!shader) +				{ +					glClientActiveTextureARB(GL_TEXTURE1_ARB+i); +					glEnableClientState(GL_TEXTURE_COORD_ARRAY); +					glClientActiveTextureARB(GL_TEXTURE0_ARB); +				}  			}  		} -		if (sLastMask & MAP_BINORMAL) +		if (!shader)  		{ -			if (!(data_mask & MAP_BINORMAL)) +			if (sLastMask & MAP_BINORMAL)  			{ -				glClientActiveTextureARB(GL_TEXTURE2_ARB); -				glDisableClientState(GL_TEXTURE_COORD_ARRAY); -				glClientActiveTextureARB(GL_TEXTURE0_ARB); +				if (!(data_mask & MAP_BINORMAL)) +				{ +					glClientActiveTextureARB(GL_TEXTURE2_ARB); +					glDisableClientState(GL_TEXTURE_COORD_ARRAY); +					glClientActiveTextureARB(GL_TEXTURE0_ARB); +				}  			} -		} -		else if (data_mask & MAP_BINORMAL) -		{ -			glClientActiveTextureARB(GL_TEXTURE2_ARB); -			glEnableClientState(GL_TEXTURE_COORD_ARRAY); -			glClientActiveTextureARB(GL_TEXTURE0_ARB); -		} -	 -		if (sLastMask & MAP_WEIGHT4) -		{ -			if (sWeight4Loc < 0) +			else if (data_mask & MAP_BINORMAL)  			{ -				llerrs << "Weighting disabled but vertex buffer still bound!" << llendl; -			} - -			if (!(data_mask & MAP_WEIGHT4)) -			{ //disable 4-component skin weight			 -				glDisableVertexAttribArrayARB(sWeight4Loc); -			} -		} -		else if (data_mask & MAP_WEIGHT4) -		{ -			if (sWeight4Loc >= 0) -			{ //enable 4-component skin weight -				glEnableVertexAttribArrayARB(sWeight4Loc); +				glClientActiveTextureARB(GL_TEXTURE2_ARB); +				glEnableClientState(GL_TEXTURE_COORD_ARRAY); +				glClientActiveTextureARB(GL_TEXTURE0_ARB);  			}  		} -				 - +		  		sLastMask = data_mask;  	}  } @@ -1592,6 +1652,10 @@ bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index, S  {  	return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index, count, map_range);  } +bool LLVertexBuffer::getEmissiveStrider(LLStrider<U8>& strider, S32 index, S32 count, bool map_range) +{ +	return VertexBufferStrider<U8,TYPE_EMISSIVE>::get(*this, strider, index, count, map_range); +}  bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index, S32 count, bool map_range)  {  	return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index, count, map_range); @@ -1810,46 +1874,166 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const  		llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;  	} +	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; + +	//assert that fixed function is allowed OR a shader is currently bound +	llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL); +  	if (data_mask & MAP_NORMAL)  	{ -		glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL])); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_NORMAL); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL])); +		} +		else if (!shader) +		{ +			glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL])); +		}  	}  	if (data_mask & MAP_TEXCOORD3)  	{ -		glClientActiveTextureARB(GL_TEXTURE3_ARB); -		glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], (void*)(base + mOffsets[TYPE_TEXCOORD3])); -		glClientActiveTextureARB(GL_TEXTURE0_ARB); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_TEXCOORD3); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], (void*)(base + mOffsets[TYPE_TEXCOORD3])); +		} +		else if (!shader) +		{ +			glClientActiveTextureARB(GL_TEXTURE3_ARB); +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], (void*)(base + mOffsets[TYPE_TEXCOORD3])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB); +		}  	}  	if (data_mask & MAP_TEXCOORD2)  	{ -		glClientActiveTextureARB(GL_TEXTURE2_ARB); -		glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], (void*)(base + mOffsets[TYPE_TEXCOORD2])); -		glClientActiveTextureARB(GL_TEXTURE0_ARB); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_TEXCOORD2); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], (void*)(base + mOffsets[TYPE_TEXCOORD2])); +		} +		else if (!shader) +		{ +			glClientActiveTextureARB(GL_TEXTURE2_ARB); +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], (void*)(base + mOffsets[TYPE_TEXCOORD2])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB); +		}  	}  	if (data_mask & MAP_TEXCOORD1)  	{ -		glClientActiveTextureARB(GL_TEXTURE1_ARB); -		glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1])); -		glClientActiveTextureARB(GL_TEXTURE0_ARB); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_TEXCOORD1); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1])); +		} +		else if (!shader) +		{ +			glClientActiveTextureARB(GL_TEXTURE1_ARB); +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB); +		}  	}  	if (data_mask & MAP_BINORMAL)  	{ -		glClientActiveTextureARB(GL_TEXTURE2_ARB); -		glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL])); -		glClientActiveTextureARB(GL_TEXTURE0_ARB); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_BINORMAL); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL])); +		} +		else if (!shader) +		{ +			glClientActiveTextureARB(GL_TEXTURE2_ARB); +			glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB); +		}  	}  	if (data_mask & MAP_TEXCOORD0)  	{ -		glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0])); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_TEXCOORD0); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0])); +		} +		else if (!shader) +		{ +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0])); +		}  	}  	if (data_mask & MAP_COLOR)  	{ -		glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR])); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_COLOR); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR])); +		} +		else if (!shader) +		{ +			glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR])); +		} +	} +	if (data_mask & MAP_EMISSIVE) +	{ +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_EMISSIVE); +		} + +		if (loc >= 0) +		{ +			glVertexAttribPointerARB(loc, 1, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], (void*)(base + mOffsets[TYPE_EMISSIVE])); +		}  	} -	  	if (data_mask & MAP_WEIGHT)  	{ -		glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT])); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_WEIGHT); +		} + +		if (loc < 0) +		{ //legacy behavior, some shaders have weight hardcoded to location 1 +			loc = 1; +		} +		 +		glVertexAttribPointerARB(loc, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT])); +		  	}  	if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1) @@ -1859,17 +2043,47 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const  	if (data_mask & MAP_CLOTHWEIGHT)  	{ -		glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE,  LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT])); +		S32 loc = -1; +		if (shader) +		{ +			loc = shader->getAttribLocation(TYPE_CLOTHWEIGHT); +		} + +		if (loc < 0) +		{ //legacy behavior, some shaders have weight hardcoded to location 4 +			loc = 4; +		} +		glVertexAttribPointerARB(loc, 4, GL_FLOAT, TRUE,  LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));  	}  	if (data_mask & MAP_VERTEX)  	{ -		if (data_mask & MAP_TEXTURE_INDEX) +		S32 loc = -1; +		if (shader)  		{ -			glVertexPointer(4,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); +			loc = shader->getAttribLocation(TYPE_VERTEX);  		} -		else + +		if (loc >= 0)  		{ -			glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); +			if (data_mask & MAP_TEXTURE_INDEX) +			{ +				glVertexAttribPointerARB(loc, 4,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); +			} +			else +			{ +				glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); +			} +		} +		else if (!shader) +		{ +			if (data_mask & MAP_TEXTURE_INDEX) +			{ +				glVertexPointer(4,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); +			} +			else +			{ +				glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); +			}  		}  	} diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index cc5d11e1c2..3cccdf62ec 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -133,6 +133,12 @@ public:  	static S32 calcOffsets(const U32& typemask, S32* offsets, S32 num_vertices);		 +	//WARNING -- when updating these enums you MUST  +	// 1 - update LLVertexBuffer::sTypeSize +	// 2 - add a strider accessor +	// 3 - modify LLVertexBuffer::setupVertexBuffer +	// 4 - modify LLVertexBuffer::setupClientArray +	// 5 - modify LLViewerShaderMgr::mReservedAttribs  	enum {  		TYPE_VERTEX,  		TYPE_NORMAL, @@ -141,6 +147,7 @@ public:  		TYPE_TEXCOORD2,  		TYPE_TEXCOORD3,  		TYPE_COLOR, +		TYPE_EMISSIVE,  		// These use VertexAttribPointer and should possibly be made generic  		TYPE_BINORMAL,  		TYPE_WEIGHT, @@ -160,6 +167,7 @@ public:  		MAP_TEXCOORD2 = (1<<TYPE_TEXCOORD2),  		MAP_TEXCOORD3 = (1<<TYPE_TEXCOORD3),  		MAP_COLOR = (1<<TYPE_COLOR), +		MAP_EMISSIVE = (1<<TYPE_EMISSIVE),  		// These use VertexAttribPointer and should possibly be made generic  		MAP_BINORMAL = (1<<TYPE_BINORMAL),  		MAP_WEIGHT = (1<<TYPE_WEIGHT), @@ -218,10 +226,12 @@ public:  	bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false); +	bool getEmissiveStrider(LLStrider<U8>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getWeightStrider(LLStrider<F32>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);  	bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false); +  	BOOL isEmpty() const					{ return mEmpty; }  	BOOL isLocked() const					{ return mVertexLocked || mIndexLocked; }  	S32 getNumVerts() const					{ return mNumVerts; } | 
