ID3D12GraphicsCommandList::CopyBufferRegion-Methode (d3d12.h)

Kopiert einen Bereich eines Puffers von einer Ressource in eine andere.

Syntax

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

Parameter

[in] pDstBuffer

Typ: ID3D12Resource*

Gibt die Ziel-ID3D12Resource an.

DstOffset

Typ: UINT64

Gibt einen UINT64-Offset (in Bytes) in die Zielressource an.

[in] pSrcBuffer

Typ: ID3D12Resource*

Gibt die Quell-ID3D12Resource an.

SrcOffset

Typ: UINT64

Gibt einen UINT64-Offset (in Bytes) in die Quellressource an, über den die Kopie gestartet werden soll.

NumBytes

Typ: UINT64

Gibt die Anzahl der zu kopierenden Bytes an.

Rückgabewert

Keine

Bemerkungen

Erwägen Sie die Verwendung der CopyResource-Methode beim Kopieren einer gesamten Ressource, und verwenden Sie diese Methode zum Kopieren von Regionen einer Ressource.

CopyBufferRegion kann verwendet werden, um Ressourcen zu initialisieren, die denselben Heapspeicher aufweisen. Weitere Informationen finden Sie unter CreatePlacedResource .

Beispiele

Im D3D12HelloTriangle-Beispiel wird ID3D12GraphicsCommandList::CopyBufferRegion wie folgt verwendet:

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

Weitere Informationen finden Sie unter Beispielcode in der D3D12-Referenz.

Anforderungen

   
Zielplattform Windows
Kopfzeile d3d12.h
Bibliothek D3d12.lib
DLL D3d12.dll

Weitere Informationen

CopyTextureRegion

ID3D12GraphicsCommandList