Sous-ressources (graphismes 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
Si une ressource contient une mémoire tampon, elle 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 auxquelles accéder. Pour obtenir la liste complète, reportez-vous à la section API de sous-ressources .
Indexation des 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 comprend un niveau de mipmap pour chaque texture d’un tableau, comme illustré dans l’image suivante.
Tranche de tableau
Étant donné un tableau de textures, chaque texture avec des mipmaps, une tranche de tableau comprend 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 des données RVBA, mais dans les cas où elles sont (peut-être des données RVB de 24 bpp), un plan peut représenter l’image rouge, l’un le vert et l’autre l’image bleue. Toutefois, 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 et Depth-Stencil sous-échantillonné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 Depth et le plan 1 pour Stencil).
L’indexation des sous-ressources pour un tableau de deux images Depth-Stencil, chacune avec trois niveaux mip, est illustrée ci-dessous.
YCbCr sous-échantillonné prend en charge les tableaux et a des plans, mais ne prend pas en charge les mipmaps. Les images YCbCr ont deux plans, l’un pour la luminance (Y) à laquelle l’œil humain est le plus sensible, et l’autre pour la chrominance (à la fois Cb, et Cr, entrelacé) à laquelle l’œil humain est moins sensible. Ce format permet la compression des valeurs de chrominance afin de compresser une image sans affecter la luminosité. Il s’agit d’un format de compression vidéo courant pour cette raison, bien qu’il soit utilisé pour compresser des images fixes. 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 la moitié de la hauteur du plan de luminance. Les plans sont indexés en tant que sous-ressources d’une manière identique à l’exemple 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 reçoive son propre ID de sous-ressource. 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 allouée immédiatement 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 de l’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 avoir 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 référencent et fonctionnent avec des sous-ressources :
Énumérations :
Les structures suivantes contiennent des index PlaneSlice , la plupart contiennent des 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 des 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 des index MipSlice , mais ni arraySlice ni des index PlaneSlice .
Les structures suivantes font également référence à des sous-ressources :
- D3D12_DISCARD_REGION : structure utilisée pour préparer 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-ressource incluent les données elles-mêmes, ainsi que le pitch de ligne et de tranche.
- D3D12_SUBRESOURCE_FOOTPRINT : une empreinte comprend le format, la largeur, la hauteur, la profondeur et la hauteur de la sous-ressource.
- D3D12_SUBRESOURCE_INFO : contient le décalage, la hauteur de ligne et la profondeur de la sous-ressource.
- D3D12_SUBRESOURCE_TILING : décrit un volume de sous-ressource en mosaïque (reportez-vous à Ressources en mosaïque).
- 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éthodes :
- 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 à échantillonnage multiple dans une sous-ressource non-multi-échantillonné.
- 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 d’une sous-ressource 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-ressource ou une région rectangulaire d’une sous-ressource.
Les textures doivent être à l’état D3D12_RESOURCE_STATE_COMMON pour que l’accès au processeur via WriteToSubresource et ReadFromSubresource soit légal ; mais pas les mémoires tampons. L’accès du processeur à une ressource s’effectue généralement via Map/Unmap.
Rubriques connexes