Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

ID3D12GraphicsCommandList::CopyBufferRegion method (d3d12.h)

Copies a region of a buffer from one resource to another.

Syntax

void CopyBufferRegion(
 [in] ID3D12Resource *pDstBuffer,
 UINT64 DstOffset,
 [in] ID3D12Resource *pSrcBuffer,
 UINT64 SrcOffset,
 UINT64 NumBytes
);

Parameters

[in] pDstBuffer

Type: ID3D12Resource*

Specifies the destination ID3D12Resource.

DstOffset

Type: UINT64

Specifies a UINT64 offset (in bytes) into the destination resource.

[in] pSrcBuffer

Type: ID3D12Resource*

Specifies the source ID3D12Resource.

SrcOffset

Type: UINT64

Specifies a UINT64 offset (in bytes) into the source resource, to start the copy from.

NumBytes

Type: UINT64

Specifies the number of bytes to copy.

Return value

None

Remarks

Consider using the CopyResource method when copying an entire resource, and use this method for copying regions of a resource.

CopyBufferRegion may be used to initialize resources which alias the same heap memory. See CreatePlacedResource for more details.

Examples

The D3D12HelloTriangle sample uses ID3D12GraphicsCommandList::CopyBufferRegion as follows:

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;
}

See Example Code in the D3D12 Reference.

Requirements

Requirement Value
Target Platform Windows
Header d3d12.h
Library D3d12.lib
DLL D3d12.dll

See also

CopyTextureRegion

ID3D12GraphicsCommandList


Feedback

Was this page helpful?

Additional resources