Optimization. Skip binding for rigged face types that have no faces to display.

This commit is contained in:
Shyotl
2011-09-12 15:30:42 -05:00
parent 3ba4861a3b
commit 1fb1ba05ce
3 changed files with 51 additions and 8 deletions

View File

@@ -69,6 +69,7 @@ S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
#if MESH_ENABLED
static bool is_deferred_render = false;
static bool is_skipped_pass = false;
#endif //MESH_ENABLED
extern BOOL gUseGLPick;
@@ -162,9 +163,6 @@ LLMatrix4& LLDrawPoolAvatar::getModelView()
//-----------------------------------------------------------------------------
// render()
//-----------------------------------------------------------------------------
void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
{
sSkipTransparent = TRUE;
@@ -177,6 +175,12 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
pass += 2;
}
if(pass >= 3 && mRiggedFace[pass + 4].empty())
{
is_skipped_pass = true;
return;
}
switch (pass)
{
case 0:
@@ -212,6 +216,12 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
pass += 2;
}
if(is_skipped_pass)
{
is_skipped_pass = false;
return;
}
switch (pass)
{
case 0:
@@ -251,6 +261,12 @@ S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
{
if(pass >= 1 && mRiggedFace[pass + (S32)(pass != 1)].empty())
{
is_skipped_pass = true;
return;
}
switch (pass)
{
case 0:
@@ -310,6 +326,12 @@ void LLDrawPoolAvatar::endDeferredRiggedAlpha()
#endif //MESH_ENABLED
void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
{
if(is_skipped_pass)
{
is_skipped_pass = false;
return;
}
switch (pass)
{
case 0:
@@ -518,9 +540,13 @@ S32 LLDrawPoolAvatar::getNumDeferredPasses()
#endif //!MESH_ENABLED
}
void LLDrawPoolAvatar::render(S32 pass)
{
LLFastTimer t(LLFastTimer::FTM_RENDER_CHARACTERS);
if(is_skipped_pass)
return;
if (LLPipeline::sImpostorRender)
{
renderAvatars(NULL, pass+2);
@@ -546,6 +572,12 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
pass += 2;
}
if(pass >= 3 && mRiggedFace[pass - 3].empty())
{
is_skipped_pass = true;
return;
}
switch (pass)
{
case 0:
@@ -592,6 +624,12 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
pass += 2;
}
if(is_skipped_pass)
{
is_skipped_pass = false;
return;
}
switch (pass)
{
case 0:

View File

@@ -153,18 +153,20 @@ public:
void renderDeferredRiggedSimple(LLVOAvatar* avatar);
void renderDeferredRiggedBump(LLVOAvatar* avatar);
//do NOT screw the the order of these. They are ordered in a way such that they cleanly align with render passes in drawpoolavatar.
typedef enum
{
RIGGED_SIMPLE = 0,
RIGGED_FULLBRIGHT,
RIGGED_SHINY,
RIGGED_FULLBRIGHT_SHINY,
RIGGED_GLOW,
//RIGGED_GLOW,
RIGGED_ALPHA,
RIGGED_FULLBRIGHT_ALPHA,
RIGGED_DEFERRED_BUMP,
RIGGED_GLOW,
//RIGGED_DEFERRED_BUMP,
RIGGED_DEFERRED_SIMPLE,
RIGGED_DEFERRED_BUMP,
NUM_RIGGED_PASSES,
RIGGED_UNKNOWN,
} eRiggedPass;

View File

@@ -2064,6 +2064,7 @@ void LLFace::clearVertexBuffer()
#if MESH_ENABLED
//static
//do NOT screw the the order of these. Must match order of LLDrawPoolAvatar::eRiggedPass. Order differs from LL's.
U32 LLFace::getRiggedDataMask(U32 type)
{
static const U32 rigged_data_mask[] = {
@@ -2071,11 +2072,13 @@ U32 LLFace::getRiggedDataMask(U32 type)
LLDrawPoolAvatar::RIGGED_FULLBRIGHT_MASK,
LLDrawPoolAvatar::RIGGED_SHINY_MASK,
LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY_MASK,
LLDrawPoolAvatar::RIGGED_GLOW_MASK,
//LLDrawPoolAvatar::RIGGED_GLOW_MASK,
LLDrawPoolAvatar::RIGGED_ALPHA_MASK,
LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA_MASK,
LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP_MASK,
LLDrawPoolAvatar::RIGGED_GLOW_MASK,
//LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP_MASK,
LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE_MASK,
LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP_MASK,
};
llassert(type < sizeof(rigged_data_mask)/sizeof(U32));