Sous-ressources (Graphiques Direct3D 12)
Décrit comment une ressource est divisée en sous-ressources et comment référencer une seule, plusieurs ou tranches de sous-ressources.
-
Exemples de sous-ressources
- d’indexation de sous-ressources
- tranche Mip
- de tranche de tableau
- segment Plan
- plusieurs sous-ressources
- API de sous-ressource
- rubriques connexes
Exemples de sous-ressources
Si une ressource contient une mémoire tampon, il contient simplement une sous-ressource avec un index de 0. Si la ressource contient une texture (ou un tableau de textures), le référencement des sous-ressources est plus complexe.
Certaines API accèdent à une ressource entière (par exemple, la méthode ID3D12GraphicsCommandList ::CopyResource), d’autres accèdent à une partie d’une ressource (par exemple, la méthode ID3D12Resource ::ReadFromSubresource). Les méthodes qui accèdent à une partie d’une ressource utilisent généralement une description d’affichage (telle que la structure D3D12_TEX2D_ARRAY_SRV) pour spécifier les sous-ressources à accéder. Reportez-vous à la section API de sous-ressource pour obtenir une liste complète.
Indexation de sous-ressources
Pour indexer une sous-ressource particulière, les niveaux mip sont indexés en premier à mesure que chaque entrée de tableau est indexée.
Tranche Mip
Une tranche mip inclut un niveau mipmap pour chaque texture d’un tableau, comme illustré dans l’image suivante.
Tranche de tableau
Compte tenu d’un tableau de textures, chaque texture avec mipmaps, une tranche de tableau inclut une texture et tous ses niveaux mip, comme illustré dans l’image suivante.
Tranche de plan
En règle générale, les formats planaires ne sont pas utilisés pour stocker les données RVBA, mais dans les cas où il s’agit (peut-être 24bpp de données RVB), un plan peut représenter l’image rouge, l’un le vert et l’autre l’image bleue. Un plan n’est pas nécessairement une couleur, deux couleurs ou plus peuvent être combinées en un seul plan. Plus généralement, les données planaires sont utilisées pour les données YCbCr sous-échantillonées et Depth-Stencil données. Depth-Stencil est le seul format qui prend entièrement en charge les mipmaps, les tableaux et plusieurs plans (souvent le plan 0 pour la profondeur et le plan 1 pour le gabarit).
L’indexation de sous-ressources pour un tableau de deux images Depth-Stencil, chacune avec trois niveaux mip, est illustrée ci-dessous.
d’indexation de gabarit de profondeur
YCbCr sous-échantillonné prend en charge les tableaux et comporte des plans, mais ne prend pas en charge les mipmaps. Les images YCbCr ont deux plans, un pour la luminance (Y) auquel l’œil humain est le plus sensible, et un pour la chrominance (cb, et cr, entrelacé) dont l’œil humain est moins sensible. Ce format permet la compression des valeurs de chrominance afin de compresser une image sans affecter la luminosité et est un format de compression vidéo courant pour cette raison, bien qu’il soit utilisé pour compresser des images toujours. L’image ci-dessous montre le format NV12, notant que la chrominance a été compressée à un quart de la résolution de la luminance, ce qui signifie que la largeur de chaque plan est identique et que le plan de chrominance est de moitié la hauteur du plan de luminance. Les plans sont indexés sous forme de sous-ressources de manière identique à l’exemple de Depth-Stencil ci-dessus.
Les formats planaires existaient dans Direct3D 11, mais les plans individuels ne pouvaient pas être traités individuellement, par exemple pour les opérations de copie ou de mappage. Cela a été modifié dans Direct3D 12 afin que chaque plan ait reçu son propre ID de sous-source. Comparez les deux méthodes suivantes pour calculer l’ID de sous-ressource.
Direct3D 11
inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
return MipSlice + (ArraySlice * MipLevels);
}
Direct3D 12
inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{
return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize);
}
La plupart du matériel suppose que la mémoire du plan N est toujours immédiatement allouée après le plan N-1.
Une alternative à l’utilisation de sous-ressources est qu’une application peut allouer une ressource complètement distincte par plan. Dans ce cas, l’application comprend que les données sont planaires et utilise plusieurs ressources pour les représenter.
Plusieurs sous-ressources
Une vue nuanceur-ressource peut sélectionner n’importe quelle région rectangulaire de sous-ressources, à l’aide de l’une des tranches décrites ci-dessus et d’une utilisation judicieuse des champs dans les structures d’affichage (telles que D3D12_TEX2D_ARRAY_SRV), comme illustré dans l’image.
Une vue de cible de rendu ne peut utiliser qu’une seule sous-ressource ou tranche mip et ne peut pas inclure de sous-ressources de plusieurs tranches mip. Autrement dit, chaque texture d’une vue de cible de rendu doit être de la même taille. Une vue nuanceur-ressource peut sélectionner n’importe quelle région rectangulaire de sous-ressources, comme illustré dans l’image.
API de sous-ressource
Les API suivantes font référence et fonctionnent avec les sous-ressources :
Énumérations:
Les structures suivantes contiennent index PlaneSlice, la plupart contiennent index MipSlice.
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
Les structures suivantes contiennent des index ArraySlice, la plupart contiennent index MipSlice.
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
Les structures suivantes contiennent index MipSlice, mais ni arraySlice ni Index PlaneSlice.
Les structures suivantes font également référence à des sous-ressources :
- D3D12_DISCARD_REGION : structure utilisée en préparation de l’abandon d’une ressource.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT : ajoute un décalage dans une ressource à l’empreinte de base.
- D3D12_RESOURCE_TRANSITION_BARRIER : décrit la transition des sous-ressources entre différentes utilisations (ressource de nuanceur, cible de rendu, etc.).
- D3D12_SUBRESOURCE_DATA : les données de sous-source incluent les données elles-mêmes, ainsi que la ligne et le pas de tranche.
- D3D12_SUBRESOURCE_FOOTPRINT : une empreinte inclut le format, la largeur, la hauteur, la profondeur et le tangage de la sous-ressource.
- D3D12_SUBRESOURCE_INFO : contient le décalage, la hauteur de ligne et la hauteur de profondeur de la sous-ressource.
- D3D12_SUBRESOURCE_TILING : décrit un volume de sous-ressource en mosaïque (reportez-vous à ressources en mosaïques en volume).
- D3D12_TEXTURE_COPY_LOCATION : décrit une partie d’une texture à des fins de copie.
- D3D12_TILED_RESOURCE_COORDINATE : décrit les coordonnées d’une ressource en mosaïque.
Méthode:
- ID3D12Device ::GetCopyableFootprints : obtient des informations sur une ressource pour permettre la création d’une copie.
- ID3D12Device ::GetResourceTiling : obtient des informations sur la façon dont une ressource en mosaïque est divisée en vignettes.
- ID3D12GraphicsCommandList ::ResolveSubresource : copie une sous-ressource multi-échantillonnées dans une sous-ressource non-échantillonnées.
- ID3D12Resource ::Map : retourne un pointeur vers les données spécifiées dans la ressource et refuse l’accès GPU à la sous-ressource.
- ID3D12Resource ::ReadFromSubresource : copie les données à partir d’une sous-source ou d’une région rectangulaire d’une sous-ressource.
- ID3D12Resource ::Unmap : annule le mappage de la plage de mémoire spécifiée et invalide le pointeur vers la ressource. Rétablit l’accès GPU à la sous-ressource.
- ID3D12Resource ::WriteToSubresource : copie les données dans une sous-source ou une région rectangulaire d’une sous-ressource.
Les textures doivent être dans l’état de D3D12_RESOURCE_STATE_COMMON pour l’accès au processeur via writeToSubresource et ReadFromSubresource être légales ; mais les mémoires tampons ne le font pas. L’accès au processeur à une ressource est généralement effectué via Map/Unmap.
Rubriques connexes