Example #1
0
 public unsafe T this[int index]
 {
     get
     {
         AtomicSafetyHandleVersionMask *ptr = (AtomicSafetyHandleVersionMask *)((void *)this.m_Safety.versionNode);
         if ((this.m_Safety.version & AtomicSafetyHandleVersionMask.Read) == (AtomicSafetyHandleVersionMask)0 && this.m_Safety.version != (*ptr & AtomicSafetyHandleVersionMask.ReadInv))
         {
             AtomicSafetyHandle.CheckReadAndThrowNoEarlyOut(this.m_Safety);
         }
         if (index < this.m_MinIndex || index > this.m_MaxIndex)
         {
             this.FailOutOfRangeError(index);
         }
         return(UnsafeUtility.ReadArrayElement <T>(this.m_Buffer, index * this.m_Stride));
     }
     set
     {
         AtomicSafetyHandleVersionMask *ptr = (AtomicSafetyHandleVersionMask *)((void *)this.m_Safety.versionNode);
         if ((this.m_Safety.version & AtomicSafetyHandleVersionMask.Write) == (AtomicSafetyHandleVersionMask)0 && this.m_Safety.version != (*ptr & AtomicSafetyHandleVersionMask.WriteInv))
         {
             AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(this.m_Safety);
         }
         if (index < this.m_MinIndex || index > this.m_MaxIndex)
         {
             this.FailOutOfRangeError(index);
         }
         UnsafeUtility.WriteArrayElement <T>(this.m_Buffer, index * this.m_Stride, value);
     }
 }
        void CheckElementWriteAccess(int index)
        {
            if (index < m_MinIndex || index > m_MaxIndex)
            {
                FailOutOfRangeError(index);
            }

            var versionPtr = (int *)m_Safety.versionNode;

            if (m_Safety.version != ((*versionPtr) & AtomicSafetyHandle.WriteCheck))
            {
                AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(m_Safety);
            }
        }
        void CheckElementWriteAccess(int index)
        {
            if (index < m_MinIndex || index > m_MaxIndex)
            {
                FailOutOfRangeError(index);
            }

            var versionPtr = (AtomicSafetyHandleVersionMask *)m_Safety.versionNode;

            if ((m_Safety.version & AtomicSafetyHandleVersionMask.Write) == 0 && m_Safety.version != ((*versionPtr) & AtomicSafetyHandleVersionMask.ReadInv))
            {
                AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(m_Safety);
            }
        }
        public static AsyncRequestNativeArrayData CreateAndCheckAccess <T>(NativeArray <T> array) where T : struct
        {
            var nativeArrayData = new AsyncRequestNativeArrayData();

            nativeArrayData.nativeArrayBuffer = array.GetUnsafePtr();
            nativeArrayData.lengthInBytes     = array.Length * UnsafeUtility.SizeOf <T>();
            var handle     = NativeArrayUnsafeUtility.GetAtomicSafetyHandle(array);
            var versionPtr = (int *)handle.versionNode;

            if (handle.version != ((*versionPtr) & AtomicSafetyHandle.WriteCheck))
            {
                AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(handle);
            }
            nativeArrayData.safetyHandle = handle;
            return(nativeArrayData);
        }
Example #5
0
        private unsafe void CheckWriteIndex(int index)
        {
            #if COLLECTIONS_CHECKS
            if (index < this.m_MinIndex || index > this.m_MaxIndex)
            {
                this.FailOutOfRangeError(index);
            }

            if (this.m_Safety.version == (*(int *)(void *)this.m_Safety.versionNode & -6))
            {
                return;
            }

            AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(this.m_Safety);
            #endif
        }
