public static void MemcpySubresource([NativeTypeName("const D3D12_MEMCPY_DEST *")] D3D12_MEMCPY_DEST *pDest, [NativeTypeName("const void *")] void *pResourceData, [NativeTypeName("const D3D12_SUBRESOURCE_INFO *")] D3D12_SUBRESOURCE_INFO *pSrc, [NativeTypeName("SIZE_T")] nuint RowSizeInBytes, [NativeTypeName("UINT")] uint NumRows, [NativeTypeName("UINT")] uint NumSlices) { for (var z = 0u; z < NumSlices; ++z) { var pDestSlice = (byte *)pDest->pData + pDest->SlicePitch * z; var pSrcSlice = ((byte *)pResourceData + pSrc->Offset) + pSrc->DepthPitch * (nint)z; for (var y = 0u; y < NumRows; ++y) { Buffer.MemoryCopy( pSrcSlice + pSrc->RowPitch * (nint)y, pDestSlice + pDest->RowPitch * y, (ulong)RowSizeInBytes, (ulong)RowSizeInBytes ); } } }
public static void MemcpySubresource(D3D12_MEMCPY_DEST *pDest, D3D12_SUBRESOURCE_DATA *pSrc, UIntPtr RowSizeInBytes, uint NumRows, uint NumSlices) { for (var z = 0u; z < NumSlices; ++z) { byte *pDestSlice = (byte *)(pDest->pData); byte *pSrcSlice = (byte *)(pSrc->pData); if (IntPtr.Size == 4) { pDestSlice += (uint)pDest->SlicePitch * z; pSrcSlice += (uint)pSrc->SlicePitch * z; } else { pDestSlice += (ulong)pDest->SlicePitch * z; pSrcSlice += (ulong)pSrc->SlicePitch * z; } for (var y = 0u; y < NumRows; ++y) { byte *pTempDest = pDestSlice; byte *pTempSrc = pSrcSlice; if (IntPtr.Size == 4) { pDestSlice += (uint)pDest->RowPitch * y; pSrcSlice += (uint)pDest->RowPitch * y; } else { pDestSlice += (ulong)pDest->RowPitch * y; pSrcSlice += (ulong)pDest->RowPitch * y; } Buffer.MemoryCopy(pTempSrc, pTempDest, (long)RowSizeInBytes, (long)RowSizeInBytes); } } }