METODE ID3D12GraphicsCommandList::CopyBufferRegion (d3d12.h)
Menyalin wilayah buffer dari satu sumber daya ke sumber daya lainnya.
Sintaks
void CopyBufferRegion(
[in] ID3D12Resource *pDstBuffer,
UINT64 DstOffset,
[in] ID3D12Resource *pSrcBuffer,
UINT64 SrcOffset,
UINT64 NumBytes
);
Parameter
[in] pDstBuffer
Jenis: ID3D12Resource*
Menentukan ID3D12Resource tujuan.
DstOffset
Jenis: UINT64
Menentukan offset UINT64 (dalam byte) ke sumber daya tujuan.
[in] pSrcBuffer
Jenis: ID3D12Resource*
Menentukan sumber ID3D12Resource.
SrcOffset
Jenis: UINT64
Menentukan offset UINT64 (dalam byte) ke sumber daya sumber, untuk memulai salinan.
NumBytes
Jenis: UINT64
Menentukan jumlah byte yang akan disalin.
Mengembalikan nilai
Tidak ada
Keterangan
Pertimbangkan untuk menggunakan metode CopyResource saat menyalin seluruh sumber daya, dan gunakan metode ini untuk menyalin wilayah sumber daya.
CopyBufferRegion dapat digunakan untuk menginisialisasi sumber daya yang alias memori timbunan yang sama. Lihat CreatePlacedResource untuk detail selengkapnya.
Contoh
Sampel D3D12HelloTriangle menggunakan ID3D12GraphicsCommandList::CopyBufferRegion sebagai berikut:
inline UINT64 UpdateSubresources(
_In_ ID3D12GraphicsCommandList* pCmdList,
_In_ ID3D12Resource* pDestinationResource,
_In_ ID3D12Resource* pIntermediate,
_In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
_In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
UINT64 RequiredSize,
_In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
_In_reads_(NumSubresources) const UINT* pNumRows,
_In_reads_(NumSubresources) const UINT64* pRowSizesInBytes,
_In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData)
{
// Minor validation
D3D12_RESOURCE_DESC IntermediateDesc = pIntermediate->GetDesc();
D3D12_RESOURCE_DESC DestinationDesc = pDestinationResource->GetDesc();
if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
RequiredSize > (SIZE_T)-1 ||
(DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
(FirstSubresource != 0 || NumSubresources != 1)))
{
return 0;
}
BYTE* pData;
HRESULT hr = pIntermediate->Map(0, NULL, reinterpret_cast<void**>(&pData));
if (FAILED(hr))
{
return 0;
}
for (UINT i = 0; i < NumSubresources; ++i)
{
if (pRowSizesInBytes[i] > (SIZE_T)-1) return 0;
D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, pLayouts[i].Footprint.RowPitch * pNumRows[i] };
MemcpySubresource(&DestData, &pSrcData[i], (SIZE_T)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth);
}
pIntermediate->Unmap(0, NULL);
if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
{
CD3DX12_BOX SrcBox( UINT( pLayouts[0].Offset ), UINT( pLayouts[0].Offset + pLayouts[0].Footprint.Width ) );
pCmdList->CopyBufferRegion(
pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
}
else
{
for (UINT i = 0; i < NumSubresources; ++i)
{
CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource);
CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]);
pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
}
}
return RequiredSize;
}
Lihat Contoh Kode di Referensi D3D12.
Persyaratan
Target Platform | Windows |
Header | d3d12.h |
Pustaka | D3d12.lib |
DLL | D3d12.dll |