Sous-ressources (Direct3D 12 Graphics)

Décrit comment une ressource est divisée en sous-ressources et comment référencer une seule, plusieurs ou plusieurs 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 (telle que 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 de la vue (telle que la structure _ SRV du _ tableau _ D3D12 TEX2D ) pour spécifier les sous-ressources auxquelles accéder. Reportez-vous à la section API des sous- ressources pour obtenir une liste complète.

Indexation des sous-ressources

Pour indexer une sous-ressource particulière, les niveaux MIP sont indexés en premier lorsque chaque entrée de tableau est indexée.

indexation des sous-ressources

Tranche MIP

Une tranche MIP comprend un niveau de mipmap pour chaque texture d’un tableau, comme illustré dans l’image suivante.

tranches MIP de sous-ressources

Tranche de tableau

À partir d’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.

tranches de groupe de sous-ressources

Tranche plan

En général, les formats planaires ne sont pas utilisés pour stocker les données RVBA, mais dans les cas où il s’agit (par exemple, des données RGB 24bpp), un plan peut représenter l’image rouge, l’image verte et l’image bleue. Toutefois, un plan n’est pas nécessairement une couleur, deux couleurs ou plus peuvent être combinées dans un plan. Plus généralement, les données planaires sont utilisées pour les données de Depth-Stencil et YCbCr sous-échantillonnées. Depth-Stencil est le seul format qui prend entièrement en charge les des mipmaps, les tableaux et les plans multiples (souvent le plan 0 pour la profondeur et le plan 1 du stencil).

L’indexation des sous-ressources pour un tableau de deux images Depth-Stencil, chacune avec trois niveaux MIP, est illustrée ci-dessous.

indexation du stencil de profondeur

Le sous-échantillon YCbCr prend en charge les tableaux et contient des plans, mais ne prend pas en charge des mipmaps. Les images YCbCr ont deux plans, l’un pour la luminance (Y), dont l’oeil humain est le plus sensible, et l’autre pour la chrominance (à la fois CB et CR, entrelacé) qui est moins sensible à l’oeil humain. Ce format permet la compression des valeurs de chrominance afin de compresser une image sans affecter la luminance, et est un format de compression vidéo courant pour cette raison, bien qu’elle soit utilisée pour compresser des images fixes. L’image ci-dessous montre le format NV12, en 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 correspond à la moitié de la hauteur du plan de luminance. Les plans sont indexés en tant que sous-ressources de manière identique à l’exemple de Depth-Stencil ci-dessus.

format nv12

Les formats planaires existaient dans Direct3D 11, mais les plans individuels n’ont pas pu ê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-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 pour le 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 les données planes et utilise plusieurs ressources pour les représenter.

Sous-ressources multiples

Un affichage des ressources de nuanceur peut sélectionner n’importe quelle zone 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 de vue (par exemple, D3D12 _ TEX2D _ array _ SRV), comme indiqué dans l’image.

sélection de plusieurs sous-ressources

Une vue de cible de rendu ne peut utiliser qu’une seule sous-ressource ou une seule tranche MIP et ne peut pas inclure de sous-ressources de plus d’une tranche MIP. Autrement dit, chaque texture dans une vue de cible de rendu doit avoir la même taille. Un affichage des ressources de nuanceur peut sélectionner n’importe quelle zone rectangulaire de sous-ressources, comme illustré dans l’image.

API de sous-ressource

Les API suivantes référencent et utilisent des sous-ressources :

Énumérations :

Les structures suivantes contiennent des index PlaneSlice , la plupart contiennent des index MipSlice .

Les structures suivantes contiennent des index ArraySlice , la plupart contiennent des index MipSlice .

Les structures suivantes contiennent des index MipSlice , mais ni des index ArraySlice , ni des index PlaneSlice .

Les structures suivantes référencent également des sous-ressources :

Méthodes :

Les textures doivent être dans l’État commun de l’état de la _ ressource _ _ D3D12 pour que l’accès au processeur via WriteToSubresource et ReadFromSubresource soit légal, mais ce n’est pas le cas des tampons. L’accès de l’UC à une ressource est généralement effectué par le biais de mappages de mappage / .

Liaison de ressource