From 1fb1ba05cea75f10c8a7a1f6d30abaa07b5fbf65 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 12 Sep 2011 15:30:42 -0500 Subject: [PATCH] Optimization. Skip binding for rigged face types that have no faces to display. --- indra/newview/lldrawpoolavatar.cpp | 44 ++++++++++++++++++++++++++++-- indra/newview/lldrawpoolavatar.h | 8 ++++-- indra/newview/llface.cpp | 7 +++-- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 594b09456..a43169547 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -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: diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 75974fdc7..30fcf3794 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -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; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 9c64214c0..4a57b390e 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -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));