Método ID3D12GraphicsCommandList::CopyResource (d3d12.h)
Copia todo o conteúdo do recurso de origem para o recurso de destino.
Sintaxe
void CopyResource(
[in] ID3D12Resource *pDstResource,
[in] ID3D12Resource *pSrcResource
);
Parâmetros
[in] pDstResource
Tipo: ID3D12Resource*
Um ponteiro para a interface ID3D12Resource que representa o recurso de destino.
[in] pSrcResource
Tipo: ID3D12Resource*
Um ponteiro para a interface ID3D12Resource que representa o recurso de origem.
Retornar valor
Nenhum
Comentários
As operações CopyResource são executadas na GPU e não incorrem em uma carga de trabalho significativa da CPU linearmente dependente do tamanho dos dados a serem copiados.
CopyResource pode ser usado para inicializar recursos que alias a mesma memória de heap. Consulte CreatePlacedResource para obter mais detalhes.
Camada de depuração
A camada de depuração emitirá um erro se o sub-recurso de origem não estiver no estado D3D12_RESOURCE_STATE_COPY_SOURCE .
A camada de depuração emitirá um erro se o sub-recurso de destino não estiver no estado D3D12_RESOURCE_STATE_COPY_DEST .
Restrições
Esse método tem algumas restrições projetadas para melhorar o desempenho. Por exemplo, os recursos de origem e destino:
- Deve ser recursos diferentes.
- Deve ser do mesmo tipo.
- Deve ter o mesmo tamanho total (bytes).
- Deve ter dimensões idênticas (largura, altura, profundidade) ou ser uma Cópia Reinterpreta compatível.
- Deve ter formatos DXGI compatíveis, o que significa que os formatos devem ser idênticos ou pelo menos do mesmo grupo de tipos. Por exemplo, uma textura DXGI_FORMAT_R32G32B32_FLOAT pode ser copiada para uma textura DXGI_FORMAT_R32G32B32_UINT, pois ambos os formatos estão no grupo DXGI_FORMAT_R32G32B32_TYPELESS. CopyResource pode copiar entre alguns tipos de formato (consulte Reinterpret copy).
- Não pode ser mapeado no momento.
O CopyResource dá suporte apenas à cópia; ele não dá suporte a qualquer alongamento, chave de cor ou mesclagem.
CopyResource pode reinterpretar os dados de recurso entre alguns tipos de formato, consulte Reinterpret Copy abaixo para obter detalhes.
Você pode usar um recurso de estêncil de profundidade como uma origem ou um destino. Os recursos criados com a funcionalidade de amostragem múltipla (consulte DXGI_SAMPLE_DESC) só poderão ser usados como origem e destino se a origem e o destino tiverem uma contagem e qualidade de várias amostras idênticas. Se a origem e o destino forem diferentes na contagem e na qualidade de várias amostras ou se uma for de várias amostras e a outra não for de várias amostras, a chamada para CopyResource falhará. Use ResolveSubresource para resolve um recurso de várias amostras para um recurso que não é de várias amostras.
O método é uma chamada assíncrona, que pode ser adicionada à fila de buffer de comando. Isso tenta remover as paralisações de pipeline que podem ocorrer ao copiar dados. Para obter mais informações, consulte considerações de desempenho.
Considere usar CopyTextureRegion ou CopyBufferRegion se você só precisar copiar uma parte dos dados em um recurso.
Reinterpretar cópia
A tabela a seguir lista os formatos de origem e destino permitidos que você pode usar no tipo de reinterpretação de conversão de formato. Os valores de dados subjacentes não são convertidos ou compactados/descompactados e devem ser codificados corretamente para que a reinterpretação funcione conforme o esperado. Para obter mais informações, consulte Conversão de formato usando o Direct3D 10.1.
Por DXGI_FORMAT_R9G9B9E5_SHAREDEXP a largura e a altura devem ser iguais (1 texel por bloco).
A largura e a altura do recurso compactado por bloco devem ser 4 vezes a largura e a altura do recurso descompactados (16 texels por bloco). Por exemplo, uma textura de 256 x 256 DXGI_FORMAT_R32G32B32A32_UINT descompactada será mapeada para uma textura compactada de 1024 x 1024 DXGI_FORMAT_BC5_UNORM.
Largura do bit | Recurso descompactado | Recurso compactado por bloco | Diferença de largura/altura |
---|---|---|---|
32 | DXGI_FORMAT_R32_UINT DXGI_FORMAT_R32_SINT |
DXGI_FORMAT_R9G9B9E5_SHAREDEXP | 1:1 |
64 | DXGI_FORMAT_R16G16B16A16_UINT DXGI_FORMAT_R16G16B16A16_SINT DXGI_FORMAT_R32G32_UINT DXGI_FORMAT_R32G32_SINT |
DXGI_FORMAT_BC1_UNORM[_SRGB] DXGI_FORMAT_BC4_UNORM DXGI_FORMAT_BC4_SNORM |
1:4 |
128 | DXGI_FORMAT_R32G32B32A32_UINT DXGI_FORMAT_R32G32B32A32_SINT |
DXGI_FORMAT_BC2_UNORM[_SRGB] DXGI_FORMAT_BC3_UNORM[_SRGB] DXGI_FORMAT_BC5_UNORM DXGI_FORMAT_BC5_SNORM |
1:4 |
Exemplos
O exemplo D3D12HeterogeneousMultiadapter usa CopyResource da seguinte maneira:
// Command list to copy the render target to the shared heap on the primary adapter.
{
const GraphicsAdapter adapter = Primary;
// Reset the copy command allocator and command list.
ThrowIfFailed(m_copyCommandAllocators[m_frameIndex]->Reset());
ThrowIfFailed(m_copyCommandList->Reset(m_copyCommandAllocators[m_frameIndex].Get(), nullptr));
// Copy the intermediate render target to the cross-adapter shared resource.
// Transition barriers are not required since there are fences guarding against
// concurrent read/write access to the shared heap.
if (m_crossAdapterTextureSupport)
{
// If cross-adapter row-major textures are supported by the adapter,
// simply copy the texture into the cross-adapter texture.
m_copyCommandList->CopyResource(m_crossAdapterResources[adapter][m_frameIndex].Get(), m_renderTargets[adapter][m_frameIndex].Get());
}
else
{
// If cross-adapter row-major textures are not supported by the adapter,
// the texture will be copied over as a buffer so that the texture row
// pitch can be explicitly managed.
// Copy the intermediate render target into the shared buffer using the
// memory layout prescribed by the render target.
D3D12_RESOURCE_DESC renderTargetDesc = m_renderTargets[adapter][m_frameIndex]->GetDesc();
D3D12_PLACED_SUBRESOURCE_FOOTPRINT renderTargetLayout;
m_devices[adapter]->GetCopyableFootprints(&renderTargetDesc, 0, 1, 0, &renderTargetLayout, nullptr, nullptr, nullptr);
CD3DX12_TEXTURE_COPY_LOCATION dest(m_crossAdapterResources[adapter][m_frameIndex].Get(), renderTargetLayout);
CD3DX12_TEXTURE_COPY_LOCATION src(m_renderTargets[adapter][m_frameIndex].Get(), 0);
CD3DX12_BOX box(0, 0, m_width, m_height);
m_copyCommandList->CopyTextureRegion(&dest, 0, 0, 0, &src, &box);
}
ThrowIfFailed(m_copyCommandList->Close());
}
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Windows |
Cabeçalho | d3d12.h |
Biblioteca | D3d12.lib |
DLL | D3d12.dll |