@@ -72,6 +72,7 @@ public struct JobWrapper<T> where T : struct, IJobArchChunk
7272 {
7373 public NativeArray < NativeChunk > ChunkArray ;
7474 public T JobData ;
75+ public byte IsParallel ;
7576 }
7677
7778 internal readonly struct JobArchChunkStruct < T > where T : struct , IJobArchChunk
@@ -83,27 +84,37 @@ internal static unsafe void Initialize()
8384 {
8485 if ( jobReflectionData . Data == IntPtr . Zero )
8586 {
86- jobReflectionData . Data = JobsUtility . CreateJobReflectionData ( typeof ( JobWrapper < T > ) , ( ExecuteJobFunction ) Execute ) ;
87+ jobReflectionData . Data = JobsUtility . CreateJobReflectionData ( typeof ( JobWrapper < T > ) , typeof ( T ) , ( ExecuteJobFunction ) Execute ) ;
8788 }
8889 }
8990
9091 public delegate void ExecuteJobFunction ( ref JobWrapper < T > jobData , IntPtr additionalPtr , IntPtr bufferRangePatchData , ref JobRanges ranges , int jobIndex ) ;
9192 public static unsafe void Execute ( ref JobWrapper < T > jobData , IntPtr jobData2 , IntPtr bufferRangePatchData , ref JobRanges ranges , int jobIndex )
9293 {
93- while ( true )
94+ if ( jobData . IsParallel == 1 )
9495 {
95- if ( ! JobsUtility . GetWorkStealingRange ( ref ranges , jobIndex , out int begin , out int end ) )
96+ while ( true )
9697 {
97- break ;
98+ if ( ! JobsUtility . GetWorkStealingRange ( ref ranges , jobIndex , out int begin , out int end ) )
99+ {
100+ break ;
101+ }
102+
103+ JobsUtility . PatchBufferMinMaxRanges ( bufferRangePatchData , UnsafeUtility . AddressOf ( ref jobData ) , begin , end - begin ) ;
104+
105+ var endThatCompilerCanSeeWillNeverChange = end ;
106+ for ( var i = begin ; i < endThatCompilerCanSeeWillNeverChange ; i ++ )
107+ {
108+ jobData . JobData . Execute ( jobData . ChunkArray [ i ] ) ;
109+ }
98110 }
99-
100- JobsUtility . PatchBufferMinMaxRanges ( bufferRangePatchData , UnsafeUtility . AddressOf ( ref jobData ) , begin , end - begin ) ;
101-
102- var endThatCompilerCanSeeWillNeverChange = end ;
103- for ( var i = begin ; i < endThatCompilerCanSeeWillNeverChange ; i ++ )
111+ }
112+ else
113+ {
114+ JobsUtility . PatchBufferMinMaxRanges ( bufferRangePatchData , UnsafeUtility . AddressOf ( ref jobData ) , 0 , jobData . ChunkArray . Length ) ;
115+ for ( int i = 0 ; i < jobData . ChunkArray . Length ; i ++ )
104116 {
105- var chunk = jobData . ChunkArray [ i ] ;
106- jobData . JobData . Execute ( chunk ) ;
117+ jobData . JobData . Execute ( jobData . ChunkArray [ i ] ) ;
107118 }
108119 }
109120 }
@@ -167,14 +178,19 @@ unsafe static JobHandle ScheduleInternal<T>(ref T jobData, World world, QueryDes
167178 nativeChunks . Add ( nativeChunk ) ;
168179 }
169180
181+ var isParallel = scheduleMode == ScheduleMode . Parallel ;
182+
170183 var chunkJobData = new JobWrapper < T > ( )
171184 {
172185 ChunkArray = nativeChunks . AsArray ( ) ,
173186 JobData = jobData ,
187+ IsParallel = isParallel ? ( byte ) 1 : ( byte ) 0
174188 } ;
175189
176190 var scheduleParams = new JobsUtility . JobScheduleParameters ( UnsafeUtility . AddressOf ( ref chunkJobData ) , GetReflectionData < T > ( ) , dependsOn , scheduleMode ) ;
177- var jobHandle = JobsUtility . ScheduleParallelFor ( ref scheduleParams , nativeChunks . Length , 1 ) ;
191+ var jobHandle = isParallel
192+ ? JobsUtility . ScheduleParallelFor ( ref scheduleParams , nativeChunks . Length , 1 )
193+ : JobsUtility . Schedule ( ref scheduleParams ) ;
178194
179195 var handle = new JobArchChunkHandle ( )
180196 {
0 commit comments