diff options
Diffstat (limited to 'indra/newview')
| -rwxr-xr-x | indra/newview/llface.cpp | 28 | ||||
| -rwxr-xr-x | indra/newview/llmeshrepository.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 29 | 
3 files changed, 50 insertions, 9 deletions
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index a7e225843c..6b3127decf 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -53,6 +53,7 @@  #include "llviewershadermgr.h"  #include "llvoavatar.h" +extern BOOL gGLDebugLoggingEnabled;  #define LL_MAX_INDICES_COUNT 1000000 @@ -1166,6 +1167,15 @@ static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color");  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_EMISSIVE("Emissive");  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights");  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal"); + +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK("Face Feedback"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_POSITION("Feedback Position"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_NORMAL("Feedback  Normal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_TEXTURE("Feedback  Texture"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_COLOR("Feedback  Color"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_EMISSIVE("Feedback  Emissive"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_BINORMAL("Feedback Binormal"); +  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index");  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX_TAIL("Tail");  static LLFastTimer::DeclareTimer FTM_FACE_POSITION_STORE("Pos"); @@ -1389,12 +1399,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  #ifdef GL_TRANSFORM_FEEDBACK_BUFFER  	if (use_transform_feedback && +		mVertexBuffer->getUsage() == GL_DYNAMIC_COPY_ARB &&  		gTransformPositionProgram.mProgramObject && //transform shaders are loaded  		mVertexBuffer->useVBOs() && //target buffer is in VRAM  		!rebuild_weights && //TODO: add support for weights  		!volume.isUnique()) //source volume is NOT flexi  	{ //use transform feedback to pack vertex buffer - +		//gGLDebugLoggingEnabled = TRUE; +		LLFastTimer t(FTM_FACE_GEOM_FEEDBACK);  		LLVertexBuffer* buff = (LLVertexBuffer*) vf.mVertexBuffer.get();  		if (vf.mVertexBuffer.isNull() || buff->getNumVerts() != vf.mNumVertices) @@ -1411,7 +1423,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		if (rebuild_pos)  		{ -			LLFastTimer t(FTM_FACE_GEOM_POSITION); +			LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_POSITION);  			gTransformPositionProgram.bind();  			mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount); @@ -1436,7 +1448,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		if (rebuild_color)  		{ -			LLFastTimer t(FTM_FACE_GEOM_COLOR); +			LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_COLOR);  			gTransformColorProgram.bind();  			mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_COLOR, mGeomIndex, mGeomCount); @@ -1452,7 +1464,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		if (rebuild_emissive)  		{ -			LLFastTimer t(FTM_FACE_GEOM_EMISSIVE); +			LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_EMISSIVE);  			gTransformColorProgram.bind();  			mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_EMISSIVE, mGeomIndex, mGeomCount); @@ -1473,7 +1485,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		if (rebuild_normal)  		{ -			LLFastTimer t(FTM_FACE_GEOM_NORMAL); +			LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_NORMAL);  			gTransformNormalProgram.bind();  			mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_NORMAL, mGeomIndex, mGeomCount); @@ -1486,7 +1498,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		if (rebuild_binormal)  		{ -			LLFastTimer t(FTM_FACE_GEOM_BINORMAL); +			LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_BINORMAL);  			gTransformBinormalProgram.bind();  			mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_BINORMAL, mGeomIndex, mGeomCount); @@ -1499,7 +1511,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		if (rebuild_tcoord)  		{ -			LLFastTimer t(FTM_FACE_GEOM_TEXTURE); +			LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_TEXTURE);  			gTransformTexCoordProgram.bind();  			mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD0, mGeomIndex, mGeomCount); @@ -1522,13 +1534,13 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		}  		glBindBufferARB(GL_TRANSFORM_FEEDBACK_BUFFER, 0); -  		gGL.popMatrix();  		if (cur_shader)  		{  			cur_shader->bind();  		} +		//gGLDebugLoggingEnabled = FALSE;  	}  	else  #endif diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 5b65687090..ae48898e82 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -588,7 +588,7 @@ void LLMeshRepoThread::run()  					if (!fetchMeshLOD(req.mMeshParams, req.mLOD, count))//failed, resubmit  					{  						mMutex->lock(); -						mLODReqQ.push(req) ;  +						mLODReqQ.push(req);   						mMutex->unlock();  					}  				} diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index b853112f74..6a18534484 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -99,6 +99,8 @@ static LLFastTimer::DeclareTimer FTM_GEN_TRIANGLES("Generate Triangles");  static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes");  static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures"); +extern BOOL gGLDebugLoggingEnabled; +  // Implementation class of LLMediaDataClientObject.  See llmediadataclient.h  class LLMediaDataClientObjectImpl : public LLMediaDataClientObject  { @@ -1067,7 +1069,9 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo  					break;  				}  				volume->genBinormals(i); +				//gGLDebugLoggingEnabled = TRUE;  				LLFace::cacheFaceInVRAM(face); +				//gGLDebugLoggingEnabled = FALSE;  			}  		} @@ -4836,6 +4840,16 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  	U32 buffer_usage = group->mBufferUsage; +	static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback"); + +	if (use_transform_feedback && +		gTransformPositionProgram.mProgramObject && //transform shaders are loaded +		buffer_usage == GL_DYNAMIC_DRAW_ARB && //target buffer is in VRAM +		!(mask & LLVertexBuffer::MAP_WEIGHT4)) //TODO: add support for weights +	{ +		buffer_usage = GL_DYNAMIC_COPY_ARB; +	} +  #if LL_DARWIN  	// HACK from Leslie:  	// Disable VBO usage for alpha on Mac OS X because it kills the framerate @@ -4895,6 +4909,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  	//NEVER use more than 16 texture index channels (workaround for prevalent driver bug)  	texture_index_channels = llmin(texture_index_channels, 16); +	bool flexi = false; +  	while (face_iter != faces.end())  	{  		//pull off next face @@ -4921,6 +4937,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  		U32 index_count = facep->getIndicesCount();  		U32 geom_count = facep->getGeomCount(); +		flexi = flexi || facep->getViewerObject()->getVolume()->isUnique(); +  		//sum up vertices needed for this render batch  		std::vector<LLFace*>::iterator i = face_iter;  		++i; @@ -4989,6 +5007,9 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  						}  						++i; + +						flexi = flexi || facep->getViewerObject()->getVolume()->isUnique(); +  						index_count += facep->getIndicesCount();  						geom_count += facep->getGeomCount(); @@ -5018,10 +5039,18 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  					++i;  					index_count += facep->getIndicesCount();  					geom_count += facep->getGeomCount(); + +					flexi = flexi || facep->getViewerObject()->getVolume()->isUnique();  				}  			}  		} + +		if (flexi && buffer_usage && buffer_usage != GL_STREAM_DRAW_ARB) +		{ +			buffer_usage = GL_STREAM_DRAW_ARB; +		} +  		//create vertex buffer  		LLVertexBuffer* buffer = NULL;  | 
