diff options
| author | Stinson Linden <stinson@lindenlab.com> | 2014-04-24 21:55:35 +0100 | 
|---|---|---|
| committer | Stinson Linden <stinson@lindenlab.com> | 2014-04-24 21:55:35 +0100 | 
| commit | 721ccc41bb6fca559146098a8cfdf02c785e6618 (patch) | |
| tree | 31242daca7a8830d86b80004344e0507a0331101 | |
| parent | b24552e313dc971d7750025c4b6f953ee3155ea9 (diff) | |
MAINT-4009: Cleaning up some statically allocated memory in a LLVolumeGeometryManager method that was never freed.
| -rwxr-xr-x | indra/newview/llspatialpartition.h | 16 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 118 | 
2 files changed, 102 insertions, 32 deletions
| diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index a7b99a0f6b..08a4d00d0f 100755 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -640,12 +640,26 @@ class LLVolumeGeometryManager: public LLGeometryManager  		DISTANCE_SORT  	} eSortType; -	virtual ~LLVolumeGeometryManager() { } +	LLVolumeGeometryManager(); +	virtual ~LLVolumeGeometryManager();  	virtual void rebuildGeom(LLSpatialGroup* group);  	virtual void rebuildMesh(LLSpatialGroup* group);  	virtual void getGeometry(LLSpatialGroup* group);  	void genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace** faces, U32 face_count, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE, BOOL no_materials = FALSE);  	void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type); + +private: +	void allocateFaces(U32 pMaxFaceCount); +	void freeFaces(); + +	static int32_t sInstanceCount; +	static LLFace** sFullbrightFaces; +	static LLFace** sBumpFaces; +	static LLFace** sSimpleFaces; +	static LLFace** sNormFaces; +	static LLFace** sSpecFaces; +	static LLFace** sNormSpecFaces; +	static LLFace** sAlphaFaces;  };  //spatial partition that uses volume geometry manager (implemented in LLVOVolume.cpp) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index d1108020ff..1fa14cf003 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4059,7 +4059,8 @@ U32 LLVOVolume::getPartitionType() const  }  LLVolumePartition::LLVolumePartition(LLViewerRegion* regionp) -: LLSpatialPartition(LLVOVolume::VERTEX_DATA_MASK, TRUE, GL_DYNAMIC_DRAW_ARB, regionp) +: LLSpatialPartition(LLVOVolume::VERTEX_DATA_MASK, TRUE, GL_DYNAMIC_DRAW_ARB, regionp), +LLVolumeGeometryManager()  {  	mLODPeriod = 32;  	mDepthMask = FALSE; @@ -4070,7 +4071,8 @@ LLVolumePartition::LLVolumePartition(LLViewerRegion* regionp)  }  LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep, LLViewerRegion* regionp) -: LLSpatialBridge(drawablep, TRUE, LLVOVolume::VERTEX_DATA_MASK, regionp) +: LLSpatialBridge(drawablep, TRUE, LLVOVolume::VERTEX_DATA_MASK, regionp), +LLVolumeGeometryManager()  {  	mDepthMask = FALSE;  	mLODPeriod = 32; @@ -4107,6 +4109,70 @@ bool can_batch_texture(LLFace* facep)  	return true;  } +const static U32 MAX_FACE_COUNT = 4096U; +int32_t LLVolumeGeometryManager::sInstanceCount = 0; +LLFace** LLVolumeGeometryManager::sFullbrightFaces = NULL; +LLFace** LLVolumeGeometryManager::sBumpFaces = NULL; +LLFace** LLVolumeGeometryManager::sSimpleFaces = NULL; +LLFace** LLVolumeGeometryManager::sNormFaces = NULL; +LLFace** LLVolumeGeometryManager::sSpecFaces = NULL; +LLFace** LLVolumeGeometryManager::sNormSpecFaces = NULL; +LLFace** LLVolumeGeometryManager::sAlphaFaces = NULL; + +LLVolumeGeometryManager::LLVolumeGeometryManager() +	: LLGeometryManager() +{ +	llassert(sInstanceCount >= 0); +	if (sInstanceCount == 0) +	{ +		allocateFaces(MAX_FACE_COUNT); +	} + +	++sInstanceCount; +} + +LLVolumeGeometryManager::~LLVolumeGeometryManager() +{ +	llassert(sInstanceCount > 0); +	--sInstanceCount; + +	if (sInstanceCount <= 0) +	{ +		freeFaces(); +		sInstanceCount = 0; +	} +} + +void LLVolumeGeometryManager::allocateFaces(U32 pMaxFaceCount) +{ +	sFullbrightFaces = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount*sizeof(LLFace*))); +	sBumpFaces = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount*sizeof(LLFace*))); +	sSimpleFaces = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount*sizeof(LLFace*))); +	sNormFaces = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount*sizeof(LLFace*))); +	sSpecFaces = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount*sizeof(LLFace*))); +	sNormSpecFaces = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount*sizeof(LLFace*))); +	sAlphaFaces = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount*sizeof(LLFace*))); +} + +void LLVolumeGeometryManager::freeFaces() +{ +	ll_aligned_free<64>(sFullbrightFaces); +	ll_aligned_free<64>(sBumpFaces); +	ll_aligned_free<64>(sSimpleFaces); +	ll_aligned_free<64>(sNormFaces); +	ll_aligned_free<64>(sSpecFaces); +	ll_aligned_free<64>(sNormSpecFaces); +	ll_aligned_free<64>(sAlphaFaces); + +	sFullbrightFaces = NULL; +	sBumpFaces = NULL; +	sSimpleFaces = NULL; +	sNormFaces = NULL; +	sSpecFaces = NULL; +	sNormSpecFaces = NULL; +	sAlphaFaces = NULL; +} +  static LLTrace::BlockTimerStatHandle FTM_REGISTER_FACE("Register Face");  void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type) @@ -4429,16 +4495,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  	mFaceList.clear(); -	const U32 MAX_FACE_COUNT = 4096; -	 -	static LLFace** fullbright_faces = (LLFace**) ll_aligned_malloc<64>(MAX_FACE_COUNT*sizeof(LLFace*)); -	static LLFace** bump_faces = (LLFace**) ll_aligned_malloc<64>(MAX_FACE_COUNT*sizeof(LLFace*)); -	static LLFace** simple_faces = (LLFace**) ll_aligned_malloc<64>(MAX_FACE_COUNT*sizeof(LLFace*)); -	static LLFace** norm_faces = (LLFace**) ll_aligned_malloc<64>(MAX_FACE_COUNT*sizeof(LLFace*)); -	static LLFace** spec_faces = (LLFace**) ll_aligned_malloc<64>(MAX_FACE_COUNT*sizeof(LLFace*)); -	static LLFace** normspec_faces = (LLFace**) ll_aligned_malloc<64>(MAX_FACE_COUNT*sizeof(LLFace*)); -	static LLFace** alpha_faces = (LLFace**) ll_aligned_malloc<64>(MAX_FACE_COUNT*sizeof(LLFace*)); -	  	U32 fullbright_count = 0;  	U32 bump_count = 0;  	U32 simple_count = 0; @@ -4820,7 +4876,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  						{ //can be treated as alpha mask  							if (simple_count < MAX_FACE_COUNT)  							{ -								simple_faces[simple_count++] = facep; +								sSimpleFaces[simple_count++] = facep;  							}  						}  						else @@ -4831,7 +4887,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							}  							if (alpha_count < MAX_FACE_COUNT)  							{ -								alpha_faces[alpha_count++] = facep; +								sAlphaFaces[alpha_count++] = facep;  							}  						}  					} @@ -4854,14 +4910,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  									{ //has normal and specular maps (needs texcoord1, texcoord2, and tangent)  										if (normspec_count < MAX_FACE_COUNT)  										{ -											normspec_faces[normspec_count++] = facep; +											sNormSpecFaces[normspec_count++] = facep;  										}  									}  									else  									{ //has normal map (needs texcoord1 and tangent)  										if (norm_count < MAX_FACE_COUNT)  										{ -											norm_faces[norm_count++] = facep; +											sNormFaces[norm_count++] = facep;  										}  									}  								} @@ -4869,14 +4925,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  								{ //has specular map but no normal map, needs texcoord2  									if (spec_count < MAX_FACE_COUNT)  									{ -										spec_faces[spec_count++] = facep; +										sSpecFaces[spec_count++] = facep;  									}  								}  								else  								{ //has neither specular map nor normal map, only needs texcoord0  									if (simple_count < MAX_FACE_COUNT)  									{ -										simple_faces[simple_count++] = facep; +										sSimpleFaces[simple_count++] = facep;  									}  								}									  							} @@ -4884,14 +4940,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							{ //needs normal + tangent  								if (bump_count < MAX_FACE_COUNT)  								{ -									bump_faces[bump_count++] = facep; +									sBumpFaces[bump_count++] = facep;  								}  							}  							else if (te->getShiny() || !te->getFullbright())  							{ //needs normal  								if (simple_count < MAX_FACE_COUNT)  								{ -									simple_faces[simple_count++] = facep; +									sSimpleFaces[simple_count++] = facep;  								}  							}  							else  @@ -4899,7 +4955,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  								facep->setState(LLFace::FULLBRIGHT);  								if (fullbright_count < MAX_FACE_COUNT)  								{ -									fullbright_faces[fullbright_count++] = facep; +									sFullbrightFaces[fullbright_count++] = facep;  								}  							}  						} @@ -4909,7 +4965,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							{ //needs normal + tangent  								if (bump_count < MAX_FACE_COUNT)  								{ -									bump_faces[bump_count++] = facep; +									sBumpFaces[bump_count++] = facep;  								}  							}  							else if ((te->getShiny() && LLPipeline::sRenderBump) || @@ -4917,7 +4973,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							{ //needs normal  								if (simple_count < MAX_FACE_COUNT)  								{ -									simple_faces[simple_count++] = facep; +									sSimpleFaces[simple_count++] = facep;  								}  							}  							else  @@ -4925,7 +4981,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  								facep->setState(LLFace::FULLBRIGHT);  								if (fullbright_count < MAX_FACE_COUNT)  								{ -									fullbright_faces[fullbright_count++] = facep; +									sFullbrightFaces[fullbright_count++] = facep;  								}  							}  						} @@ -4988,13 +5044,13 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  		fullbright_mask = fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX;  	} -	genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, simple_count, FALSE, batch_textures, FALSE); -	genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, fullbright_count, FALSE, batch_textures); -	genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, alpha_count, TRUE, batch_textures); -	genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, bump_count, FALSE, FALSE); -	genDrawInfo(group, norm_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, norm_faces, norm_count, FALSE, FALSE); -	genDrawInfo(group, spec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, spec_faces, spec_count, FALSE, FALSE); -	genDrawInfo(group, normspec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, normspec_faces, normspec_count, FALSE, FALSE); +	genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, sSimpleFaces, simple_count, FALSE, batch_textures, FALSE); +	genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, sFullbrightFaces, fullbright_count, FALSE, batch_textures); +	genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, sAlphaFaces, alpha_count, TRUE, batch_textures); +	genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, sBumpFaces, bump_count, FALSE, FALSE); +	genDrawInfo(group, norm_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, sNormFaces, norm_count, FALSE, FALSE); +	genDrawInfo(group, spec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, sSpecFaces, spec_count, FALSE, FALSE); +	genDrawInfo(group, normspec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, sNormSpecFaces, normspec_count, FALSE, FALSE);  	if (!LLPipeline::sDelayVBUpdate)  	{ | 
