Compartir a través de


Método ID3D12GraphicsCommandList::CopyResource (d3d12.h)

Copia todo el contenido del recurso de origen en el recurso de destino.

Sintaxis

void CopyResource(
  [in] ID3D12Resource *pDstResource,
  [in] ID3D12Resource *pSrcResource
);

Parámetros

[in] pDstResource

Tipo: ID3D12Resource*

Puntero a la interfaz ID3D12Resource que representa el recurso de destino.

[in] pSrcResource

Tipo: ID3D12Resource*

Puntero a la interfaz ID3D12Resource que representa el recurso de origen.

Valor devuelto

None

Observaciones

Las operaciones CopyResource se realizan en la GPU y no incurren en una carga de trabajo de CPU significativa dependiente linealmente del tamaño de los datos que se van a copiar.

CopyResource se puede usar para inicializar recursos que alias la misma memoria del montón. Consulte CreatePlacedResource para obtener más detalles.

Capa de depuración

La capa de depuración emite un error si el subrecurso de origen no está en estado D3D12_RESOURCE_STATE_COPY_SOURCE .

La capa de depuración emite un error si el subrecurso de destino no está en estado D3D12_RESOURCE_STATE_COPY_DEST .

Restricciones

Este método tiene algunas restricciones diseñadas para mejorar el rendimiento. Por ejemplo, los recursos de origen y destino:

  • Debe ser recursos diferentes.
  • Debe ser el mismo tipo.
  • Debe ser el mismo tamaño total (bytes).
  • Debe tener dimensiones idénticas (ancho, alto, profundidad) o ser una copia de Reinterpret compatible.
  • Debe tener formatos DXGI compatibles, lo que significa que los formatos deben ser idénticos o al menos del mismo grupo de tipos. Por ejemplo, una textura de DXGI_FORMAT_R32G32B32_FLOAT se puede copiar en una textura DXGI_FORMAT_R32G32B32_UINT, ya que ambos formatos están en el grupo de DXGI_FORMAT_R32G32B32_TYPELESS. CopyResource puede copiar entre algunos tipos de formato (consulte Reinterpret copy).
  • No se puede asignar actualmente.

CopyResource solo admite la copia; no admite ningún ajuste, tecla de color ni mezcla.

CopyResource puede reinterpretar los datos de recursos entre algunos tipos de formato, consulte Reinterpret Copy a continuación para obtener más información.

Puede usar un recurso de galería de símbolos de profundidad como origen o destino. Los recursos creados con la funcionalidad de muestreo múltiple (consulte DXGI_SAMPLE_DESC) solo se pueden usar como origen y destino si tanto el origen como el destino tienen un recuento y una calidad multimueste idénticos. Si el origen y el destino difieren en el recuento y la calidad de varias muestras o si uno es multi muestreado y el otro no tiene muestreo múltiple, se produce un error en la llamada a CopyResource . Use ResolveSubresource para resolver un recurso de ejemplo múltiple en un recurso que no tiene muestreo múltiple.

El método es una llamada asincrónica, que se puede agregar a la cola de búfer de comandos. Esto intenta quitar los puestos de canalización que pueden producirse al copiar datos. Para obtener más información, consulte Consideraciones sobre el rendimiento.

Considere la posibilidad de usar CopyTextureRegion o CopyBufferRegion si solo necesita copiar una parte de los datos de un recurso.

Reinterpret copy

En la tabla siguiente se enumeran los formatos de origen y destino permitidos que puede usar en el tipo de reinterpretación de conversión de formato. Los valores de datos subyacentes no se convierten ni comprimen o descomprimen y deben codificarse correctamente para que la reinterpretación funcione según lo previsto. Para obtener más información, consulta Conversión de formato con Direct3D 10.1.

Para DXGI_FORMAT_R9G9B9E5_SHAREDEXP el ancho y el alto deben ser iguales (1 textura por bloque).

El ancho y el alto de los recursos comprimidos por bloque deben ser 4 veces el ancho y alto de los recursos sin comprimir (16 elementos de textura por bloque). Por ejemplo, una textura de DXGI_FORMAT_R32G32B32A32_UINT de 256 x 256 sin comprimir se asignará a una textura comprimida de 1024 x 1024 DXGI_FORMAT_BC5_UNORM.

Ancho de bits Recurso sin comprimir Recurso comprimido en bloque Diferencia de ancho/alto
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

Ejemplos

El ejemplo D3D12HeterogeneousMultiadapter usa CopyResource de la siguiente manera:

	// 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 Value
Plataforma de destino Windows
Encabezado d3d12.h
Library D3d12.lib
Archivo DLL D3d12.dll

Consulte también

ID3D12GraphicsCommandList