ID3D12GraphicsCommandList ::CopyTextureRegion, méthode (d3d12.h)
Cette méthode utilise le GPU pour copier des données de texture entre deux emplacements. La source et la destination peuvent faire référence à des données de texture situées au sein d’une ressource de mémoire tampon ou d’une ressource de texture.
Syntaxe
void CopyTextureRegion(
[in] const D3D12_TEXTURE_COPY_LOCATION *pDst,
UINT DstX,
UINT DstY,
UINT DstZ,
[in] const D3D12_TEXTURE_COPY_LOCATION *pSrc,
[in, optional] const D3D12_BOX *pSrcBox
);
Paramètres
[in] pDst
Type : const D3D12_TEXTURE_COPY_LOCATION*
Spécifie le D3D12_TEXTURE_COPY_LOCATION de destination. La sous-ressource référencée doit être à l’état D3D12_RESOURCE_STATE_COPY_DEST.
DstX
Type : UINT
Coordonnée x du coin supérieur gauche de la région de destination.
DstY
Type : UINT
Coordonnée y du coin supérieur gauche de la région de destination. Pour une sous-ressource 1D, cette valeur doit être égale à zéro.
DstZ
Type : UINT
Coordonnée z du coin supérieur gauche de la région de destination. Pour une sous-ressource 1D ou 2D, cette valeur doit être égale à zéro.
[in] pSrc
Type : const D3D12_TEXTURE_COPY_LOCATION*
Spécifie le D3D12_TEXTURE_COPY_LOCATION source. La sous-ressource référencée doit être à l’état D3D12_RESOURCE_STATE_COPY_SOURCE.
[in, optional] pSrcBox
Type : const D3D12_BOX*
Spécifie une D3D12_BOX facultative qui définit la taille de la texture source à copier.
Valeur de retour
None
Remarques
La zone source doit être dans la taille de la ressource source. Les décalages de destination (x, y et z) permettent à la zone source d’être décalée lors de l’écriture dans la ressource de destination ; toutefois, les dimensions de la zone source et les décalages doivent être dans la taille de la ressource. Si vous essayez de copier en dehors de la ressource de destination ou si vous spécifiez une zone source supérieure à la ressource source, le comportement de CopyTextureRegion n’est pas défini. Si vous avez créé un appareil qui prend en charge la couche de débogage, la sortie de débogage signale une erreur sur cet appel CopyTextureRegion non valide. Les paramètres non valides de CopyTextureRegion entraînent un comportement non défini et peuvent entraîner un rendu incorrect, une coupure, aucune copie ou même la suppression de l’appareil de rendu.
Si les ressources sont des mémoires tampons, toutes les coordonnées sont en octets ; si les ressources sont des textures, toutes les coordonnées sont en texels.
CopyTextureRegion effectue la copie sur le GPU (comme par memcpy
le processeur). Par conséquent, les ressources source et de destination :
- Il doit s’agir de sous-ressources différentes (bien qu’elles puissent provenir de la même ressource).
- Doit avoir des DXGI_FORMATcompatibles (identiques ou 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. CopyTextureRegion peut copier entre quelques types de format. Pour plus d’informations, consultez Formater la conversion à l’aide de Direct3D 10.1.
Notez que pour une mémoire tampon de gabarit de profondeur, les plans de profondeur et de gabarit sont des sous-ressources distinctes au sein de la mémoire tampon.
Pour copier une ressource entière, plutôt que simplement une région d’une sous-ressource, nous vous recommandons d’utiliser CopyResource à la place.
Exemple
L’extrait de code suivant copie la zone (située à (120 100),(200 220)) à partir d’une texture source dans la région (10 200), (90 140) dans une texture de destination.D3D12_BOX sourceRegion;
sourceRegion.left = 120;
sourceRegion.top = 100;
sourceRegion.right = 200;
sourceRegion.bottom = 220;
sourceRegion.front = 0;
sourceRegion.back = 1;
pCmdList -> CopyTextureRegion(pDestTexture, 10, 20, 0, pSourceTexture, &sourceRegion);
Notez que pour une texture 2D, les valeurs avant et arrière sont définies sur 0 et 1 respectivement.
Exemples
L’exemple HelloTriangle utilise ID3D12GraphicsCommandList ::CopyTextureRegion comme suit :
inline UINT64 UpdateSubresources(
_In_ ID3D12GraphicsCommandList* pCmdList,
_In_ ID3D12Resource* pDestinationResource,
_In_ ID3D12Resource* pIntermediate,
_In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
_In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
UINT64 RequiredSize,
_In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
_In_reads_(NumSubresources) const UINT* pNumRows,
_In_reads_(NumSubresources) const UINT64* pRowSizesInBytes,
_In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData)
{
// Minor validation
D3D12_RESOURCE_DESC IntermediateDesc = pIntermediate->GetDesc();
D3D12_RESOURCE_DESC DestinationDesc = pDestinationResource->GetDesc();
if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
RequiredSize > (SIZE_T)-1 ||
(DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
(FirstSubresource != 0 || NumSubresources != 1)))
{
return 0;
}
BYTE* pData;
HRESULT hr = pIntermediate->Map(0, NULL, reinterpret_cast<void**>(&pData));
if (FAILED(hr))
{
return 0;
}
for (UINT i = 0; i < NumSubresources; ++i)
{
if (pRowSizesInBytes[i] > (SIZE_T)-1) return 0;
D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, pLayouts[i].Footprint.RowPitch * pNumRows[i] };
MemcpySubresource(&DestData, &pSrcData[i], (SIZE_T)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth);
}
pIntermediate->Unmap(0, NULL);
if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
{
CD3DX12_BOX SrcBox( UINT( pLayouts[0].Offset ), UINT( pLayouts[0].Offset + pLayouts[0].Footprint.Width ) );
pCmdList->CopyBufferRegion(
pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
}
else
{
for (UINT i = 0; i < NumSubresources; ++i)
{
CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource);
CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]);
pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
}
}
return RequiredSize;
}
Consultez l’exemple de code dans la référence D3D12.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Windows |
En-tête | d3d12.h |
Bibliothèque | D3d12.lib |
DLL | D3d12.dll |