112 lines
3.1 KiB
C#
112 lines
3.1 KiB
C#
using NUnit.Framework;
|
|
using Unity.Collections;
|
|
using Unity.Jobs;
|
|
|
|
namespace Unity.Jobs.Tests.ManagedJobs
|
|
{
|
|
internal class JobTests_CombineDependencies : JobTestsFixtureBasic
|
|
{
|
|
struct ArrayJob1 : IJob
|
|
{
|
|
public NativeArray<int> data;
|
|
|
|
public void Execute()
|
|
{
|
|
data[0] = data[0] + 1;
|
|
}
|
|
}
|
|
|
|
struct ArrayJob2 : IJob
|
|
{
|
|
public NativeArray<int> a;
|
|
public NativeArray<int> b;
|
|
|
|
public void Execute()
|
|
{
|
|
a[0] = a[0] + 100;
|
|
b[0] = b[0] + 100;
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void CombineDependenciesWorks()
|
|
{
|
|
var arrayA = new NativeArray<int>(2, Allocator.Persistent);
|
|
var arrayB = new NativeArray<int>(2, Allocator.Persistent);
|
|
|
|
var jobA = new ArrayJob1 {data = arrayA};
|
|
var jobAHandle = jobA.Schedule();
|
|
|
|
var jobB = new ArrayJob1 {data = arrayB};
|
|
var jobBHandle = jobB.Schedule();
|
|
|
|
var combinedHandle = JobHandle.CombineDependencies(jobAHandle, jobBHandle);
|
|
|
|
var job2 = new ArrayJob2
|
|
{
|
|
a = arrayA,
|
|
b = arrayB
|
|
};
|
|
job2.Schedule(combinedHandle).Complete();
|
|
|
|
for (int i = 0; i < arrayA.Length; ++i)
|
|
{
|
|
Assert.AreEqual(arrayA[0], arrayB[0]);
|
|
}
|
|
|
|
arrayA.Dispose();
|
|
arrayB.Dispose();
|
|
}
|
|
|
|
public void DeepCombineDependencies(int depth, int arraySize)
|
|
{
|
|
var arrays = new NativeArray<int>[arraySize];
|
|
for (var i = 0; i < arrays.Length; i++)
|
|
{
|
|
arrays[i] = new NativeArray<int>(1, Allocator.Persistent);
|
|
arrays[i][0] = 0;
|
|
}
|
|
|
|
var handles = new NativeArray<JobHandle>(arrays.Length, Allocator.Persistent);
|
|
|
|
var previousJobHandle = new JobHandle();
|
|
for (var i = 0; i < depth; i++)
|
|
{
|
|
for (var a = 0; a != arrays.Length; a++)
|
|
{
|
|
var job = new ArrayJob1 {data = arrays[a]};
|
|
handles[a] = job.Schedule(previousJobHandle);
|
|
}
|
|
|
|
var combinedHandle = JobHandle.CombineDependencies(handles);
|
|
|
|
var job2 = new ArrayJob2
|
|
{
|
|
a = arrays[0],
|
|
b = arrays[1]
|
|
};
|
|
previousJobHandle = job2.Schedule(combinedHandle);
|
|
}
|
|
|
|
previousJobHandle.Complete();
|
|
|
|
Assert.AreEqual(100 * depth + depth, arrays[0][0]);
|
|
Assert.AreEqual(100 * depth + depth, arrays[1][0]);
|
|
|
|
for (var i = 2; i < arrays.Length; i++)
|
|
Assert.AreEqual(depth, arrays[i][0]);
|
|
|
|
for (var a = 0; a != arrays.Length; a++)
|
|
arrays[a].Dispose();
|
|
|
|
handles.Dispose();
|
|
}
|
|
|
|
[Test]
|
|
public void DeepCombineDependenciesWorks()
|
|
{
|
|
DeepCombineDependencies(5, 21);
|
|
}
|
|
}
|
|
}
|