ID3D12GraphicsCommandList::CopyBufferRegion 메서드(d3d12.h)

버퍼의 영역을 한 리소스에서 다른 리소스로 복사합니다.

구문

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

매개 변수

[in] pDstBuffer

형식: ID3D12Resource*

대상 ID3D12Resource를 지정합니다.

DstOffset

형식: UINT64

대상 리소스에 대한 UINT64 오프셋(바이트)을 지정합니다.

[in] pSrcBuffer

형식: ID3D12Resource*

원본 ID3D12Resource를 지정합니다.

SrcOffset

형식: UINT64

원본 리소스에 대한 UINT64 오프셋(바이트)을 지정하여 복사를 시작합니다.

NumBytes

형식: UINT64

복사할 바이트 수를 지정합니다.

반환 값

없음

설명

전체 리소스를 복사할 때 CopyResource 메서드를 사용하는 것이 좋습니다. 이 메서드를 사용하여 리소스의 지역을 복사합니다.

CopyBufferRegion 을 사용하여 동일한 힙 메모리를 별칭으로 지정하는 리소스를 초기화할 수 있습니다. 자세한 내용은 CreatePlacedResource 를 참조하세요.

예제

D3D12HelloTriangle 샘플은 다음과 같이 ID3D12GraphicsCommandList::CopyBufferRegion을 사용합니다.

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

D3D12 참조의 예제 코드를 참조하세요.

요구 사항

   
대상 플랫폼 Windows
헤더 d3d12.h
라이브러리 D3d12.lib
DLL D3d12.dll

추가 정보

CopyTextureRegion

ID3D12GraphicsCommandList