Compartilhar via


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

Confira também

ID3D12GraphicsCommandList