Skip to content

Commit 2c4fe4f

Browse files
#2349: Avatar/animesh rendering correctness pass (#2364)
* #2349: Blinn-Phong avatar/animesh rendering optimization/correctness pass * #2349: General avatar/animesh rendering optimization/correctness pass
1 parent 9b0010b commit 2c4fe4f

File tree

8 files changed

+164
-179
lines changed

8 files changed

+164
-179
lines changed

indra/newview/lldrawpool.cpp

Lines changed: 107 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -407,22 +407,19 @@ void LLRenderPass::renderRiggedGroup(LLSpatialGroup* group, U32 type, bool textu
407407
{
408408
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
409409
LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[type];
410-
LLVOAvatar* lastAvatar = nullptr;
410+
const LLVOAvatar* lastAvatar = nullptr;
411411
U64 lastMeshId = 0;
412+
bool skipLastSkin = false;
412413

413414
for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k)
414415
{
415416
LLDrawInfo* pparams = *k;
416417
if (pparams)
417418
{
418-
if (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo->mHash)
419+
if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin))
419420
{
420-
uploadMatrixPalette(*pparams);
421-
lastAvatar = pparams->mAvatar;
422-
lastMeshId = pparams->mSkinInfo->mHash;
421+
pushBatch(*pparams, texture);
423422
}
424-
425-
pushBatch(*pparams, texture);
426423
}
427424
}
428425
}
@@ -468,23 +465,20 @@ void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures
468465

469466
if (texture)
470467
{
471-
LLVOAvatar* lastAvatar = nullptr;
468+
const LLVOAvatar* lastAvatar = nullptr;
472469
U64 lastMeshId = 0;
470+
bool skipLastSkin = false;
473471
auto* begin = gPipeline.beginRenderMap(type);
474472
auto* end = gPipeline.endRenderMap(type);
475473
for (LLCullResult::drawinfo_iterator i = begin; i != end; )
476474
{
477475
LLDrawInfo* pparams = *i;
478476
LLCullResult::increment_iterator(i, end);
479477

480-
if (pparams->mAvatar.notNull() && (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo->mHash))
478+
if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin))
481479
{
482-
uploadMatrixPalette(*pparams);
483-
lastAvatar = pparams->mAvatar;
484-
lastMeshId = pparams->mSkinInfo->mHash;
480+
pushBatch(*pparams, texture, batch_textures);
485481
}
486-
487-
pushBatch(*pparams, texture, batch_textures);
488482
}
489483
}
490484
else
@@ -496,23 +490,20 @@ void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures
496490
void LLRenderPass::pushUntexturedRiggedBatches(U32 type)
497491
{
498492
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
499-
LLVOAvatar* lastAvatar = nullptr;
493+
const LLVOAvatar* lastAvatar = nullptr;
500494
U64 lastMeshId = 0;
495+
bool skipLastSkin = false;
501496
auto* begin = gPipeline.beginRenderMap(type);
502497
auto* end = gPipeline.endRenderMap(type);
503498
for (LLCullResult::drawinfo_iterator i = begin; i != end; )
504499
{
505500
LLDrawInfo* pparams = *i;
506501
LLCullResult::increment_iterator(i, end);
507502

508-
if (pparams->mAvatar.notNull() && (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo->mHash))
503+
if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin))
509504
{
510-
uploadMatrixPalette(*pparams);
511-
lastAvatar = pparams->mAvatar;
512-
lastMeshId = pparams->mSkinInfo->mHash;
505+
pushUntexturedBatch(*pparams);
513506
}
514-
515-
pushUntexturedBatch(*pparams);
516507
}
517508
}
518509

@@ -533,8 +524,9 @@ void LLRenderPass::pushMaskBatches(U32 type, bool texture, bool batch_textures)
533524
void LLRenderPass::pushRiggedMaskBatches(U32 type, bool texture, bool batch_textures)
534525
{
535526
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
536-
LLVOAvatar* lastAvatar = nullptr;
527+
const LLVOAvatar* lastAvatar = nullptr;
537528
U64 lastMeshId = 0;
529+
bool skipLastSkin = false;
538530
auto* begin = gPipeline.beginRenderMap(type);
539531
auto* end = gPipeline.endRenderMap(type);
540532
for (LLCullResult::drawinfo_iterator i = begin; i != end; )
@@ -545,23 +537,12 @@ void LLRenderPass::pushRiggedMaskBatches(U32 type, bool texture, bool batch_text
545537

546538
llassert(pparams);
547539

548-
if (LLGLSLShader::sCurBoundShaderPtr)
549-
{
550-
LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff);
551-
}
552-
else
553-
{
554-
gGL.flush();
555-
}
540+
LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff);
556541

