Método ID3D12GraphicsCommandList::CopyBufferRegion (d3d12.h)
Copia una región de un búfer de un recurso a otro.
Sintaxis
void CopyBufferRegion(
[in] ID3D12Resource *pDstBuffer,
UINT64 DstOffset,
[in] ID3D12Resource *pSrcBuffer,
UINT64 SrcOffset,
UINT64 NumBytes
);
Parámetros
[in] pDstBuffer
Tipo: ID3D12Resource*
Especifica el id3D12Resource de destino.
DstOffset
Tipo: UINT64
Especifica un desplazamiento UINT64 (en bytes) en el recurso de destino.
[in] pSrcBuffer
Tipo: ID3D12Resource*
Especifica el origen ID3D12Resource.
SrcOffset
Tipo: UINT64
Especifica un desplazamiento UINT64 (en bytes) en el recurso de origen, desde el que iniciar la copia.
NumBytes
Tipo: UINT64
Especifica el número de bytes que se van a copiar.
Valor devuelto
None
Observaciones
Considere la posibilidad de usar el método CopyResource al copiar un recurso completo y use este método para copiar regiones de un recurso.
CopyBufferRegion se puede usar para inicializar recursos que alias la misma memoria del montón. Consulte CreatePlacedResource para obtener más detalles.
Ejemplos
El ejemplo D3D12HelloTriangle usa ID3D12GraphicsCommandList::CopyBufferRegion de la siguiente manera:
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;
}
Vea Código de ejemplo en la referencia D3D12.
Requisitos
Plataforma de destino | Windows |
Encabezado | d3d12.h |
Library | D3d12.lib |
Archivo DLL | D3d12.dll |