Files
NovaFree/Scripts/Internal/Compat/InternalScript_280.cs
2025-08-02 20:11:41 +08:00

153 lines
7.0 KiB
C#

// Copyright (c) Supernova Technologies LLC
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using Unity.Jobs.LowLevel.Unsafe;
namespace Nova.Compat
{
[JobProducerType(typeof(INovaJobExtensions.JobProducer<>))]
internal interface INovaJob : IJob { }
[JobProducerType(typeof(INovaJobParallelForExtensions.JobParallelForProducer<>))]
internal interface INovaJobParallelFor : IJobParallelFor
{ }
internal static class INovaJobExtensions
{
public static unsafe void RunByRef<T>(this ref T jobData) where T : struct, INovaJob
{
JobsUtility.JobScheduleParameters InternalVar_1 = JobProducer<T>.RunParams;
InternalVar_1.JobDataPtr = new IntPtr(UnsafeUtility.AddressOf(ref jobData));
JobsUtility.Schedule(ref InternalVar_1);
}
public static unsafe JobHandle NovaScheduleByRef<T>(this ref T jobData, JobHandle dependsOn = default) where T : struct, INovaJob
{
JobsUtility.JobScheduleParameters InternalVar_1 = JobProducer<T>.ScheduleParams;
InternalVar_1.JobDataPtr = new IntPtr(UnsafeUtility.AddressOf(ref jobData));
InternalVar_1.Dependency = dependsOn;
return JobsUtility.Schedule(ref InternalVar_1);
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public unsafe struct JobProducer<T> where T : struct, INovaJob
{
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
public static readonly JobsUtility.JobScheduleParameters RunParams = new JobsUtility.JobScheduleParameters(null, ReflectionData, default, ScheduleMode.Run);
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
public static readonly JobsUtility.JobScheduleParameters ScheduleParams = new JobsUtility.JobScheduleParameters(null, ReflectionData, default, ScheduleMode.Single);
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private static IntPtr reflectionData;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
public static IntPtr ReflectionData
{
get
{
if (reflectionData == IntPtr.Zero)
{
reflectionData = JobsUtility.CreateJobReflectionData(typeof(T), typeof(T), (ExecuteJobFunction)Execute);
}
return reflectionData;
}
}
private delegate void ExecuteJobFunction(ref T jobData);
[Obfuscation]
private static void Execute(ref T jobData)
{
jobData.Execute();
}
}
}
internal static class INovaJobParallelForExtensions
{
public static unsafe JobHandle NovaScheduleByRef<T>(this ref T jobData, int arrayLength, int innerloopBatchCount, JobHandle dependsOn = default) where T : struct, INovaJobParallelFor
{
JobsUtility.JobScheduleParameters InternalVar_1 = JobParallelForProducer<T>.ParallelScheduleParams;
InternalVar_1.JobDataPtr = new IntPtr(UnsafeUtility.AddressOf(ref jobData));
InternalVar_1.Dependency = dependsOn;
return JobsUtility.ScheduleParallelFor(ref InternalVar_1, arrayLength, innerloopBatchCount);
}
public static unsafe JobHandle ScheduleByRef<T>(this ref T jobData, int* arrayLength, int innerloopBatchCount, JobHandle dependsOn = default) where T : struct, INovaJobParallelFor
{
JobsUtility.JobScheduleParameters InternalVar_1 = JobParallelForProducer<T>.ParallelScheduleParams;
InternalVar_1.JobDataPtr = new IntPtr(UnsafeUtility.AddressOf(ref jobData));
InternalVar_1.Dependency = dependsOn;
var InternalVar_2 = (byte*)arrayLength - sizeof(void*);
return JobsUtility.ScheduleParallelForDeferArraySize(ref InternalVar_1, innerloopBatchCount, InternalVar_2, null);
}
public static unsafe JobHandle ScheduleByRef<T,U>(this ref T jobData, NativeList<U> list, int innerloopBatchCount, JobHandle dependsOn = default)
where T : struct, INovaJobParallelFor
where U : unmanaged
{
JobsUtility.JobScheduleParameters InternalVar_1 = JobParallelForProducer<T>.ParallelScheduleParams;
InternalVar_1.JobDataPtr = new IntPtr(UnsafeUtility.AddressOf(ref jobData));
InternalVar_1.Dependency = dependsOn;
void* InternalVar_2 = null;
#if ENABLE_UNITY_COLLECTIONS_CHECKS
var InternalVar_3 = NativeListUnsafeUtility.GetAtomicSafetyHandle(ref list);
InternalVar_2 = UnsafeUtility.AddressOf(ref InternalVar_3);
#endif
var InternalVar_4 = NativeListUnsafeUtility.GetInternalListDataPtrUnchecked(ref list);
return JobsUtility.ScheduleParallelForDeferArraySize(ref InternalVar_1, innerloopBatchCount, InternalVar_4, InternalVar_2);
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public unsafe struct JobParallelForProducer<T> where T : struct, INovaJobParallelFor
{
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
public static readonly JobsUtility.JobScheduleParameters ParallelScheduleParams = new JobsUtility.JobScheduleParameters(null, ParallelReflectionData, default, ScheduleMode.Parallel);
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private static IntPtr parallelReflectionData;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
public static IntPtr ParallelReflectionData
{
get
{
if (parallelReflectionData == IntPtr.Zero)
{
parallelReflectionData = JobsUtility.CreateJobReflectionData(typeof(T), typeof(T), (ExecuteJobParallel)Execute);
}
return parallelReflectionData;
}
}
private delegate void ExecuteJobParallel(ref T jobData, IntPtr additionalPtr, IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
[Obfuscation]
private static unsafe void Execute(ref T jobData, IntPtr additionalPtr, IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out int InternalVar_1, out int InternalVar_2))
{
for (var InternalVar_3 = InternalVar_1; InternalVar_3 < InternalVar_2; ++InternalVar_3)
{
jobData.Execute(InternalVar_3);
}
}
}
}
}
}