Condividi tramite


Metodo ID3D12GraphicsCommandList::CopyResource (d3d12.h)

Copia l'intero contenuto della risorsa di origine nella risorsa di destinazione.

Sintassi

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

Parametri

[in] pDstResource

Tipo: ID3D12Resource*

Puntatore all'interfaccia ID3D12Resource che rappresenta la risorsa di destinazione.

[in] pSrcResource

Tipo: ID3D12Resource*

Puntatore all'interfaccia ID3D12Resource che rappresenta la risorsa di origine.

Valore restituito

nessuno

Osservazioni

Le operazioni CopyResource vengono eseguite sulla GPU e non comportano un carico di lavoro cpu significativo in modo lineare dipendente dalle dimensioni dei dati da copiare.

CopyResource può essere usato per inizializzare le risorse che aliasno la stessa memoria heap. Per altre informazioni, vedere CreatePlacedResource .

Livello di debug

Il livello di debug genera un errore se la sottoresource di origine non è nello stato D3D12_RESOURCE_STATE_COPY_SOURCE .

Il livello di debug genera un errore se la sottoresource di destinazione non è nello stato D3D12_RESOURCE_STATE_COPY_DEST .

Restrizioni

Questo metodo ha alcune restrizioni progettate per migliorare le prestazioni. Ad esempio, le risorse di origine e di destinazione:

  • Devono essere risorse diverse.
  • Deve essere lo stesso tipo.
  • Deve essere la stessa dimensione totale (byte).
  • Deve avere dimensioni identiche (larghezza, altezza, profondità) o essere una copia reinterpretata compatibile.
  • Deve avere formati DXGI compatibili, che significa che i formati devono essere identici o almeno dallo stesso gruppo di tipi. Ad esempio, una trama DXGI_FORMAT_R32G32B32_FLOAT può essere copiata in una trama DXGI_FORMAT_R32G32B32_UINT poiché entrambi questi formati si trovano nel gruppo DXGI_FORMAT_R32G32B32_TYPELESS. CopyResource può copiare tra alcuni tipi di formato (vedere Copia reinterpretata).
  • Non è attualmente possibile eseguire il mapping.

CopyResource supporta solo la copia; non supporta alcun tratto, chiave di colore o miscela.

CopyResource può reinterpretare i dati delle risorse tra alcuni tipi di formato, vedere Reinterpret Copy sotto per informazioni dettagliate.

È possibile usare una risorsa depth-stencil come origine o destinazione. Le risorse create con funzionalità di campionamento multipla (vedere DXGI_SAMPLE_DESC) possono essere usate come origine e destinazione solo se sia l'origine che la destinazione hanno un conteggio e una qualità multi sample identici. Se l'origine e la destinazione differiscono nel conteggio e nella qualità multi sample o se uno è multi sampled e l'altro non è multi-sampled, la chiamata a CopyResource ha esito negativo. Usare ResolveSubresource per risolvere una risorsa a più campioni in una risorsa che non è multi-sampled.

Il metodo è una chiamata asincrona, che può essere aggiunta alla coda del buffer dei comandi. Questo tentativo di rimuovere i blocchi della pipeline che possono verificarsi durante la copia dei dati. Per altre informazioni, vedere Considerazioni sulle prestazioni.

È consigliabile usare CopyTextureRegion o CopyBufferRegion se è necessario copiare solo una parte dei dati in una risorsa.

Copia reinterpretata

Nella tabella seguente sono elencati i formati di origine e destinazione consentiti che è possibile usare nel tipo di reinterpretazione della conversione del formato. I valori dei dati sottostanti non vengono convertiti o compressi/decompressi e devono essere codificati correttamente per il funzionamento della reinterpretazione come previsto. Per altre informazioni, vedere Conversione del formato con Direct3D 10.1.

Per DXGI_FORMAT_R9G9B9E5_SHAREDEXP la larghezza e l'altezza devono essere uguali (1 texel per blocco).

La larghezza e l'altezza delle risorse compresse in blocchi devono essere pari a 4 volte la larghezza e l'altezza delle risorse non compresse (16 texel per blocco). Ad esempio, una trama di DXGI_FORMAT_R32G32B32A32_UINT DXGI_FORMAT_R32G32B32A32_UINT non compressa da 256x256 verrà mappata a una trama compressa di 102 DXGI_FORMAT_BC5_UNORM 4x1024.

Larghezza bit Risorsa non compressa Risorsa compressa a blocchi Differenza di larghezza/altezza
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

Esempio

L'esempio D3D12HeterogeneousMultiadapter usa CopyResource nel modo seguente:

	// 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()); 
	} 

Requisiti

Requisito Valore
Piattaforma di destinazione Windows
Intestazione d3d12.h
Libreria D3d12.lib
DLL D3d12.dll

Vedi anche

ID3D12GraphicsCommandList