Skip to content

Commit e1f6af7

Browse files
authored
Merge pull request #7 from AnnulusGames/fix-job-schedule
Fix: Job is scheduled in parallel regardless of ScheduleMode
2 parents a1cc7b8 + 2895693 commit e1f6af7

1 file changed

Lines changed: 28 additions & 12 deletions

File tree

src/Arch.Unity/Assets/Arch.Unity/Runtime/Jobs/IJobArchChunk.cs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)