Example #6
0
        private unsafe void CheckWriteIndex(int index)
        {
            bool flag = index <this.m_MinIndex || index> this.m_MaxIndex;

            if (flag)
            {
                this.FailOutOfRangeError(index);
            }
            int *ptr   = (int *)((void *)this.m_Safety.versionNode);
            bool flag2 = this.m_Safety.version != (*ptr & -6);

            if (flag2)
            {
                AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(this.m_Safety);
            }
        }
        public unsafe static AsyncRequestNativeArrayData CreateAndCheckAccess <T>(NativeSlice <T> array) where T : struct
        {
            AsyncRequestNativeArrayData result = default(AsyncRequestNativeArrayData);

            result.nativeArrayBuffer = array.GetUnsafePtr <T>();
            result.lengthInBytes     = (long)array.Length * (long)UnsafeUtility.SizeOf <T>();
            AtomicSafetyHandle atomicSafetyHandle = NativeSliceUnsafeUtility.GetAtomicSafetyHandle <T>(array);
            int *ptr  = (int *)((void *)atomicSafetyHandle.versionNode);
            bool flag = atomicSafetyHandle.version != (*ptr & -6);

            if (flag)
            {
                AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(atomicSafetyHandle);
            }
            result.safetyHandle = atomicSafetyHandle;
            return(result);
        }
        public static AsyncRequestNativeArrayData CreateAndCheckAccess <T>(NativeArray <T> array) where T : struct
        {
            if (array.m_AllocatorLabel == Allocator.Temp || array.m_AllocatorLabel == Allocator.TempJob)
            {
                throw new ArgumentException("AsyncGPUReadback cannot use Temp memory as input since the result may only become available at an unspecified point in the future.");
            }
            var nativeArrayData = new AsyncRequestNativeArrayData();

            nativeArrayData.nativeArrayBuffer = array.GetUnsafePtr();
            nativeArrayData.lengthInBytes     = (long)array.Length * UnsafeUtility.SizeOf <T>();
            var handle     = NativeArrayUnsafeUtility.GetAtomicSafetyHandle(array);
            var versionPtr = (int *)handle.versionNode;

            if (handle.version != ((*versionPtr) & AtomicSafetyHandle.WriteCheck))
            {
                AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(handle);
            }
            nativeArrayData.safetyHandle = handle;
            return(nativeArrayData);
        }
Example #9
0
 public unsafe T this[int index]
 {
     get
     {
         if (this.m_Buffer == IntPtr.Zero)
         {
             throw new InvalidOperationException("NativeSlice not properly initialized");
         }
         AtomicSafetyHandleVersionMask *ptr = (AtomicSafetyHandleVersionMask *)((void *)this.m_Safety.versionNode);
         if ((this.m_Safety.version & AtomicSafetyHandleVersionMask.Read) == (AtomicSafetyHandleVersionMask)0 && this.m_Safety.version != (*ptr & AtomicSafetyHandleVersionMask.WriteInv))
         {
             AtomicSafetyHandle.CheckReadAndThrowNoEarlyOut(this.m_Safety);
         }
         if (index < this.m_MinIndex || index > this.m_MaxIndex)
         {
             this.FailOutOfRangeError(index);
         }
         return(UnsafeUtility.ReadArrayElementWithStride <T>(this.m_Buffer, index, this.m_Stride));
     }
     set
     {
         if (this.m_Buffer == IntPtr.Zero)
         {
             throw new InvalidOperationException("NativeSlice not properly initialized");
         }
         AtomicSafetyHandleVersionMask *ptr = (AtomicSafetyHandleVersionMask *)((void *)this.m_Safety.versionNode);
         if ((this.m_Safety.version & AtomicSafetyHandleVersionMask.Write) == (AtomicSafetyHandleVersionMask)0 && this.m_Safety.version != (*ptr & AtomicSafetyHandleVersionMask.ReadInv))
         {
             AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut(this.m_Safety);
         }
         if (index < this.m_MinIndex || index > this.m_MaxIndex)
         {
             this.FailOutOfRangeError(index);
         }
         UnsafeUtility.WriteArrayElementWithStride <T>(this.m_Buffer, index, this.m_Stride, value);
     }
 }