public static ulong UpdateSubresources( ID3D12GraphicsCommandList pCmdList, ID3D12Resource pDestinationResource, ID3D12Resource pIntermediate, int FirstSubresource, int NumSubresources, ulong RequiredSize, Span <PlacedSubresourceFootPrint> pLayouts, Span <int> pNumRows, Span <ulong> pRowSizesInBytes, Span <SubresourceData> pSrcData) { var IntermediateDesc = pIntermediate.Description; var DestinationDesc = pDestinationResource.Description; if (IntermediateDesc.Dimension != ResourceDimension.Buffer || IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset || (DestinationDesc.Dimension == ResourceDimension.Buffer && (FirstSubresource != 0 || NumSubresources != 1))) { return(0); } int sum = 0; for (int i = pRowSizesInBytes.Length - 1; i < pRowSizesInBytes.Length; i++) { sum = Math.Max((int)pLayouts[i].Offset + pLayouts[i].Footprint.RowPitch * pNumRows[i] * pLayouts[i].Footprint.Depth, sum); } Span <byte> pData = pIntermediate.Map <byte>(0, sum); for (int i = 0; i < NumSubresources; ++i) { MemcpySubresource((ulong)pLayouts[i].Footprint.RowPitch, (uint)pLayouts[i].Footprint.RowPitch * (uint)pNumRows[i], pData.Slice((int)pLayouts[i].Offset), pSrcData[i], (int)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth); } pIntermediate.Unmap(0, null); if (DestinationDesc.Dimension == ResourceDimension.Buffer) { pCmdList.CopyBufferRegion( pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, (ulong)pLayouts[0].Footprint.Width); } else { for (int i = 0; i < NumSubresources; ++i) { TextureCopyLocation Dst = new TextureCopyLocation(pDestinationResource, i + FirstSubresource); TextureCopyLocation Src = new TextureCopyLocation(pIntermediate, pLayouts[i]); pCmdList.CopyTextureRegion(Dst, 0, 0, 0, Src, null); } } return(RequiredSize); }