557-
if (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo->mHash)
542+
if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin))
558543
{
559-
uploadMatrixPalette(*pparams);
560-
lastAvatar = pparams->mAvatar;
561-
lastMeshId = pparams->mSkinInfo->mHash;
544+
pushBatch(*pparams, texture, batch_textures);
562545
}
563-
564-
pushBatch(*pparams, texture, batch_textures);
565546
}
566547
}
567548

@@ -667,6 +648,8 @@ bool LLRenderPass::uploadMatrixPalette(LLDrawInfo& params)
667648
//static
668649
bool LLRenderPass::uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo)
669650
{
651+
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
652+
670653
if (!avatar)
671654
{
672655
return false;
@@ -688,6 +671,81 @@ bool LLRenderPass::uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinI
688671
return true;
689672
}
690673

674+
// Returns true if rendering should proceed
675+
//static
676+
bool LLRenderPass::uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool& skipLastSkin)
677+
{
678+
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
679+
680+
llassert(skinInfo);
681+
llassert(LLGLSLShader::sCurBoundShaderPtr);
682+
683+
if (!avatar)
684+
{
685+
return false;
686+
}
687+
688+
if (avatar == lastAvatar && skinInfo->mHash == lastMeshId)
689+
{
690+
return !skipLastSkin;
691+
}
692+
693+
const LLVOAvatar::MatrixPaletteCache& mpc = avatar->updateSkinInfoMatrixPalette(skinInfo);
694+
U32 count = static_cast<U32>(mpc.mMatrixPalette.size());
695+
// skipLastSkin -> skin info not loaded yet, don't render
696+
skipLastSkin = !bool(count);
697+
lastAvatar = avatar;
698+
lastMeshId = skinInfo->mHash;
699+
700+
if (!skipLastSkin)
701+
{
702+
LLGLSLShader::sCurBoundShaderPtr->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX,
703+
count,
704+
false,
705+
(GLfloat*)&(mpc.mGLMp[0]));
706+
}
707+
708+
return !skipLastSkin;
709+
}
710+
711+
// Returns true if rendering should proceed
712+
//static
713+
bool LLRenderPass::uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo, const LLVOAvatar*& lastAvatar, U64& lastMeshId, const LLGLSLShader*& lastAvatarShader, bool& skipLastSkin)
714+
{
715+
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
716+
717+
llassert(skinInfo);
718+
llassert(LLGLSLShader::sCurBoundShaderPtr);
719+
720+
if (!avatar)
721+
{
722+
return false;
723+
}
724+
725+
if (avatar == lastAvatar && skinInfo->mHash == lastMeshId && lastAvatarShader == LLGLSLShader::sCurBoundShaderPtr)
726+
{
727+
return !skipLastSkin;
728+
}
729+
730+
const LLVOAvatar::MatrixPaletteCache& mpc = avatar->updateSkinInfoMatrixPalette(skinInfo);
731+
U32 count = static_cast<U32>(mpc.mMatrixPalette.size());
732+
// skipLastSkin -> skin info not loaded yet, don't render
733+
skipLastSkin = !bool(count);
734+
lastAvatar = avatar;
735+
lastMeshId = skinInfo->mHash;
736+
lastAvatarShader = LLGLSLShader::sCurBoundShaderPtr;
737+
738+
if (!skipLastSkin)
739+
{
740+
LLGLSLShader::sCurBoundShaderPtr->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX,
741+
count,
742+
false,
743+
(GLfloat*)&(mpc.mGLMp[0]));
744+
}
745+
746+
return !skipLastSkin;
747+
}
748+
691749
void setup_texture_matrix(LLDrawInfo& params)
692750
{
693751
if (params.mTextureMatrix)
@@ -717,7 +775,7 @@ void LLRenderPass::pushGLTFBatches(U32 type, bool textured)
717775
}
718776
else
719777
{
720-
pushRiggedGLTFBatches(type);
778+
pushUntexturedGLTFBatches(type);
721779
}
722780
}
723781

@@ -801,8 +859,9 @@ void LLRenderPass::pushRiggedGLTFBatches(U32 type, bool textured)
801859
void LLRenderPass::pushRiggedGLTFBatches(U32 type)
802860
{
803861
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
804-
LLVOAvatar* lastAvatar = nullptr;
862+
const LLVOAvatar* lastAvatar = nullptr;
805863
U64 lastMeshId = 0;
864+
bool skipLastSkin = false;
806865

807866
auto* begin = gPipeline.beginRenderMap(type);
808867
auto* end = gPipeline.endRenderMap(type);
@@ -812,15 +871,16 @@ void LLRenderPass::pushRiggedGLTFBatches(U32 type)
812871
LLDrawInfo& params = **i;
813872
LLCullResult::increment_iterator(i, end);
814873

815-
pushRiggedGLTFBatch(params, lastAvatar, lastMeshId);
874+
pushRiggedGLTFBatch(params, lastAvatar, lastMeshId, skipLastSkin);
816875
}
817876
}
818877

