ID3D12GraphicsCommandList::CopyBufferRegion, méthode (d3d12.h)

Copie une région d’une mémoire tampon d’une ressource vers une autre.

Syntaxe

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

Paramètres

[in] pDstBuffer

Type : ID3D12Resource*

Spécifie la destination ID3D12Resource.

DstOffset

Type : UINT64

Spécifie un décalage UINT64 (en octets) dans la ressource de destination.

[in] pSrcBuffer

Type : ID3D12Resource*

Spécifie la source ID3D12Resource.

SrcOffset

Type : UINT64

Spécifie un décalage UINT64 (en octets) dans la ressource source à partir de laquelle démarrer la copie.

NumBytes

Type : UINT64

Spécifie le nombre d’octets à copier.

Valeur de retour

None

Notes

Envisagez d’utiliser la méthode CopyResource lors de la copie d’une ressource entière et utilisez cette méthode pour copier des régions d’une ressource.

CopyBufferRegion peut être utilisé pour initialiser des ressources qui alias la même mémoire de tas. Pour plus d’informations , consultez CreatePlacedResource .

Exemples

L’exemple D3D12HelloTriangle utilise ID3D12GraphicsCommandList::CopyBufferRegion comme suit :

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

Consultez l’exemple de code dans la référence D3D12.

Spécifications

   
Plateforme cible Windows
En-tête d3d12.h
Bibliothèque D3d12.lib
DLL D3d12.dll

Voir aussi

CopyTextureRegion

ID3D12GraphicsCommandList