diff options
| -rw-r--r-- | indra/newview/pipeline.cpp | 258 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/sidepanel_item_info.xml | 4 | 
2 files changed, 165 insertions, 97 deletions
| diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 2e9112ed81..95966756f0 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -117,6 +117,8 @@  //#define DEBUG_INDICES  #endif +bool gShiftFrame = false; +  //cached settings  BOOL LLPipeline::RenderAvatarVP;  BOOL LLPipeline::VertexShaderEnable; @@ -214,7 +216,7 @@ BOOL	gDebugPipeline = FALSE;  LLPipeline gPipeline;  const LLMatrix4* gGLLastMatrix = NULL; -LLFastTimer::DeclareTimer FTM_RENDER_GEOMETRY("Geometry"); +LLFastTimer::DeclareTimer FTM_RENDER_GEOMETRY("Render Geometry");  LLFastTimer::DeclareTimer FTM_RENDER_GRASS("Grass");  LLFastTimer::DeclareTimer FTM_RENDER_INVISIBLE("Invisible");  LLFastTimer::DeclareTimer FTM_RENDER_OCCLUSION("Occlusion"); @@ -231,8 +233,13 @@ LLFastTimer::DeclareTimer FTM_RENDER_BUMP("Bump");  LLFastTimer::DeclareTimer FTM_RENDER_FULLBRIGHT("Fullbright");  LLFastTimer::DeclareTimer FTM_RENDER_GLOW("Glow");  LLFastTimer::DeclareTimer FTM_GEO_UPDATE("Geo Update"); +LLFastTimer::DeclareTimer FTM_PIPELINE_CREATE("Pipeline Create");  LLFastTimer::DeclareTimer FTM_POOLRENDER("RenderPool");  LLFastTimer::DeclareTimer FTM_POOLS("Pools"); +LLFastTimer::DeclareTimer FTM_DEFERRED_POOLRENDER("RenderPool (Deferred)"); +LLFastTimer::DeclareTimer FTM_DEFERRED_POOLS("Pools (Deferred)"); +LLFastTimer::DeclareTimer FTM_POST_DEFERRED_POOLRENDER("RenderPool (Post)"); +LLFastTimer::DeclareTimer FTM_POST_DEFERRED_POOLS("Pools (Post)");  LLFastTimer::DeclareTimer FTM_RENDER_BLOOM_FBO("First FBO");  LLFastTimer::DeclareTimer FTM_STATESORT("Sort Draw State");  LLFastTimer::DeclareTimer FTM_PIPELINE("Pipeline"); @@ -1661,7 +1668,7 @@ U32 LLPipeline::addObject(LLViewerObject *vobj)  void LLPipeline::createObjects(F32 max_dtime)  { -	LLFastTimer ftm(FTM_GEO_UPDATE); +	LLFastTimer ftm(FTM_PIPELINE_CREATE);  	LLMemType mt(LLMemType::MTYPE_PIPELINE_CREATE_OBJECTS);  	LLTimer update_timer; @@ -2494,14 +2501,19 @@ BOOL LLPipeline::updateDrawableGeom(LLDrawable* drawablep, BOOL priority)  static LLFastTimer::DeclareTimer FTM_SEED_VBO_POOLS("Seed VBO Pool"); +static LLFastTimer::DeclareTimer FTM_UPDATE_GL("Update GL"); +  void LLPipeline::updateGL()  { -	while (!LLGLUpdate::sGLQ.empty())  	{ -		LLGLUpdate* glu = LLGLUpdate::sGLQ.front(); -		glu->updateGL(); -		glu->mInQ = FALSE; -		LLGLUpdate::sGLQ.pop_front(); +		LLFastTimer t(FTM_UPDATE_GL); +		while (!LLGLUpdate::sGLQ.empty()) +		{ +			LLGLUpdate* glu = LLGLUpdate::sGLQ.front(); +			glu->updateGL(); +			glu->mInQ = FALSE; +			LLGLUpdate::sGLQ.pop_front(); +		}  	}  	{ //seed VBO Pools @@ -2510,11 +2522,13 @@ void LLPipeline::updateGL()  	}  } +static LLFastTimer::DeclareTimer FTM_REBUILD_PRIORITY_GROUPS("Rebuild Priority Groups"); +  void LLPipeline::rebuildPriorityGroups()  { +	LLFastTimer t(FTM_REBUILD_PRIORITY_GROUPS);  	LLTimer update_timer;  	LLMemType mt(LLMemType::MTYPE_PIPELINE); -	  	assertInitialized();  	gMeshRepo.notifyLoadedMeshes(); @@ -2533,7 +2547,9 @@ void LLPipeline::rebuildPriorityGroups()  	mGroupQ1Locked = false;  } -		 + +static LLFastTimer::DeclareTimer FTM_REBUILD_GROUPS("Rebuild Groups"); +  void LLPipeline::rebuildGroups()  {  	if (mGroupQ2.empty()) @@ -2541,6 +2557,7 @@ void LLPipeline::rebuildGroups()  		return;  	} +	LLFastTimer t(FTM_REBUILD_GROUPS);  	mGroupQ2Locked = true;  	// Iterate through some drawables on the non-priority build queue  	S32 size = (S32) mGroupQ2.size(); @@ -2782,6 +2799,10 @@ void LLPipeline::markShift(LLDrawable *drawablep)  	}  } +static LLFastTimer::DeclareTimer FTM_SHIFT_DRAWABLE("Shift Drawable"); +static LLFastTimer::DeclareTimer FTM_SHIFT_OCTREE("Shift Octree"); +static LLFastTimer::DeclareTimer FTM_SHIFT_HUD("Shift HUD"); +  void LLPipeline::shiftObjects(const LLVector3 &offset)  {  	LLMemType mt(LLMemType::MTYPE_PIPELINE_SHIFT_OBJECTS); @@ -2794,35 +2815,46 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)  	LLVector4a offseta;  	offseta.load3(offset.mV); -	for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin(); -		 iter != mShiftList.end(); iter++)  	{ -		LLDrawable *drawablep = *iter; -		if (drawablep->isDead()) +		LLFastTimer t(FTM_SHIFT_DRAWABLE); + +		for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin(); +			 iter != mShiftList.end(); iter++)  		{ -			continue; -		}	 -		drawablep->shiftPos(offseta);	 -		drawablep->clearState(LLDrawable::ON_SHIFT_LIST); +			LLDrawable *drawablep = *iter; +			if (drawablep->isDead()) +			{ +				continue; +			}	 +			drawablep->shiftPos(offseta);	 +			drawablep->clearState(LLDrawable::ON_SHIFT_LIST); +		} +		mShiftList.resize(0);  	} -	mShiftList.resize(0); -	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();  -			iter != LLWorld::getInstance()->getRegionList().end(); ++iter) +	  	{ -		LLViewerRegion* region = *iter; -		for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++) +		LLFastTimer t(FTM_SHIFT_OCTREE); +		for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();  +				iter != LLWorld::getInstance()->getRegionList().end(); ++iter)  		{ -			LLSpatialPartition* part = region->getSpatialPartition(i); -			if (part) +			LLViewerRegion* region = *iter; +			for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++)  			{ -				part->shift(offseta); +				LLSpatialPartition* part = region->getSpatialPartition(i); +				if (part) +				{ +					part->shift(offseta); +				}  			}  		}  	} -	LLHUDText::shiftAll(offset); -	LLHUDNameTag::shiftAll(offset); +	{ +		LLFastTimer t(FTM_SHIFT_HUD); +		LLHUDText::shiftAll(offset); +		LLHUDNameTag::shiftAll(offset); +	}  	display_update_camera();  } @@ -2855,8 +2887,10 @@ void LLPipeline::markPartitionMove(LLDrawable* drawable)  	}  } +static LLFastTimer::DeclareTimer FTM_PROCESS_PARTITIONQ("PartitionQ");  void LLPipeline::processPartitionQ()  { +	LLFastTimer t(FTM_PROCESS_PARTITIONQ);  	for (LLDrawable::drawable_list_t::iterator iter = mPartitionQ.begin(); iter != mPartitionQ.end(); ++iter)  	{  		LLDrawable* drawable = *iter; @@ -4116,7 +4150,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)  	LLMemType mt_rgd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED);  	LLFastTimer t(FTM_RENDER_GEOMETRY); -	LLFastTimer t2(FTM_POOLS); +	LLFastTimer t2(FTM_DEFERRED_POOLS);  	LLGLEnable cull(GL_CULL_FACE); @@ -4158,7 +4192,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)  		pool_set_t::iterator iter2 = iter1;  		if (hasRenderType(poolp->getType()) && poolp->getNumDeferredPasses() > 0)  		{ -			LLFastTimer t(FTM_POOLRENDER); +			LLFastTimer t(FTM_DEFERRED_POOLRENDER);  			gGLLastMatrix = NULL;  			gGL.loadMatrix(gGLModelView); @@ -4211,7 +4245,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)  void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  {  	LLMemType mt_rgpd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_POST_DEF); -	LLFastTimer t(FTM_POOLS); +	LLFastTimer t(FTM_POST_DEFERRED_POOLS);  	U32 cur_type = 0;  	LLGLEnable cull(GL_CULL_FACE); @@ -4245,7 +4279,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  		pool_set_t::iterator iter2 = iter1;  		if (hasRenderType(poolp->getType()) && poolp->getNumPostDeferredPasses() > 0)  		{ -			LLFastTimer t(FTM_POOLRENDER); +			LLFastTimer t(FTM_POST_DEFERRED_POOLRENDER);  			gGLLastMatrix = NULL;  			gGL.loadMatrix(gGLModelView); @@ -4782,8 +4816,11 @@ void LLPipeline::renderDebug()  	}  } +static LLFastTimer::DeclareTimer FTM_REBUILD_POOLS("Rebuild Pools"); +  void LLPipeline::rebuildPools()  { +	LLFastTimer t(FTM_REBUILD_POOLS);  	LLMemType mt(LLMemType::MTYPE_PIPELINE_REBUILD_POOLS);  	assertInitialized(); @@ -6342,13 +6379,16 @@ void LLPipeline::resetVertexBuffers()  	mResetVertexBuffers = true;  } +static LLFastTimer::DeclareTimer FTM_RESET_VB("Reset VB"); +  void LLPipeline::doResetVertexBuffers()  {  	if (!mResetVertexBuffers)  	{  		return;  	} -	 + +	LLFastTimer t(FTM_RESET_VB);  	mResetVertexBuffers = false;  	mCubeVB = NULL; @@ -8767,6 +8807,8 @@ void LLPipeline::generateHighlight(LLCamera& camera)  } +static LLFastTimer::DeclareTimer FTM_GEN_SUN_SHADOW("Gen Sun Shadow"); +  void LLPipeline::generateSunShadow(LLCamera& camera)  {  	if (!sRenderDeferred || RenderShadowDetail <= 0) @@ -8774,6 +8816,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  		return;  	} +	LLFastTimer t(FTM_GEN_SUN_SHADOW); +  	BOOL skip_avatar_update = FALSE;  	if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)  	{ @@ -9532,6 +9576,12 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL textu  	}  } +static LLFastTimer::DeclareTimer FTM_IMPOSTOR_MARK_VISIBLE("Impostor Mark Visible"); +static LLFastTimer::DeclareTimer FTM_IMPOSTOR_SETUP("Impostor Setup"); +static LLFastTimer::DeclareTimer FTM_IMPOSTOR_BACKGROUND("Impostor Background"); +static LLFastTimer::DeclareTimer FTM_IMPOSTOR_ALLOCATE("Impostor Allocate"); +static LLFastTimer::DeclareTimer FTM_IMPOSTOR_RESIZE("Impostor Resize"); +  void LLPipeline::generateImpostor(LLVOAvatar* avatar)  {  	LLMemType mt_gi(LLMemType::MTYPE_PIPELINE_GENERATE_IMPOSTOR); @@ -9587,101 +9637,114 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)  	sImpostorRender = TRUE;  	LLViewerCamera* viewer_camera = LLViewerCamera::getInstance(); -	markVisible(avatar->mDrawable, *viewer_camera); -	LLVOAvatar::sUseImpostors = FALSE; -	LLVOAvatar::attachment_map_t::iterator iter; -	for (iter = avatar->mAttachmentPoints.begin(); -		iter != avatar->mAttachmentPoints.end(); -		++iter)  	{ -		LLViewerJointAttachment *attachment = iter->second; -		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); -			 attachment_iter != attachment->mAttachedObjects.end(); -			 ++attachment_iter) +		LLFastTimer t(FTM_IMPOSTOR_MARK_VISIBLE); +		markVisible(avatar->mDrawable, *viewer_camera); +		LLVOAvatar::sUseImpostors = FALSE; + +		LLVOAvatar::attachment_map_t::iterator iter; +		for (iter = avatar->mAttachmentPoints.begin(); +			iter != avatar->mAttachmentPoints.end(); +			++iter)  		{ -			if (LLViewerObject* attached_object = (*attachment_iter)) +			LLViewerJointAttachment *attachment = iter->second; +			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); +				 attachment_iter != attachment->mAttachedObjects.end(); +				 ++attachment_iter)  			{ -				markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera); +				if (LLViewerObject* attached_object = (*attachment_iter)) +				{ +					markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera); +				}  			}  		}  	}  	stateSort(*LLViewerCamera::getInstance(), result); -	const LLVector4a* ext = avatar->mDrawable->getSpatialExtents(); -	LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset()); -  	LLCamera camera = *viewer_camera; - -	camera.lookAt(viewer_camera->getOrigin(), pos, viewer_camera->getUpAxis()); -	  	LLVector2 tdim; +	U32 resY = 0; +	U32 resX = 0; +	{ +		LLFastTimer t(FTM_IMPOSTOR_SETUP); +		const LLVector4a* ext = avatar->mDrawable->getSpatialExtents(); +		LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset()); -	LLVector4a half_height; -	half_height.setSub(ext[1], ext[0]); -	half_height.mul(0.5f); +		camera.lookAt(viewer_camera->getOrigin(), pos, viewer_camera->getUpAxis()); +	 +		LLVector4a half_height; +		half_height.setSub(ext[1], ext[0]); +		half_height.mul(0.5f); -	LLVector4a left; -	left.load3(camera.getLeftAxis().mV); -	left.mul(left); -	left.normalize3fast(); +		LLVector4a left; +		left.load3(camera.getLeftAxis().mV); +		left.mul(left); +		left.normalize3fast(); -	LLVector4a up; -	up.load3(camera.getUpAxis().mV); -	up.mul(up); -	up.normalize3fast(); +		LLVector4a up; +		up.load3(camera.getUpAxis().mV); +		up.mul(up); +		up.normalize3fast(); -	tdim.mV[0] = fabsf(half_height.dot3(left).getF32()); -	tdim.mV[1] = fabsf(half_height.dot3(up).getF32()); +		tdim.mV[0] = fabsf(half_height.dot3(left).getF32()); +		tdim.mV[1] = fabsf(half_height.dot3(up).getF32()); -	gGL.matrixMode(LLRender::MM_PROJECTION); -	gGL.pushMatrix(); +		gGL.matrixMode(LLRender::MM_PROJECTION); +		gGL.pushMatrix(); -	F32 distance = (pos-camera.getOrigin()).length(); -	F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG; -	F32 aspect = tdim.mV[0]/tdim.mV[1]; -	glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f); -	glh_set_current_projection(persp); -	gGL.loadMatrix(persp.m); +		F32 distance = (pos-camera.getOrigin()).length(); +		F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG; +		F32 aspect = tdim.mV[0]/tdim.mV[1]; +		glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f); +		glh_set_current_projection(persp); +		gGL.loadMatrix(persp.m); -	gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.pushMatrix(); -	glh::matrix4f mat; -	camera.getOpenGLTransform(mat.m); +		gGL.matrixMode(LLRender::MM_MODELVIEW); +		gGL.pushMatrix(); +		glh::matrix4f mat; +		camera.getOpenGLTransform(mat.m); -	mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat; +		mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat; -	gGL.loadMatrix(mat.m); -	glh_set_current_modelview(mat); +		gGL.loadMatrix(mat.m); +		glh_set_current_modelview(mat); -	glClearColor(0.0f,0.0f,0.0f,0.0f); -	gGL.setColorMask(true, true); +		glClearColor(0.0f,0.0f,0.0f,0.0f); +		gGL.setColorMask(true, true); -	// get the number of pixels per angle -	F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView()); +		// get the number of pixels per angle +		F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView()); -	//get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing) -	U32 resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512); -	U32 resX = llmin(nhpo2((U32) (atanf(tdim.mV[0]/distance)*2.f*RAD_TO_DEG*pa)), (U32) 512); +		//get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing) +		resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512); +		resX = llmin(nhpo2((U32) (atanf(tdim.mV[0]/distance)*2.f*RAD_TO_DEG*pa)), (U32) 512); -	if (!avatar->mImpostor.isComplete() || resX != avatar->mImpostor.getWidth() || -		resY != avatar->mImpostor.getHeight()) -	{ -		avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,FALSE); +		if (!avatar->mImpostor.isComplete()) +		{ +			LLFastTimer t(FTM_IMPOSTOR_ALLOCATE); +			avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,FALSE); + +			if (LLPipeline::sRenderDeferred) +			{ +				addDeferredAttachments(avatar->mImpostor); +			} -		if (LLPipeline::sRenderDeferred) +			gGL.getTexUnit(0)->bind(&avatar->mImpostor); +			gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); +			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		} +		else if(resX != avatar->mImpostor.getWidth() || +			resY != avatar->mImpostor.getHeight())  		{ -			addDeferredAttachments(avatar->mImpostor); +			LLFastTimer t(FTM_IMPOSTOR_RESIZE); +			avatar->mImpostor.resize(resX,resY,GL_RGBA);  		} -		 -		gGL.getTexUnit(0)->bind(&avatar->mImpostor); -		gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	} -	avatar->mImpostor.bindTarget(); +		avatar->mImpostor.bindTarget(); +	}  	if (LLPipeline::sRenderDeferred)  	{ @@ -9698,6 +9761,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)  	}  	{ //create alpha mask based on depth buffer (grey out if muted) +		LLFastTimer t(FTM_IMPOSTOR_BACKGROUND);  		if (LLPipeline::sRenderDeferred)  		{  			GLuint buff = GL_COLOR_ATTACHMENT0; diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 54a312bd59..c5dfb703e5 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -11,6 +11,10 @@  		 name="unknown">          (unknown)  	</panel.string> +    <panel.string +         name="unknown_multiple"> +        (unknown / multiple) +    </panel.string>  	<panel.string  		 name="public">          (public) | 
