37 lines
1.2 KiB
C#
37 lines
1.2 KiB
C#
|
using System;
|
||
|
using System.Runtime.InteropServices;
|
||
|
using Unity.Collections;
|
||
|
using Unity.Collections.LowLevel.Unsafe;
|
||
|
|
||
|
namespace UnityEngine.Rendering.Universal
|
||
|
{
|
||
|
unsafe struct PinnedArray<T> : IDisposable where T : struct
|
||
|
{
|
||
|
public T[] managedArray;
|
||
|
public GCHandle handle;
|
||
|
public NativeArray<T> nativeArray;
|
||
|
|
||
|
public int length => managedArray != null ? managedArray.Length : 0;
|
||
|
|
||
|
public PinnedArray(int length)
|
||
|
{
|
||
|
managedArray = new T[length];
|
||
|
handle = GCHandle.Alloc(managedArray, GCHandleType.Pinned);
|
||
|
nativeArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<T>((void*)handle.AddrOfPinnedObject(), length, Allocator.None);
|
||
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
||
|
NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref nativeArray, AtomicSafetyHandle.Create());
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
public void Dispose()
|
||
|
{
|
||
|
if (managedArray == null) return;
|
||
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
||
|
AtomicSafetyHandle.Release(NativeArrayUnsafeUtility.GetAtomicSafetyHandle(nativeArray));
|
||
|
#endif
|
||
|
handle.Free();
|
||
|
this = default;
|
||
|
}
|
||
|
}
|
||
|
}
|