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 |