819878
void LLRenderPass::pushUntexturedRiggedGLTFBatches(U32 type)
820879
{
821880
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
822-
LLVOAvatar* lastAvatar = nullptr;
881+
const LLVOAvatar* lastAvatar = nullptr;
823882
U64 lastMeshId = 0;
883+
bool skipLastSkin = false;
824884

825885
auto* begin = gPipeline.beginRenderMap(type);
826886
auto* end = gPipeline.endRenderMap(type);
@@ -830,34 +890,26 @@ void LLRenderPass::pushUntexturedRiggedGLTFBatches(U32 type)
830890
LLDrawInfo& params = **i;
831891
LLCullResult::increment_iterator(i, end);
832892

833-
pushUntexturedRiggedGLTFBatch(params, lastAvatar, lastMeshId);
893+
pushUntexturedRiggedGLTFBatch(params, lastAvatar, lastMeshId, skipLastSkin);
834894
}
835895
}
836896

837897

838898
// static
839-
void LLRenderPass::pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId)
899+
void LLRenderPass::pushRiggedGLTFBatch(LLDrawInfo& params, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool& skipLastSkin)
840900
{
841-
if (params.mAvatar.notNull() && (lastAvatar != params.mAvatar || lastMeshId != params.mSkinInfo->mHash))
901+
if (uploadMatrixPalette(params.mAvatar, params.mSkinInfo, lastAvatar, lastMeshId, skipLastSkin))
842902
{
843-
uploadMatrixPalette(params);
844-
lastAvatar = params.mAvatar;
845-
lastMeshId = params.mSkinInfo->mHash;
903+
pushGLTFBatch(params);
846904
}
847-
848-
pushGLTFBatch(params);
849905
}
850906

851907
// static
852-
void LLRenderPass::pushUntexturedRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId)
908+
void LLRenderPass::pushUntexturedRiggedGLTFBatch(LLDrawInfo& params, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool& skipLastSkin)
853909
{
854-
if (params.mAvatar.notNull() && (lastAvatar != params.mAvatar || lastMeshId != params.mSkinInfo->mHash))
910+
if (uploadMatrixPalette(params.mAvatar, params.mSkinInfo, lastAvatar, lastMeshId, skipLastSkin))
855911
{
856-
uploadMatrixPalette(params);
857-
lastAvatar = params.mAvatar;
858-
lastMeshId = params.mSkinInfo->mHash;
912+
pushUntexturedGLTFBatch(params);
859913
}
860-
861-
pushUntexturedGLTFBatch(params);
862914
}
863915

indra/newview/lldrawpool.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class LLViewerFetchedTexture;
3838
class LLSpatialGroup;
3939
class LLDrawInfo;
4040
class LLVOAvatar;
41+
class LLGLSLShader;
4142
class LLMeshSkinInfo;
4243

4344
class LLDrawPool
@@ -375,9 +376,9 @@ class LLRenderPass : public LLDrawPool
375376

376377
// push a single GLTF draw call
377378
static void pushGLTFBatch(LLDrawInfo& params);
378-
static void pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId);
379+
static void pushRiggedGLTFBatch(LLDrawInfo& params, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool& skipLastSkin);
379380
static void pushUntexturedGLTFBatch(LLDrawInfo& params);
380-
static void pushUntexturedRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId);
381+
static void pushUntexturedRiggedGLTFBatch(LLDrawInfo& params, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool& skipLastSkin);
381382

382383
void pushMaskBatches(U32 type, bool texture = true, bool batch_textures = false);
383384
void pushRiggedMaskBatches(U32 type, bool texture = true, bool batch_textures = false);
@@ -386,6 +387,8 @@ class LLRenderPass : public LLDrawPool
386387
void pushBumpBatch(LLDrawInfo& params, bool texture, bool batch_textures = false);
387388
static bool uploadMatrixPalette(LLDrawInfo& params);
388389
static bool uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo);
390+
static bool uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool& skipLastSkin);
391+
static bool uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo, const LLVOAvatar*& lastAvatar, U64& lastMeshId, const LLGLSLShader*& lastAvatarShader, bool& skipLastSkin);
389392
virtual void renderGroup(LLSpatialGroup* group, U32 type, bool texture = true);
390393
virtual void renderRiggedGroup(LLSpatialGroup* group, U32 type, bool texture = true);
391394
};

0 commit comments

Comments
 (0)