@@ -63,6 +63,16 @@ public unsafe NativeArray<T> GetData<T>(int layer = 0) where T : struct
6363 unsafe private extern IntPtr GetDataRaw ( int layer ) ;
6464 }
6565
66+ [ UsedByNativeCode ]
67+ [ NativeHeader ( "Runtime/Graphics/AsyncGPUReadbackManaged.h" ) ]
68+ [ StructLayout ( LayoutKind . Sequential ) ]
69+ unsafe internal struct AsyncRequestNativeArrayData
70+ {
71+ public void * nativeArrayBuffer ;
72+ public long lengthInBytes ;
73+ public AtomicSafetyHandle safetyHandle ;
74+ }
75+
6676 [ StaticAccessor ( "AsyncGPUReadbackManager::GetInstance()" , StaticAccessorType . Dot ) ]
6777 public static class AsyncGPUReadback
6878 {
@@ -85,7 +95,7 @@ static public AsyncGPUReadbackRequest Request(ComputeBuffer src, Action<AsyncGPU
8595 {
8696 unsafe
8797 {
88- AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_1 ( src , null , 0 ) ;
98+ AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_1 ( src ) ;
8999 SetUpScriptingRequest ( request , callback ) ;
90100 return request ;
91101 }
@@ -95,7 +105,7 @@ static public AsyncGPUReadbackRequest Request(ComputeBuffer src, int size, int o
95105 {
96106 unsafe
97107 {
98- AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_2 ( src , size , offset , null , 0 ) ;
108+ AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_2 ( src , size , offset ) ;
99109 SetUpScriptingRequest ( request , callback ) ;
100110 return request ;
101111 }
@@ -141,11 +151,28 @@ static public AsyncGPUReadbackRequest Request(Texture src, int mipIndex, int x,
141151 return request ;
142152 }
143153
154+ static AsyncRequestNativeArrayData CreateAsyncRequestNativeArrayData < T > ( ref NativeArray < T > output ) where T : struct
155+ {
156+ unsafe
157+ {
158+ AsyncRequestNativeArrayData data ;
159+ data . nativeArrayBuffer = output . GetUnsafePtr ( ) ;
160+ data . lengthInBytes = output . Length * UnsafeUtility . SizeOf < T > ( ) ;
161+ var safetyHandle = NativeArrayUnsafeUtility . GetAtomicSafetyHandle ( output ) ;
162+ var versionPtr = ( int * ) safetyHandle . versionNode ;
163+ if ( safetyHandle . version != ( ( * versionPtr ) & AtomicSafetyHandle . WriteCheck ) )
164+ AtomicSafetyHandle . CheckWriteAndThrowNoEarlyOut ( safetyHandle ) ;
165+ data . safetyHandle = safetyHandle ;
166+ return data ;
167+ }
168+ }
169+
144170 static public AsyncGPUReadbackRequest RequestIntoNativeArray < T > ( ref NativeArray < T > output , ComputeBuffer src , Action < AsyncGPUReadbackRequest > callback = null ) where T : struct
145171 {
146172 unsafe
147173 {
148- AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_1 ( src , output . GetUnsafePtr ( ) , output . Length * UnsafeUtility . SizeOf < T > ( ) ) ;
174+ AsyncRequestNativeArrayData data = CreateAsyncRequestNativeArrayData ( ref output ) ;
175+ AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_3 ( src , & data ) ;
149176 SetUpScriptingRequest ( request , callback ) ;
150177 return request ;
151178 }
@@ -155,7 +182,8 @@ static public AsyncGPUReadbackRequest RequestIntoNativeArray<T>(ref NativeArray<
155182 {
156183 unsafe
157184 {
158- AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_2 ( src , size , offset , output . GetUnsafePtr ( ) , output . Length * UnsafeUtility . SizeOf < T > ( ) ) ;
185+ AsyncRequestNativeArrayData data = CreateAsyncRequestNativeArrayData ( ref output ) ;
186+ AsyncGPUReadbackRequest request = Request_Internal_ComputeBuffer_4 ( src , size , offset , & data ) ;
159187 SetUpScriptingRequest ( request , callback ) ;
160188 return request ;
161189 }
@@ -165,7 +193,8 @@ static public AsyncGPUReadbackRequest RequestIntoNativeArray<T>(ref NativeArray<
165193 {
166194 unsafe
167195 {
168- AsyncGPUReadbackRequest request = Request_Internal_Texture_5 ( src , mipIndex , output . GetUnsafePtr ( ) , output . Length * UnsafeUtility . SizeOf < T > ( ) ) ;
196+ AsyncRequestNativeArrayData data = CreateAsyncRequestNativeArrayData ( ref output ) ;
197+ AsyncGPUReadbackRequest request = Request_Internal_Texture_5 ( src , mipIndex , & data ) ;
169198 SetUpScriptingRequest ( request , callback ) ;
170199 return request ;
171200 }
@@ -181,7 +210,8 @@ static public AsyncGPUReadbackRequest RequestIntoNativeArray<T>(ref NativeArray<
181210 ValidateFormat ( src , dstFormat ) ;
182211 unsafe
183212 {
184- AsyncGPUReadbackRequest request = Request_Internal_Texture_6 ( src , mipIndex , dstFormat , output . GetUnsafePtr ( ) , output . Length * UnsafeUtility . SizeOf < T > ( ) ) ;
213+ AsyncRequestNativeArrayData data = CreateAsyncRequestNativeArrayData ( ref output ) ;
214+ AsyncGPUReadbackRequest request = Request_Internal_Texture_6 ( src , mipIndex , dstFormat , & data ) ;
185215 SetUpScriptingRequest ( request , callback ) ;
186216 return request ;
187217 }
@@ -197,18 +227,26 @@ static public AsyncGPUReadbackRequest RequestIntoNativeArray<T>(ref NativeArray<
197227 ValidateFormat ( src , dstFormat ) ;
198228 unsafe
199229 {
200- AsyncGPUReadbackRequest request = Request_Internal_Texture_7 ( src , mipIndex , x , width , y , height , z , depth , dstFormat , output . GetUnsafePtr ( ) , output . Length * UnsafeUtility . SizeOf < T > ( ) ) ;
230+ AsyncRequestNativeArrayData data = CreateAsyncRequestNativeArrayData ( ref output ) ;
231+ AsyncGPUReadbackRequest request = Request_Internal_Texture_7 ( src , mipIndex , x , width , y , height , z , depth , dstFormat , & data ) ;
201232 SetUpScriptingRequest ( request , callback ) ;
202233 return request ;
203234 }
204235 }
205236
206237 [ NativeMethod ( "Request" ) ]
207238 unsafe
208- static private extern AsyncGPUReadbackRequest Request_Internal_ComputeBuffer_1 ( [ NotNull ] ComputeBuffer buffer , void * output , int allocationSize ) ;
239+ static private extern AsyncGPUReadbackRequest Request_Internal_ComputeBuffer_1 ( [ NotNull ] ComputeBuffer buffer ) ;
240+ [ NativeMethod ( "Request" ) ]
241+ unsafe
242+ static private extern AsyncGPUReadbackRequest Request_Internal_ComputeBuffer_2 ( [ NotNull ] ComputeBuffer src , int size , int offset ) ;
243+
244+ [ NativeMethod ( "Request" ) ]
245+ unsafe
246+ static private extern AsyncGPUReadbackRequest Request_Internal_ComputeBuffer_3 ( [ NotNull ] ComputeBuffer buffer , AsyncRequestNativeArrayData * data ) ;
209247 [ NativeMethod ( "Request" ) ]
210248 unsafe
211- static private extern AsyncGPUReadbackRequest Request_Internal_ComputeBuffer_2 ( [ NotNull ] ComputeBuffer src , int size , int offset , void * output , int allocationSize ) ;
249+ static private extern AsyncGPUReadbackRequest Request_Internal_ComputeBuffer_4 ( [ NotNull ] ComputeBuffer src , int size , int offset , AsyncRequestNativeArrayData * data ) ;
212250
213251 [ NativeMethod ( "Request" ) ]
214252 static private extern AsyncGPUReadbackRequest Request_Internal_Texture_1 ( [ NotNull ] Texture src , int mipIndex ) ;
@@ -221,12 +259,12 @@ static public AsyncGPUReadbackRequest RequestIntoNativeArray<T>(ref NativeArray<
221259
222260 [ NativeMethod ( "Request" ) ]
223261 unsafe
224- static private extern AsyncGPUReadbackRequest Request_Internal_Texture_5 ( [ NotNull ] Texture src , int mipIndex , void * output , int allocationSize ) ;
262+ static private extern AsyncGPUReadbackRequest Request_Internal_Texture_5 ( [ NotNull ] Texture src , int mipIndex , AsyncRequestNativeArrayData * data ) ;
225263 [ NativeMethod ( "Request" ) ]
226264 unsafe
227- static private extern AsyncGPUReadbackRequest Request_Internal_Texture_6 ( [ NotNull ] Texture src , int mipIndex , GraphicsFormat dstFormat , void * output , int allocationSize ) ;
265+ static private extern AsyncGPUReadbackRequest Request_Internal_Texture_6 ( [ NotNull ] Texture src , int mipIndex , GraphicsFormat dstFormat , AsyncRequestNativeArrayData * data ) ;
228266 [ NativeMethod ( "Request" ) ]
229267 unsafe
230- static private extern AsyncGPUReadbackRequest Request_Internal_Texture_7 ( [ NotNull ] Texture src , int mipIndex , int x , int width , int y , int height , int z , int depth , GraphicsFormat dstFormat , void * output , int allocationSize ) ;
268+ static private extern AsyncGPUReadbackRequest Request_Internal_Texture_7 ( [ NotNull ] Texture src , int mipIndex , int x , int width , int y , int height , int z , int depth , GraphicsFormat dstFormat , AsyncRequestNativeArrayData * data ) ;
231269 }
232270}
0 commit comments