190 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using NUnit.Framework; | ||
|  | using UnityEngine.Scripting; | ||
|  | using Unity.Collections; | ||
|  | using Unity.Collections.LowLevel.Unsafe; | ||
|  | using Unity.Jobs; | ||
|  | using Unity.Jobs.LowLevel.Unsafe; | ||
|  | using Unity.Burst; | ||
|  | using System.Diagnostics; | ||
|  | 
 | ||
|  | namespace Unity.Jobs.Tests.ManagedJobs | ||
|  | { | ||
|  |     internal class BurstScheduleTests : JobTestsFixtureBasic | ||
|  |     { | ||
|  |         [BurstDiscard] | ||
|  |         static public void TestBurstCompiled(ref bool falseIfNot) | ||
|  |         { | ||
|  |             falseIfNot = false; | ||
|  |         } | ||
|  | 
 | ||
|  |         [BurstCompile(CompileSynchronously = true)] | ||
|  |         static public bool IsBurstEnabled() | ||
|  |         { | ||
|  |             bool burstCompiled = true; | ||
|  |             TestBurstCompiled(ref burstCompiled); | ||
|  |             return burstCompiled; | ||
|  |         } | ||
|  | 
 | ||
|  |         [BurstCompile(CompileSynchronously = true)] | ||
|  |         struct SimpleIJobParallelForDefer : IJobParallelForDefer | ||
|  |         { | ||
|  |             public NativeArray<int> executed; | ||
|  | 
 | ||
|  |             public void Execute(int index) | ||
|  |             { | ||
|  |                 executed[0] = 1; | ||
|  |             } | ||
|  | 
 | ||
|  |             [BurstCompile(CompileSynchronously = true)] | ||
|  |             public static int TestBurstScheduleJob(JobRunType runType, ref RewindableAllocator allocator) | ||
|  |             { | ||
|  |                 bool burstCompiled = true; | ||
|  |                 TestBurstCompiled(ref burstCompiled); | ||
|  | 
 | ||
|  |                 var dummyList = new NativeList<int>(Allocator.Temp); | ||
|  |                 dummyList.Add(5); | ||
|  | 
 | ||
|  |                 var job = new SimpleIJobParallelForDefer() { executed = new NativeArray<int>(1, allocator.ToAllocator) }; | ||
|  |                 switch (runType) | ||
|  |                 { | ||
|  |                     case JobRunType.Schedule: job.Schedule(dummyList, 1).Complete(); break; | ||
|  |                     case JobRunType.ScheduleByRef: job.ScheduleByRef(dummyList, 1).Complete(); break; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 dummyList.Dispose(); | ||
|  | 
 | ||
|  |                 int ret = (burstCompiled ? 2 : 0) + job.executed[0]; | ||
|  | 
 | ||
|  |                 job.executed.Dispose(); | ||
|  |                 return ret; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         [TestCase(JobRunType.Schedule)] | ||
|  |         [TestCase(JobRunType.ScheduleByRef)] | ||
|  |         public unsafe void IJobParallelForDefer_Jobs_FromBurst(JobRunType runType) | ||
|  |         { | ||
|  |             if (!IsBurstEnabled()) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             int ret = SimpleIJobParallelForDefer.TestBurstScheduleJob(runType, ref RwdAllocator); | ||
|  | 
 | ||
|  |             Assert.IsTrue((ret & 2) != 0, "Job schedule site not burst compiled"); | ||
|  |             Assert.IsTrue((ret & 1) != 0, "Job with burst compiled schedule site didn't execute"); | ||
|  |         } | ||
|  | 
 | ||
|  |         [BurstCompile(CompileSynchronously = true)] | ||
|  |         struct SimpleIJobParallelForBatch : IJobParallelForBatch | ||
|  |         { | ||
|  |             public NativeArray<int> executed; | ||
|  | 
 | ||
|  |             public void Execute(int startIndex, int count) | ||
|  |             { | ||
|  |                 executed[0] = 1; | ||
|  |             } | ||
|  | 
 | ||
|  |             [BurstCompile(CompileSynchronously = true)] | ||
|  |             public static int TestBurstScheduleJob(JobRunType runType, ref RewindableAllocator allocator) | ||
|  |             { | ||
|  |                 bool burstCompiled = true; | ||
|  |                 TestBurstCompiled(ref burstCompiled); | ||
|  | 
 | ||
|  |                 var job = new SimpleIJobParallelForBatch() { executed = new NativeArray<int>(1, allocator.ToAllocator) }; | ||
|  |                 switch (runType) | ||
|  |                 { | ||
|  |                     case JobRunType.Schedule: job.ScheduleBatch(1, 1).Complete(); break; | ||
|  |                     case JobRunType.ScheduleByRef: job.ScheduleBatchByRef(1, 1).Complete(); break; | ||
|  |                     case JobRunType.Run: job.RunBatch(1); break; | ||
|  |                     case JobRunType.RunByRef: job.RunBatchByRef(1); break; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 int ret = (burstCompiled ? 2 : 0) + job.executed[0]; | ||
|  | 
 | ||
|  |                 job.executed.Dispose(); | ||
|  |                 return ret; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         [TestCase(JobRunType.Schedule)] | ||
|  |         [TestCase(JobRunType.ScheduleByRef)] | ||
|  |         [TestCase(JobRunType.Run)] | ||
|  |         [TestCase(JobRunType.RunByRef)] | ||
|  |         public unsafe void IJobParallelForBatch_Jobs_FromBurst(JobRunType runType) | ||
|  |         { | ||
|  |             if (!IsBurstEnabled()) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             int ret = SimpleIJobParallelForBatch.TestBurstScheduleJob(runType, ref RwdAllocator); | ||
|  | 
 | ||
|  |             Assert.IsTrue((ret & 2) != 0, "Job schedule site not burst compiled"); | ||
|  |             Assert.IsTrue((ret & 1) != 0, "Job with burst compiled schedule site didn't execute"); | ||
|  |         } | ||
|  | 
 | ||
|  |         [BurstCompile(CompileSynchronously = true)] | ||
|  |         struct SimpleIJobFilter : IJobFilter | ||
|  |         { | ||
|  |             public NativeArray<int> executed; | ||
|  | 
 | ||
|  |             public bool Execute(int index) | ||
|  |             { | ||
|  |                 executed[0] = 1; | ||
|  |                 return false; | ||
|  |             } | ||
|  | 
 | ||
|  |             [BurstCompile(CompileSynchronously = true)] | ||
|  |             public static int TestBurstScheduleJob(JobRunType runType, ref RewindableAllocator allocator) | ||
|  |             { | ||
|  |                 bool burstCompiled = true; | ||
|  |                 TestBurstCompiled(ref burstCompiled); | ||
|  | 
 | ||
|  |                 var dummyList = new NativeList<int>(Allocator.Temp); | ||
|  |                 dummyList.Add(5); | ||
|  | 
 | ||
|  |                 var job = new SimpleIJobFilter() { executed = new NativeArray<int>(1, allocator.ToAllocator) }; | ||
|  |                 switch (runType) | ||
|  |                 { | ||
|  |                     case JobRunType.Schedule: | ||
|  |                         job.ScheduleFilter(dummyList).Complete(); | ||
|  |                         job.ScheduleAppend(dummyList, 1).Complete(); | ||
|  |                         break; | ||
|  |                     case JobRunType.ScheduleByRef: | ||
|  |                         job.ScheduleFilterByRef(dummyList).Complete(); | ||
|  |                         job.ScheduleAppendByRef(dummyList, 1).Complete(); | ||
|  |                         break; | ||
|  |                     case JobRunType.Run: | ||
|  |                         job.RunFilter(dummyList); | ||
|  |                         job.RunAppend(dummyList, 1); | ||
|  |                         break; | ||
|  |                     case JobRunType.RunByRef: | ||
|  |                         job.RunFilterByRef(dummyList); | ||
|  |                         job.RunAppendByRef(dummyList, 1); | ||
|  |                         break; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 dummyList.Dispose(); | ||
|  | 
 | ||
|  |                 int ret = (burstCompiled ? 2 : 0) + job.executed[0]; | ||
|  | 
 | ||
|  |                 job.executed.Dispose(); | ||
|  |                 return ret; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         [TestCase(JobRunType.Schedule)] | ||
|  |         [TestCase(JobRunType.ScheduleByRef)] | ||
|  |         [TestCase(JobRunType.Run)] | ||
|  |         [TestCase(JobRunType.RunByRef)] | ||
|  |         public unsafe void IJobFilter_Jobs_FromBurst(JobRunType runType) | ||
|  |         { | ||
|  |             if (!IsBurstEnabled()) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             int ret = SimpleIJobFilter.TestBurstScheduleJob(runType, ref RwdAllocator); | ||
|  | 
 | ||
|  |             Assert.IsTrue((ret & 2) != 0, "Job schedule site not burst compiled"); | ||
|  |             Assert.IsTrue((ret & 1) != 0, "Job with burst compiled schedule site didn't execute"); | ||
|  |         } | ||
|  |     } | ||
|  | } |