diff options
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 48 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 75 | ||||
| -rw-r--r-- | indra/newview/llviewertexture.cpp | 17 | ||||
| -rw-r--r-- | indra/newview/llviewertexture.h | 12 | ||||
| -rw-r--r-- | indra/newview/pipeline.h | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/menu_viewer.xml | 46 | 
6 files changed, 198 insertions, 1 deletions
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 5d196a465f..5ef71fe6d9 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3647,6 +3647,47 @@ void renderShadowFrusta(LLDrawInfo* params)  	gGL.setSceneBlendType(LLRender::BT_ALPHA);  } +void renderTexelDensity(LLDrawInfo* params) +{ +	LLGLEnable _(GL_BLEND); +	if (LLViewerTexture::sDebugTexelsMode == LLViewerTexture::DEBUG_TEXELS_OFF +		|| LLViewerTexture::sCheckerBoardImagep.isNull()) +	{ +		return; +	} +	LLViewerTexture* texturep = params->mTexture.get(); +	LLMatrix4 checkboard_matrix; +	S32 discard_level = -1; +	switch(LLViewerTexture::sDebugTexelsMode) +	{ +	case LLViewerTexture::DEBUG_TEXELS_CURRENT: +		discard_level = -1; +		break; +	case LLViewerTexture::DEBUG_TEXELS_DESIRED: +		{ +			LLViewerFetchedTexture* fetched_texturep = dynamic_cast<LLViewerFetchedTexture*>(texturep); +			discard_level = fetched_texturep ? fetched_texturep->getDesiredDiscardLevel() : -1; +			break; +		} +	default: +	case LLViewerTexture::DEBUG_TEXELS_FULL: +		discard_level = 0; +		break; +	} + +	checkboard_matrix.initScale(LLVector3(texturep->getWidth(discard_level) / 8, texturep->getHeight(discard_level) / 8, 1.f)); +	gGL.getTexUnit(0)->activate(); +	gGL.matrixMode(LLRender::MM_TEXTURE); +	gGL.loadMatrix((GLfloat*) checkboard_matrix.mMatrix); + +	gGL.getTexUnit(0)->bind(LLViewerTexture::sCheckerBoardImagep, TRUE); + +	pushVerts(params, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); + +	gGL.loadIdentity(); +	gGL.matrixMode(LLRender::MM_MODELVIEW); +} +  void renderLights(LLDrawable* drawablep)  { @@ -4097,6 +4138,10 @@ public:  				{  					renderShadowFrusta(draw_info);  				} +				if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY)) +				{ +					renderTexelDensity(draw_info); +				}  			}  		}  	} @@ -4291,7 +4336,8 @@ void LLSpatialPartition::renderDebug()  									  LLPipeline::RENDER_DEBUG_AGENT_TARGET |  									  //LLPipeline::RENDER_DEBUG_BUILD_QUEUE |  									  LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA | -									  LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY))  +									  LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY | +									  LLPipeline::RENDER_DEBUG_TEXEL_DENSITY))   	{  		return;  	} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 301b78ad4e..7bdfd6df1d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -845,6 +845,73 @@ class LLAdvancedCheckFeature : public view_listener_t  }  }; +class LLAdvancedCheckDisplayTextureDensity : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string mode = userdata.asString(); +		if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY)) +		{ +			return mode == "none"; +		} +		if (mode == "current") +		{ +			return LLViewerTexture::sDebugTexelsMode == LLViewerTexture::DEBUG_TEXELS_CURRENT; +		} +		else if (mode == "desired") +		{ +			return LLViewerTexture::sDebugTexelsMode == LLViewerTexture::DEBUG_TEXELS_DESIRED; +		} +		else if (mode == "full") +		{ +			return LLViewerTexture::sDebugTexelsMode == LLViewerTexture::DEBUG_TEXELS_FULL; +		} +		return false; +	} +}; + +class LLAdvancedSetDisplayTextureDensity : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string mode = userdata.asString(); +		if (mode == "none") +		{ +			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == TRUE)  +			{ +				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY); +			} +			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_OFF; +		} +		else if (mode == "current") +		{ +			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == FALSE)  +			{ +				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY); +			} +			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_CURRENT; +		} +		else if (mode == "desired") +		{ +			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == FALSE)  +			{ +				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY); +			} +			gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY, true); +			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_DESIRED; +		} +		else if (mode == "full") +		{ +			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == FALSE)  +			{ +				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY); +			} +			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_FULL; +		} +		return true; +	} +}; +  //////////////////  // INFO DISPLAY // @@ -959,6 +1026,10 @@ U32 info_display_from_string(std::string info_display)  	{  		return LLPipeline::RENDER_DEBUG_WIND_VECTORS;  	} +	else if ("texel density" == info_display) +	{ +		return LLPipeline::RENDER_DEBUG_TEXEL_DENSITY; +	}  	else  	{  		return 0; @@ -8104,6 +8175,10 @@ void initialize_menus()  	//// Advanced > Render > Features  	view_listener_t::addMenu(new LLAdvancedToggleFeature(), "Advanced.ToggleFeature");  	view_listener_t::addMenu(new LLAdvancedCheckFeature(), "Advanced.CheckFeature"); + +	view_listener_t::addMenu(new LLAdvancedCheckDisplayTextureDensity(), "Advanced.CheckDisplayTextureDensity"); +	view_listener_t::addMenu(new LLAdvancedSetDisplayTextureDensity(), "Advanced.SetDisplayTextureDensity"); +  	// Advanced > Render > Info Displays  	view_listener_t::addMenu(new LLAdvancedToggleInfoDisplay(), "Advanced.ToggleInfoDisplay");  	view_listener_t::addMenu(new LLAdvancedCheckInfoDisplay(), "Advanced.CheckInfoDisplay"); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 0360a8faf0..2efc9ad4d0 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -67,6 +67,7 @@  // statics  LLPointer<LLViewerTexture>        LLViewerTexture::sNullImagep = NULL;  LLPointer<LLViewerTexture>        LLViewerTexture::sBlackImagep = NULL; +LLPointer<LLViewerTexture>        LLViewerTexture::sCheckerBoardImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL; @@ -96,6 +97,7 @@ S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA ;  BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE ;  F32 LLViewerTexture::sCurrentTime = 0.0f ;  BOOL LLViewerTexture::sUseTextureAtlas        = FALSE ; +LLViewerTexture::EDebugTexels LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_OFF;  const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve image quality by  const F32 desired_discard_bias_max = (F32)MAX_DISCARD_LEVEL; // max number of levels to reduce image quality by @@ -347,6 +349,21 @@ void LLViewerTextureManager::init()   	LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLViewerTexture::BOOST_UI);  	LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ; +	image_raw = new LLImageRaw(32,32,3); +	data = image_raw->getData(); + +	for (S32 i = 0; i < (32*32*3); i+=3) +	{ +		S32 x = (i % (32*3)) / (3*16); +		S32 y = i / (32*3*16); +		U8 color = ((x + y) % 2) * 255; +		data[i] = color; +		data[i+1] = color; +		data[i+2] = color; +	} + +	LLViewerTexture::sCheckerBoardImagep = LLViewerTextureManager::getLocalTexture(image_raw.get(), TRUE); +  	LLViewerTexture::initClass() ;  	if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName)) diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index b96441127d..99053a8ccc 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -139,6 +139,7 @@ public:  		OTHER,  		MAX_GL_IMAGE_CATEGORY  	}; +  	static S32 getTotalNumOfCategories() ;  	static S32 getIndexFromCategory(S32 category) ;  	static S32 getCategoryFromIndex(S32 index) ; @@ -330,8 +331,19 @@ public:  	static F32  sCurrentTime ;  	static BOOL sUseTextureAtlas ; +	enum EDebugTexels +	{ +		DEBUG_TEXELS_OFF, +		DEBUG_TEXELS_CURRENT, +		DEBUG_TEXELS_DESIRED, +		DEBUG_TEXELS_FULL +	}; + +	static EDebugTexels sDebugTexelsMode; +  	static LLPointer<LLViewerTexture> sNullImagep; // Null texture for non-textured objects.  	static LLPointer<LLViewerTexture> sBlackImagep;	// Texture to show NOTHING (pure black) +	static LLPointer<LLViewerTexture> sCheckerBoardImagep;	// Texture to show NOTHING (pure black)  }; diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 9c78048c46..670a23ef14 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -461,6 +461,7 @@ public:  		RENDER_DEBUG_LOD_INFO	        = 0x04000000,  		RENDER_DEBUG_RENDER_COMPLEXITY  = 0x08000000,  		RENDER_DEBUG_ATTACHMENT_BYTES	= 0x10000000, +		RENDER_DEBUG_TEXEL_DENSITY		= 0x20000000  	};  public: diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 7422b61f1a..578afc2de5 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2410,6 +2410,52 @@             function="Advanced.ToggleInfoDisplay"             parameter="sculpt" />  		</menu_item_check> +       <menu +         create_jump_keys="true" +         label="Display Texture Density" +         name="Display Texture Density" +         tear_off="true"> +          <menu_item_check +           label="None" +           name="None"> +            <menu_item_check.on_check +             function="Advanced.CheckDisplayTextureDensity" +             parameter="none" /> +            <menu_item_check.on_click +             function="Advanced.SetDisplayTextureDensity" +             parameter="none" /> +          </menu_item_check> +          <menu_item_check +           label="Current" +           name="Current"> +            <menu_item_check.on_check +             function="Advanced.CheckDisplayTextureDensity" +             parameter="current" /> +            <menu_item_check.on_click +             function="Advanced.SetDisplayTextureDensity" +             parameter="current" /> +          </menu_item_check> +          <menu_item_check +           label="Desired" +           name="Desired"> +            <menu_item_check.on_check +             function="Advanced.CheckDisplayTextureDensity" +             parameter="desired" /> +            <menu_item_check.on_click +             function="Advanced.SetDisplayTextureDensity" +             parameter="desired" /> +          </menu_item_check> +          <menu_item_check +           label="Full" +           name="Full"> +            <menu_item_check.on_check +             function="Advanced.CheckDisplayTextureDensity" +             parameter="full" /> +            <menu_item_check.on_click +             function="Advanced.SetDisplayTextureDensity" +             parameter="full" /> +          </menu_item_check> +        </menu>        </menu>          <menu           create_jump_keys="true"  | 
