ID3D12GraphicsCommandList ::CopyResource, méthode (d3d12.h)
Copie l’intégralité du contenu de la ressource source dans la ressource de destination.
Syntaxe
void CopyResource(
[in] ID3D12Resource *pDstResource,
[in] ID3D12Resource *pSrcResource
);
Paramètres
[in] pDstResource
Type : ID3D12Resource*
Pointeur vers l’interface ID3D12Resource qui représente la ressource de destination.
[in] pSrcResource
Type : ID3D12Resource*
Pointeur vers l’interface ID3D12Resource qui représente la ressource source.
Valeur de retour
None
Remarques
Les opérations CopyResource sont effectuées sur le GPU et n’entraînent pas de charge de travail importante du processeur qui dépend linéairement de la taille des données à copier.
CopyResource peut être utilisé pour initialiser des ressources qui alias la même mémoire de tas. Pour plus d’informations, consultez CreatePlacedResource .
Couche Debug
La couche de débogage génère une erreur si la sous-ressource source n’est pas à l’état D3D12_RESOURCE_STATE_COPY_SOURCE .
La couche de débogage génère une erreur si la sous-ressource de destination n’est pas à l’état D3D12_RESOURCE_STATE_COPY_DEST .
Restrictions
Cette méthode a quelques restrictions conçues pour améliorer les performances. Par instance, les ressources source et de destination :
- Il doit s’agir de ressources différentes.
- Doit être du même type.
- Doit avoir la même taille totale (octets).
- Doit avoir des dimensions identiques (largeur, hauteur, profondeur) ou être une copie de réinterprétation compatible.
- Doit avoir des formats DXGI compatibles, ce qui signifie que les formats doivent être identiques ou au moins du même groupe de types. Par exemple, une texture DXGI_FORMAT_R32G32B32_FLOAT peut être copiée dans une texture DXGI_FORMAT_R32G32B32_UINT, car ces deux formats se trouvent dans le groupe DXGI_FORMAT_R32G32B32_TYPELESS. CopyResource peut copier entre quelques types de format (consultez Réinterpréter la copie).
- Impossible de mapper actuellement.
CopyResource prend uniquement en charge la copie ; il ne prend pas en charge l’étirement, la touche de couleur ou le mélange.
CopyResource peut réinterpréter les données de ressource entre quelques types de format. Pour plus d’informations, consultez Réinterpréter la copie ci-dessous.
Vous pouvez utiliser une ressource de gabarit de profondeur comme source ou destination. Les ressources créées avec la fonctionnalité multi-échantillonnage (voir DXGI_SAMPLE_DESC) ne peuvent être utilisées comme source et destination que si la source et la destination ont le même nombre et la même qualité multi-échantillonnés. Si la source et la destination diffèrent par le nombre et la qualité multi-échantillonnées ou si l’un d’eux est multi-échantillonné et que l’autre n’est pas multi-échantillonné, l’appel à CopyResource échoue. Utilisez ResolveSubresource pour résoudre une ressource à échantillon multiple en une ressource qui n’est pas multi-échantillonnées.
La méthode est un appel asynchrone, qui peut être ajouté à la file d’attente de la mémoire tampon de commande. Cela tente de supprimer les blocages de pipeline qui peuvent se produire lors de la copie de données. Pour plus d’informations, consultez Considérations relatives aux performances.
Envisagez d’utiliser CopyTextureRegion ou CopyBufferRegion si vous devez uniquement copier une partie des données dans une ressource.
Réinterpréter la copie
Le tableau suivant répertorie les formats source et de destination autorisés que vous pouvez utiliser dans le type de réinterprétation de la conversion de format. Les valeurs de données sous-jacentes ne sont pas converties ou compressées/décompressées et doivent être encodées correctement pour que la réinterprétation fonctionne comme prévu. Pour plus d’informations, consultez Formater la conversion à l’aide de Direct3D 10.1.
Pour DXGI_FORMAT_R9G9B9E5_SHAREDEXP la largeur et la hauteur doivent être égales (1 texel par bloc).
La largeur et la hauteur des ressources compressées par bloc doivent être 4 fois plus larges que la largeur et la hauteur des ressources non compressées (16 texels par bloc). Par exemple, une texture de DXGI_FORMAT_R32G32B32A32_UINT non compressée 256x256 est mappée à une texture compressée 1024x1024 DXGI_FORMAT_BC5_UNORM.
Largeur de bits | Ressource non compressée | Ressource compressée par bloc | Différence de largeur/hauteur |
---|---|---|---|
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 |
Exemples
L’exemple D3D12HeterogeneousMultiadapter utilise CopyResource de la manière suivante :
// 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());
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Windows |
En-tête | d3d12.h |
Bibliothèque | D3d12.lib |
DLL | D3d12.dll |