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; | ||
|  |         } | ||
|  |     } | ||
|  | } |