@@ -407,22 +407,19 @@ void LLRenderPass::renderRiggedGroup(LLSpatialGroup* group, U32 type, bool textu
407
407
{
408
408
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
409
409
LLSpatialGroup::drawmap_elem_t & draw_info = group->mDrawMap [type];
410
- LLVOAvatar* lastAvatar = nullptr ;
410
+ const LLVOAvatar* lastAvatar = nullptr ;
411
411
U64 lastMeshId = 0 ;
412
+ bool skipLastSkin = false ;
412
413
413
414
for (LLSpatialGroup::drawmap_elem_t ::iterator k = draw_info.begin (); k != draw_info.end (); ++k)
414
415
{
415
416
LLDrawInfo* pparams = *k;
416
417
if (pparams)
417
418
{
418
- if (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo -> mHash )
419
+ if (uploadMatrixPalette ( pparams->mAvatar , pparams->mSkinInfo , lastAvatar, lastMeshId, skipLastSkin) )
419
420
{
420
- uploadMatrixPalette (*pparams);
421
- lastAvatar = pparams->mAvatar ;
422
- lastMeshId = pparams->mSkinInfo ->mHash ;
421
+ pushBatch (*pparams, texture);
423
422
}
424
-
425
- pushBatch (*pparams, texture);
426
423
}
427
424
}
428
425
}
@@ -468,23 +465,20 @@ void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures
468
465
469
466
if (texture)
470
467
{
471
- LLVOAvatar* lastAvatar = nullptr ;
468
+ const LLVOAvatar* lastAvatar = nullptr ;
472
469
U64 lastMeshId = 0 ;
470
+ bool skipLastSkin = false ;
473
471
auto * begin = gPipeline .beginRenderMap (type);
474
472
auto * end = gPipeline .endRenderMap (type);
475
473
for (LLCullResult::drawinfo_iterator i = begin; i != end; )
476
474
{
477
475
LLDrawInfo* pparams = *i;
478
476
LLCullResult::increment_iterator (i, end);
479
477
480
- if (pparams->mAvatar . notNull () && (lastAvatar != pparams->mAvatar || lastMeshId != pparams-> mSkinInfo -> mHash ))
478
+ if (uploadMatrixPalette ( pparams->mAvatar , pparams->mSkinInfo , lastAvatar, lastMeshId, skipLastSkin ))
481
479
{
482
- uploadMatrixPalette (*pparams);
483
- lastAvatar = pparams->mAvatar ;
484
- lastMeshId = pparams->mSkinInfo ->mHash ;
480
+ pushBatch (*pparams, texture, batch_textures);
485
481
}
486
-
487
- pushBatch (*pparams, texture, batch_textures);
488
482
}
489
483
}
490
484
else
@@ -496,23 +490,20 @@ void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures
496
490
void LLRenderPass::pushUntexturedRiggedBatches (U32 type)
497
491
{
498
492
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
499
- LLVOAvatar* lastAvatar = nullptr ;
493
+ const LLVOAvatar* lastAvatar = nullptr ;
500
494
U64 lastMeshId = 0 ;
495
+ bool skipLastSkin = false ;
501
496
auto * begin = gPipeline .beginRenderMap (type);
502
497
auto * end = gPipeline .endRenderMap (type);
503
498
for (LLCullResult::drawinfo_iterator i = begin; i != end; )
504
499
{
505
500
LLDrawInfo* pparams = *i;
506
501
LLCullResult::increment_iterator (i, end);
507
502
508
- if (pparams->mAvatar . notNull () && (lastAvatar != pparams->mAvatar || lastMeshId != pparams-> mSkinInfo -> mHash ))
503
+ if (uploadMatrixPalette ( pparams->mAvatar , pparams->mSkinInfo , lastAvatar, lastMeshId, skipLastSkin ))
509
504
{
510
- uploadMatrixPalette (*pparams);
511
- lastAvatar = pparams->mAvatar ;
512
- lastMeshId = pparams->mSkinInfo ->mHash ;
505
+ pushUntexturedBatch (*pparams);
513
506
}
514
-
515
- pushUntexturedBatch (*pparams);
516
507
}
517
508
}
518
509
@@ -533,8 +524,9 @@ void LLRenderPass::pushMaskBatches(U32 type, bool texture, bool batch_textures)
533
524
void LLRenderPass::pushRiggedMaskBatches (U32 type, bool texture, bool batch_textures)
534
525
{
535
526
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
536
- LLVOAvatar* lastAvatar = nullptr ;
527
+ const LLVOAvatar* lastAvatar = nullptr ;
537
528
U64 lastMeshId = 0 ;
529
+ bool skipLastSkin = false ;
538
530
auto * begin = gPipeline .beginRenderMap (type);
539
531
auto * end = gPipeline .endRenderMap (type);
540
532
for (LLCullResult::drawinfo_iterator i = begin; i != end; )
@@ -545,23 +537,12 @@ void LLRenderPass::pushRiggedMaskBatches(U32 type, bool texture, bool batch_text
545
537
546
538
llassert (pparams);
547
539
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 );
556
541
557
- if (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo -> mHash )
542
+ if (uploadMatrixPalette ( pparams->mAvatar , pparams->mSkinInfo , lastAvatar, lastMeshId, skipLastSkin) )
558
543
{
559
- uploadMatrixPalette (*pparams);
560
- lastAvatar = pparams->mAvatar ;
561
- lastMeshId = pparams->mSkinInfo ->mHash ;
544
+ pushBatch (*pparams, texture, batch_textures);
562
545
}
563
-
564
- pushBatch (*pparams, texture, batch_textures);
565
546
}
566
547
}
567
548
@@ -667,6 +648,8 @@ bool LLRenderPass::uploadMatrixPalette(LLDrawInfo& params)
667
648
// static
668
649
bool LLRenderPass::uploadMatrixPalette (LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo)
669
650
{
651
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
652
+
670
653
if (!avatar)
671
654
{
672
655
return false ;
@@ -688,6 +671,81 @@ bool LLRenderPass::uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinI
688
671
return true ;
689
672
}
690
673
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
+
691
749
void setup_texture_matrix (LLDrawInfo& params)
692
750
{
693
751
if (params.mTextureMatrix )
@@ -717,7 +775,7 @@ void LLRenderPass::pushGLTFBatches(U32 type, bool textured)
717
775
}
718
776
else
719
777
{
720
- pushRiggedGLTFBatches (type);
778
+ pushUntexturedGLTFBatches (type);
721
779
}
722
780
}
723
781
@@ -801,8 +859,9 @@ void LLRenderPass::pushRiggedGLTFBatches(U32 type, bool textured)
801
859
void LLRenderPass::pushRiggedGLTFBatches (U32 type)
802
860
{
803
861
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
804
- LLVOAvatar* lastAvatar = nullptr ;
862
+ const LLVOAvatar* lastAvatar = nullptr ;
805
863
U64 lastMeshId = 0 ;
864
+ bool skipLastSkin = false ;
806
865
807
866
auto * begin = gPipeline .beginRenderMap (type);
808
867
auto * end = gPipeline .endRenderMap (type);
@@ -812,15 +871,16 @@ void LLRenderPass::pushRiggedGLTFBatches(U32 type)
812
871
LLDrawInfo& params = **i;
813
872
LLCullResult::increment_iterator (i, end);
814
873
815
- pushRiggedGLTFBatch (params, lastAvatar, lastMeshId);
874
+ pushRiggedGLTFBatch (params, lastAvatar, lastMeshId, skipLastSkin );
816
875
}
817
876
}
818
877
819
878
void LLRenderPass::pushUntexturedRiggedGLTFBatches (U32 type)
820
879
{
821
880
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
822
- LLVOAvatar* lastAvatar = nullptr ;
881
+ const LLVOAvatar* lastAvatar = nullptr ;
823
882
U64 lastMeshId = 0 ;
883
+ bool skipLastSkin = false ;
824
884
825
885
auto * begin = gPipeline .beginRenderMap (type);
826
886
auto * end = gPipeline .endRenderMap (type);
@@ -830,34 +890,26 @@ void LLRenderPass::pushUntexturedRiggedGLTFBatches(U32 type)
830
890
LLDrawInfo& params = **i;
831
891
LLCullResult::increment_iterator (i, end);
832
892
833
- pushUntexturedRiggedGLTFBatch (params, lastAvatar, lastMeshId);
893
+ pushUntexturedRiggedGLTFBatch (params, lastAvatar, lastMeshId, skipLastSkin );
834
894
}
835
895
}
836
896
837
897
838
898
// static
839
- void LLRenderPass::pushRiggedGLTFBatch (LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId)
899
+ void LLRenderPass::pushRiggedGLTFBatch (LLDrawInfo& params, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool & skipLastSkin )
840
900
{
841
- if (params.mAvatar . notNull () && (lastAvatar != params.mAvatar || lastMeshId != params. mSkinInfo -> mHash ))
901
+ if (uploadMatrixPalette ( params.mAvatar , params.mSkinInfo , lastAvatar, lastMeshId, skipLastSkin ))
842
902
{
843
- uploadMatrixPalette (params);
844
- lastAvatar = params.mAvatar ;
845
- lastMeshId = params.mSkinInfo ->mHash ;
903
+ pushGLTFBatch (params);
846
904
}
847
-
848
- pushGLTFBatch (params);
849
905
}
850
906
851
907
// static
852
- void LLRenderPass::pushUntexturedRiggedGLTFBatch (LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId)
908
+ void LLRenderPass::pushUntexturedRiggedGLTFBatch (LLDrawInfo& params, const LLVOAvatar*& lastAvatar, U64& lastMeshId, bool & skipLastSkin )
853
909
{
854
- if (params.mAvatar . notNull () && (lastAvatar != params.mAvatar || lastMeshId != params. mSkinInfo -> mHash ))
910
+ if (uploadMatrixPalette ( params.mAvatar , params.mSkinInfo , lastAvatar, lastMeshId, skipLastSkin ))
855
911
{
856
- uploadMatrixPalette (params);
857
- lastAvatar = params.mAvatar ;
858
- lastMeshId = params.mSkinInfo ->mHash ;
912
+ pushUntexturedGLTFBatch (params);
859
913
}
860
-
861
- pushUntexturedGLTFBatch (params);
862
914
}
863
915
0 commit comments