public virtual int WriteToSubresource( uint DstSubresource, ref D3D12_BOX pDstBox, IntPtr pSrcData, uint SrcRowPitch, uint SrcDepthPitch ) { var fp = GetFunctionPointer(12); if (m_WriteToSubresourceFunc == null) { m_WriteToSubresourceFunc = (WriteToSubresourceFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(WriteToSubresourceFunc)); } return(m_WriteToSubresourceFunc(m_ptr, DstSubresource, ref pDstBox, pSrcData, SrcRowPitch, SrcDepthPitch)); }
public virtual int ReadFromSubresource( IntPtr pDstData, uint DstRowPitch, uint DstDepthPitch, uint SrcSubresource, ref D3D12_BOX pSrcBox ) { var fp = GetFunctionPointer(13); if (m_ReadFromSubresourceFunc == null) { m_ReadFromSubresourceFunc = (ReadFromSubresourceFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(ReadFromSubresourceFunc)); } return(m_ReadFromSubresourceFunc(m_ptr, pDstData, DstRowPitch, DstDepthPitch, SrcSubresource, ref pSrcBox)); }
public virtual void CopyTextureRegion( ref D3D12_TEXTURE_COPY_LOCATION pDst, uint DstX, uint DstY, uint DstZ, ref D3D12_TEXTURE_COPY_LOCATION pSrc, ref D3D12_BOX pSrcBox ) { var fp = GetFunctionPointer(16); if (m_CopyTextureRegionFunc == null) { m_CopyTextureRegionFunc = (CopyTextureRegionFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(CopyTextureRegionFunc)); } m_CopyTextureRegionFunc(m_ptr, ref pDst, DstX, DstY, DstZ, ref pSrc, ref pSrcBox); }
public static ulong UpdateSubresources(ID3D12GraphicsCommandList *pCmdList, ID3D12Resource *pDestinationResource, ID3D12Resource *pIntermediate, uint FirstSubresource, uint NumSubresources, ulong RequiredSize, D3D12_PLACED_SUBRESOURCE_FOOTPRINT *pLayouts, uint *pNumRows, ulong *pRowSizesInBytes, D3D12_SUBRESOURCE_DATA *pSrcData) { // Minor validation D3D12_RESOURCE_DESC IntermediateDesc; pIntermediate->GetDesc(&IntermediateDesc); D3D12_RESOURCE_DESC DestinationDesc; pDestinationResource->GetDesc(&DestinationDesc); if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER || IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset || RequiredSize > ((IntPtr.Size == 4) ? uint.MaxValue : ulong.MaxValue) || (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER && (FirstSubresource != 0 || NumSubresources != 1))) { return(0); } byte *pData; int hr = pIntermediate->Map(0, null, (void **)(&pData)); if (FAILED(hr)) { return(0); } for (var i = 0u; i < NumSubresources; ++i) { if (pRowSizesInBytes[i] > ((IntPtr.Size == 4) ? uint.MaxValue : ulong.MaxValue)) { return(0); } var DestData = new D3D12_MEMCPY_DEST { pData = pData + pLayouts[i].Offset, RowPitch = (UIntPtr)(pLayouts[i].Footprint.RowPitch), SlicePitch = (UIntPtr)(pLayouts[i].Footprint.RowPitch * pNumRows[i]) }; MemcpySubresource(&DestData, &pSrcData[i], (UIntPtr)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth); } pIntermediate->Unmap(0, null); if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) { var SrcBox = new D3D12_BOX { left = (uint)pLayouts[0].Offset, top = 0, front = 0, right = (uint)pLayouts[0].Offset + pLayouts[0].Footprint.Width, bottom = 1, back = 1 }; pCmdList->CopyBufferRegion( pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width); } else { for (var i = 0u; i < NumSubresources; ++i) { var Dst = new D3D12_TEXTURE_COPY_LOCATION { pResource = pDestinationResource, Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, Anonymous = new D3D12_TEXTURE_COPY_LOCATION._Anonymous_e__Union { SubresourceIndex = i + FirstSubresource } }; var Src = new D3D12_TEXTURE_COPY_LOCATION { pResource = pIntermediate, Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT, Anonymous = new D3D12_TEXTURE_COPY_LOCATION._Anonymous_e__Union { PlacedFootprint = pLayouts[i] } }; pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, null); } } return(RequiredSize); }