@@ -597,8 +597,8 @@ private void PostPostLateUpdate()
597597 ProcessRenderers ( rendererData , unsupportedRenderers . AsArray ( ) ) ;
598598 Profiler . EndSample ( ) ;
599599
600- Profiler . BeginSample ( "GPUResidentDrawer.ProcessRendererMaterialChanges " ) ;
601- ProcessRendererMaterialChanges ( rendererData . changedID , supportedChangedMaterials . AsArray ( ) , supportedChangedPackedMaterialDatas . AsArray ( ) ) ;
600+ Profiler . BeginSample ( "GPUResidentDrawer.ProcessRendererMaterialAndMeshChanges " ) ;
601+ ProcessRendererMaterialAndMeshChanges ( rendererData . changedID , supportedChangedMaterials . AsArray ( ) , supportedChangedPackedMaterialDatas . AsArray ( ) , meshDataSorted . changedID ) ;
602602 Profiler . EndSample ( ) ;
603603
604604 lodGroupTransformData . Dispose ( ) ;
@@ -655,9 +655,9 @@ private void ProcessLODGroups(NativeArray<int> changedID, NativeArray<int> destr
655655 m_BatchersContext . TransformLODGroups ( transformedID ) ;
656656 }
657657
658- private void ProcessRendererMaterialChanges ( NativeArray < int > excludedRenderers , NativeArray < int > changedMaterials , NativeArray < GPUDrivenPackedMaterialData > changedPackedMaterialDatas )
658+ private void ProcessRendererMaterialAndMeshChanges ( NativeArray < int > excludedRenderers , NativeArray < int > changedMaterials , NativeArray < GPUDrivenPackedMaterialData > changedPackedMaterialDatas , NativeArray < int > changedMeshes )
659659 {
660- if ( changedMaterials . Length == 0 )
660+ if ( changedMaterials . Length == 0 && changedMeshes . Length == 0 )
661661 return ;
662662
663663 Profiler . BeginSample ( "GPUResidentDrawer.GetMaterialsWithChangedPackedMaterial" ) ;
@@ -669,7 +669,7 @@ private void ProcessRendererMaterialChanges(NativeArray<int> excludedRenderers,
669669
670670 Profiler . EndSample ( ) ;
671671
672- if ( filteredMaterials . Count == 0 )
672+ if ( filteredMaterials . Count == 0 && changedMeshes . Length == 0 )
673673 {
674674 filteredMaterials . Dispose ( ) ;
675675 updatePackedMaterialCacheJob . Complete ( ) ;
@@ -679,37 +679,51 @@ private void ProcessRendererMaterialChanges(NativeArray<int> excludedRenderers,
679679 var sortedExcludedRenderers = new NativeArray < int > ( excludedRenderers , Allocator . TempJob ) ;
680680 if ( sortedExcludedRenderers . Length > 0 )
681681 {
682- Profiler . BeginSample ( "ProcessRendererMaterialChanges .Sort" ) ;
682+ Profiler . BeginSample ( "ProcessRendererMaterialAndMeshChanges .Sort" ) ;
683683 sortedExcludedRenderers . ParallelSort ( ) . Complete ( ) ;
684684 Profiler . EndSample ( ) ;
685685 }
686686
687- Profiler . BeginSample ( "GPUResidentDrawer.FindRenderersFromMaterials " ) ;
687+ Profiler . BeginSample ( "GPUResidentDrawer.FindRenderersFromMaterialsOrMeshes " ) ;
688688
689- NativeList < int > renderersWithChangedMaterials = FindRenderersFromMaterials ( sortedExcludedRenderers , filteredMaterials , Allocator . TempJob ) ;
689+ var ( renderersWithChangedMaterials , renderersWithChangedMeshes ) = FindRenderersFromMaterialsOrMeshes ( sortedExcludedRenderers , filteredMaterials , changedMeshes , Allocator . TempJob ) ;
690690 filteredMaterials . Dispose ( ) ;
691691
692692 Profiler . EndSample ( ) ;
693693
694694 sortedExcludedRenderers . Dispose ( ) ;
695695 updatePackedMaterialCacheJob . Complete ( ) ;
696696
697- if ( renderersWithChangedMaterials . Length == 0 )
697+ if ( renderersWithChangedMaterials . Length == 0 && renderersWithChangedMeshes . Length == 0 )
698698 {
699699 renderersWithChangedMaterials . Dispose ( ) ;
700+ renderersWithChangedMeshes . Dispose ( ) ;
700701 return ;
701702 }
702703
703704 Profiler . BeginSample ( "GPUResidentDrawer.UpdateRenderers" ) ;
704705 {
705- var materialChangedInstances = new NativeArray < InstanceHandle > ( renderersWithChangedMaterials . Length , Allocator . TempJob , NativeArrayOptions . UninitializedMemory ) ;
706- ScheduleQueryRendererGroupInstancesJob ( renderersWithChangedMaterials . AsArray ( ) , materialChangedInstances ) . Complete ( ) ;
706+ var changedMaterialsCount = renderersWithChangedMaterials . Length ;
707+ var changedMeshesCount = renderersWithChangedMeshes . Length ;
708+ var totalCount = changedMaterialsCount + changedMeshesCount ;
707709
708- m_Batcher . DestroyDrawInstances ( materialChangedInstances ) ;
709- materialChangedInstances . Dispose ( ) ;
710+
711+ var changedInstances = new NativeArray < InstanceHandle > ( totalCount , Allocator . TempJob , NativeArrayOptions . UninitializedMemory ) ;
712+ var changedRenderers = new NativeArray < int > ( totalCount , Allocator . TempJob , NativeArrayOptions . UninitializedMemory ) ;
713+
714+ NativeArray < int > . Copy ( renderersWithChangedMaterials . AsArray ( ) , changedRenderers , changedMaterialsCount ) ;
715+ NativeArray < int > . Copy ( renderersWithChangedMeshes . AsArray ( ) , changedRenderers . GetSubArray ( changedMaterialsCount , changedMeshesCount ) , changedMeshesCount ) ;
716+
717+ ScheduleQueryRendererGroupInstancesJob ( changedRenderers , changedInstances ) . Complete ( ) ;
718+
719+ m_Batcher . DestroyDrawInstances ( changedInstances ) ;
710720 m_Batcher . UpdateRenderers ( renderersWithChangedMaterials . AsArray ( ) , true ) ;
721+ m_Batcher . UpdateRenderers ( renderersWithChangedMeshes . AsArray ( ) , false ) ;
711722
723+ changedInstances . Dispose ( ) ;
724+ changedRenderers . Dispose ( ) ;
712725 renderersWithChangedMaterials . Dispose ( ) ;
726+ renderersWithChangedMeshes . Dispose ( ) ;
713727 }
714728 Profiler . EndSample ( ) ;
715729 }
@@ -858,22 +872,26 @@ private NativeHashSet<int> GetMaterialsWithChangedPackedMaterial(NativeArray<int
858872 return filteredMaterials ;
859873 }
860874
861- private NativeList < int > FindRenderersFromMaterials ( NativeArray < int > sortedExcludeRenderers , NativeHashSet < int > materials , Allocator rendererListAllocator )
875+ private ( NativeList < int > renderersWithMaterials , NativeList < int > renderersWithMeshes ) FindRenderersFromMaterialsOrMeshes ( NativeArray < int > sortedExcludeRenderers , NativeHashSet < int > materials , NativeArray < int > meshes , Allocator rendererListAllocator )
862876 {
863877 var sharedInstanceData = m_BatchersContext . sharedInstanceData ;
864- NativeList < int > renderers = new NativeList < int > ( sharedInstanceData . rendererGroupIDs . Length , rendererListAllocator ) ;
878+ NativeList < int > renderersWithMaterials = new NativeList < int > ( sharedInstanceData . rendererGroupIDs . Length , rendererListAllocator ) ;
879+ NativeList < int > renderersWithMeshes = new NativeList < int > ( sharedInstanceData . rendererGroupIDs . Length , rendererListAllocator ) ;
865880
866- var jobHandle = new FindRenderersFromMaterialJob
881+ var jobHandle = new FindRenderersFromMaterialOrMeshJob
867882 {
868883 materialIDs = materials . AsReadOnly ( ) ,
869884 materialIDArrays = sharedInstanceData . materialIDArrays ,
885+ meshIDs = meshes . AsReadOnly ( ) ,
886+ meshIDArray = sharedInstanceData . meshIDs ,
870887 rendererGroupIDs = sharedInstanceData . rendererGroupIDs ,
871888 sortedExcludeRendererIDs = sortedExcludeRenderers . AsReadOnly ( ) ,
872- selectedRenderGroups = renderers . AsParallelWriter ( ) ,
873- } . ScheduleBatch ( sharedInstanceData . rendererGroupIDs . Length , FindRenderersFromMaterialJob . k_BatchSize ) ;
889+ selectedRenderGroupsForMaterials = renderersWithMaterials . AsParallelWriter ( ) ,
890+ selectedRenderGroupsForMeshes = renderersWithMeshes . AsParallelWriter ( )
891+ } . ScheduleBatch ( sharedInstanceData . rendererGroupIDs . Length , FindRenderersFromMaterialOrMeshJob . k_BatchSize ) ;
874892 jobHandle . Complete ( ) ;
875893
876- return renderers ;
894+ return ( renderersWithMaterials , renderersWithMeshes ) ;
877895 }
878896
879897 [ BurstCompile ( DisableSafetyChecks = true , OptimizeFor = OptimizeFor . Performance ) ]
@@ -950,22 +968,29 @@ public unsafe void Execute()
950968 }
951969
952970 [ BurstCompile ( DisableSafetyChecks = true , OptimizeFor = OptimizeFor . Performance ) ]
953- private unsafe struct FindRenderersFromMaterialJob : IJobParallelForBatch
971+ private unsafe struct FindRenderersFromMaterialOrMeshJob : IJobParallelForBatch
954972 {
955973 public const int k_BatchSize = 128 ;
956974
957975 [ ReadOnly ] public NativeHashSet < int > . ReadOnly materialIDs ;
958976 [ ReadOnly ] public NativeArray < SmallIntegerArray > . ReadOnly materialIDArrays ;
977+ [ ReadOnly ] public NativeArray < int > . ReadOnly meshIDs ;
978+ [ ReadOnly ] public NativeArray < int > . ReadOnly meshIDArray ;
959979 [ ReadOnly ] public NativeArray < int > . ReadOnly rendererGroupIDs ;
960980 [ ReadOnly ] public NativeArray < int > . ReadOnly sortedExcludeRendererIDs ;
961-
962- [ WriteOnly ] public NativeList < int > . ParallelWriter selectedRenderGroups ;
981+
982+ [ WriteOnly ] public NativeList < int > . ParallelWriter selectedRenderGroupsForMaterials ;
983+ [ WriteOnly ] public NativeList < int > . ParallelWriter selectedRenderGroupsForMeshes ;
963984
964985 public void Execute ( int startIndex , int count )
965986 {
966- int * renderersToAddPtr = stackalloc int [ k_BatchSize ] ;
967- var renderersToAdd = new UnsafeList < int > ( renderersToAddPtr , k_BatchSize ) ;
968- renderersToAdd . Length = 0 ;
987+ int * renderersToAddForMaterialsPtr = stackalloc int [ k_BatchSize ] ;
988+ var renderersToAddForMaterials = new UnsafeList < int > ( renderersToAddForMaterialsPtr , k_BatchSize ) ;
989+ renderersToAddForMaterials . Length = 0 ;
990+
991+ int * renderersToAddForMeshesPtr = stackalloc int [ k_BatchSize ] ;
992+ var renderersToAddForMeshes = new UnsafeList < int > ( renderersToAddForMeshesPtr , k_BatchSize ) ;
993+ renderersToAddForMeshes . Length = 0 ;
969994
970995 for ( int index = 0 ; index < count ; index ++ )
971996 {
@@ -976,20 +1001,33 @@ public void Execute(int startIndex, int count)
9761001 if ( sortedExcludeRendererIDs . BinarySearch ( rendererID ) >= 0 )
9771002 continue ;
9781003
979- var rendererMaterials = materialIDArrays [ rendererIndex ] ;
980-
981- for ( int materialIndex = 0 ; materialIndex < rendererMaterials . Length ; materialIndex ++ )
9821004 {
983- var materialID = rendererMaterials [ materialIndex ] ;
984- if ( materialIDs . Contains ( materialID ) )
1005+ var meshID = meshIDArray [ rendererIndex ] ;
1006+ if ( meshIDs . Contains ( meshID ) )
9851007 {
986- renderersToAdd . AddNoResize ( rendererID ) ;
987- break ;
1008+ renderersToAddForMeshes . AddNoResize ( rendererID ) ;
1009+ // We can skip the material check if we found a mesh match since at this point
1010+ // the renderer is already added and will be processed by the mesh branch
1011+ continue ;
1012+ }
1013+ }
1014+ {
1015+ var rendererMaterials = materialIDArrays [ rendererIndex ] ;
1016+
1017+ for ( int materialIndex = 0 ; materialIndex < rendererMaterials . Length ; materialIndex ++ )
1018+ {
1019+ var materialID = rendererMaterials [ materialIndex ] ;
1020+ if ( materialIDs . Contains ( materialID ) )
1021+ {
1022+ renderersToAddForMaterials . AddNoResize ( rendererID ) ;
1023+ break ;
1024+ }
9881025 }
9891026 }
9901027 }
9911028
992- selectedRenderGroups . AddRangeNoResize ( renderersToAddPtr , renderersToAdd . Length ) ;
1029+ selectedRenderGroupsForMaterials . AddRangeNoResize ( renderersToAddForMaterialsPtr , renderersToAddForMaterials . Length ) ;
1030+ selectedRenderGroupsForMeshes . AddRangeNoResize ( renderersToAddForMeshesPtr , renderersToAddForMeshes . Length ) ;
9931031 }
9941032 }
9951033
0 commit comments