diff options
| author | Dave Parks <davep@lindenlab.com> | 2012-09-20 10:00:58 -0400 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2012-09-20 10:00:58 -0400 | 
| commit | 7fc702dc4930445b87dc2cd1d52c0cc64295f26c (patch) | |
| tree | 87674607fb652ac2334023997060c842a20cb3b3 /indra/newview | |
| parent | 60cf43bad98d620f6024c9fe3f0b48aeecad2de7 (diff) | |
reapply 04fdf7945708: MAINT-775 Fix for particle index pool corruption on teleport.
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llappviewer.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llface.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llface.h | 1 | ||||
| -rw-r--r-- | indra/newview/llvopartgroup.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llvopartgroup.h | 1 | 
5 files changed, 15 insertions, 8 deletions
| diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index e8934d9a9e..cb69048c60 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -89,6 +89,7 @@  #include "lllogininstance.h"  #include "llprogressview.h"  #include "llvocache.h" +#include "llvopartgroup.h"  #include "llweb.h"  #include "llsecondlifeurls.h"  #include "llupdaterservice.h" @@ -679,6 +680,9 @@ bool LLAppViewer::init()  	// initialize SSE options  	LLVector4a::initClass(); +	//initialize particle index pool +	LLVOPartGroup::initClass(); +  	// Need to do this initialization before we do anything else, since anything  	// that touches files should really go through the lldir API  	gDirUtilp->initAppDirs("SecondLife"); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 2074cb6514..582f06eeb0 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -202,13 +202,10 @@ void LLFace::destroy()  		mTexture->removeFace(this) ;  	} -	if (mDrawablep.notNull() && -		(mDrawablep->getRenderType() == LLPipeline::RENDER_TYPE_PARTICLES || -		mDrawablep->getRenderType() == LLPipeline::RENDER_TYPE_HUD_PARTICLES) && -		mIndicesIndex != 0xFFFFFFFF) +	if (isState(LLFace::PARTICLE))  	{  		LLVOPartGroup::freeVBSlot(getGeomIndex()/4); -		mIndicesIndex = 0xFFFFFFFF; +		clearState(LLFace::PARTICLE);  	}  	if (mDrawPoolp) diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 5dca27487f..efc3424858 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -90,6 +90,7 @@ public:  		USE_FACE_COLOR	= 0x0010,  		TEXTURE_ANIM	= 0x0020,   		RIGGED			= 0x0040, +		PARTICLE		= 0x0080,  	};  	static void initClass(); diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 02282fd6a6..9cce68fff6 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -52,8 +52,7 @@ LLPointer<LLVertexBuffer> LLVOPartGroup::sVB = NULL;  S32 LLVOPartGroup::sVBSlotFree[];  S32* LLVOPartGroup::sVBSlotCursor = NULL; -//static -void LLVOPartGroup::restoreGL() +void LLVOPartGroup::initClass()  {  	for (S32 i = 0; i < LL_MAX_PARTICLE_COUNT; ++i)  	{ @@ -61,7 +60,11 @@ void LLVOPartGroup::restoreGL()  	}  	sVBSlotCursor = sVBSlotFree; +} +//static +void LLVOPartGroup::restoreGL() +{  	sVB = new LLVertexBuffer(VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);  	U32 count = LL_MAX_PARTICLE_COUNT;  	sVB->allocateBuffer(count*4, count*6, true); @@ -626,7 +629,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)  		LLFace* facep = *i;  		LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject(); -		if (facep->getIndicesStart() == 0xFFFFFFFF) +		if (!facep->isState(LLFace::PARTICLE))  		{ //set the indices of this face  			S32 idx = LLVOPartGroup::findAvailableVBSlot();  			if (idx >= 0) @@ -635,6 +638,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)  				facep->setIndicesIndex(idx*6);  				facep->setVertexBuffer(LLVOPartGroup::sVB);  				facep->setPoolType(LLDrawPool::POOL_ALPHA); +				facep->setState(LLFace::PARTICLE);  			}  			else  			{ diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index 6160bceb24..43b2844f07 100644 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -45,6 +45,7 @@ public:  	static S32 sVBSlotFree[LL_MAX_PARTICLE_COUNT];  	static S32* sVBSlotCursor; +	static void initClass();  	static void restoreGL();  	static void destroyGL();  	static S32 findAvailableVBSlot(); | 
