Richard Linden 2012-03-20 17:05:52 -07:00
commit 51f89c8def
6 changed files with 198 additions and 1 deletions

View File

@ -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;
}

View File

@ -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");

View File

@ -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))

View File

@ -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)
};

View File

@ -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:

View File

@ -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"