diff options
| author | Dave Parks <davep@lindenlab.com> | 2013-04-02 15:45:17 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2013-04-02 15:45:17 -0500 | 
| commit | 53d7db98ffadce190995833b9f785d5ebfa7cf4d (patch) | |
| tree | 8c8e4668d660eb597794c982bbc125e48a76826d | |
| parent | c13f7721f833ce7342b41834363a8e54349c6839 (diff) | |
NORSPEC-74 Fix for assert when Debug GL enabled when rendering materials.
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 10 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.h | 1 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 27 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolmaterials.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 8 | 
5 files changed, 45 insertions, 6 deletions
| diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 78fd4e98d7..39ad9b9e9b 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -88,7 +88,12 @@ LLShaderFeatures::LLShaderFeatures()  // LLGLSL Shader implementation  //===============================  LLGLSLShader::LLGLSLShader() -	: mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE) +	: mProgramObject(0),  +	  mAttributeMask(0), +	  mActiveTextureChannels(0),  +	  mShaderLevel(0),  +	  mShaderGroup(SG_DEFAULT),  +	  mUniformsDirty(FALSE)  {  } @@ -285,6 +290,8 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes)  	if (res)  	{ //read back channel locations +		mAttributeMask = 0; +  		//read back reserved channels first  		for (U32 i = 0; i < LLShaderMgr::instance()->mReservedAttribs.size(); i++)  		{ @@ -293,6 +300,7 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes)  			if (index != -1)  			{  				mAttribute[i] = index; +				mAttributeMask |= 1 << i;  				LL_DEBUGS("ShaderLoading") << "Attribute " << name << " assigned to channel " << index << LL_ENDL;  			}  		} diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 2af74c20ff..725a7e2573 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -152,6 +152,7 @@ public:  	GLhandleARB mProgramObject;  	std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel +	U32 mAttributeMask;  //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask())  	std::vector<GLint> mUniform;   //lookup table of uniform enum to uniform location  	std::map<std::string, GLint> mUniformMap;  //lookup map of uniform name to uniform location  	std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 4e3cea9474..29fe5400a3 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -349,6 +349,25 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =  	sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes  }; +static std::string vb_type_name[] = +{ +	"TYPE_VERTEX", +	"TYPE_NORMAL", +	"TYPE_TEXCOORD0", +	"TYPE_TEXCOORD1", +	"TYPE_TEXCOORD2", +	"TYPE_TEXCOORD3", +	"TYPE_COLOR", +	"TYPE_EMISSIVE", +	"TYPE_BINORMAL", +	"TYPE_WEIGHT", +	"TYPE_WEIGHT4", +	"TYPE_CLOTHWEIGHT", +	"TYPE_TEXTURE_INDEX", +	"TYPE_MAX", +	"TYPE_INDEX",	 +}; +  U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =   {  	GL_TRIANGLES, @@ -2313,6 +2332,14 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)  	if (gDebugGL && ((data_mask & mTypeMask) != data_mask))  	{ +		for (U32 i = 0; i < LLVertexBuffer::TYPE_MAX; ++i) +		{ +			U32 mask = 1 << i; +			if (mask & data_mask && !(mask & mTypeMask)) +			{ //bit set in data_mask, but not set in mTypeMask +				llwarns << "Missing required component " << vb_type_name[i] << llendl; +			} +		}  		llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;  	} diff --git a/indra/newview/lldrawpoolmaterials.cpp b/indra/newview/lldrawpoolmaterials.cpp index d6cca9abe2..3e0f9c9d4d 100644 --- a/indra/newview/lldrawpoolmaterials.cpp +++ b/indra/newview/lldrawpoolmaterials.cpp @@ -113,6 +113,9 @@ void LLDrawPoolMaterials::renderDeferred(S32 pass)  	llassert(pass < sizeof(type_list)/sizeof(U32));  	U32 type = type_list[pass]; + +	U32 mask = mShader->mAttributeMask; +  	LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);  	LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type); @@ -137,7 +140,7 @@ void LLDrawPoolMaterials::renderDeferred(S32 pass)  		mShader->setMinimumAlpha(params.mAlphaMaskCutoff); -		pushBatch(params, VERTEX_DATA_MASK, TRUE); +		pushBatch(params, mask, TRUE);  	}  } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index fd9f3dc486..8a1f00aa0e 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4771,10 +4771,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  	genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, batch_textures);  	genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, batch_textures);  	genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, batch_textures); -	genDrawInfo(group, bump_mask, bump_faces, FALSE, FALSE); -	genDrawInfo(group, norm_mask, norm_faces, FALSE, FALSE); -	genDrawInfo(group, spec_mask, spec_faces, FALSE, FALSE); -	genDrawInfo(group, normspec_mask, normspec_faces, FALSE, FALSE); +	genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, FALSE); +	genDrawInfo(group, norm_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, norm_faces, FALSE, FALSE); +	genDrawInfo(group, spec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, spec_faces, FALSE, FALSE); +	genDrawInfo(group, normspec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, normspec_faces, FALSE, FALSE);  	if (!LLPipeline::sDelayVBUpdate)  	{ | 
