Vue d’ensemble
Le tiling de textures, également appelé swizzling de textures, est la méthode par laquelle le GPU définit l’agencement des mipmaps d’une texture et la façon dont les texels de chaque mipmap sont indexés. Cette rubrique décrit en quoi le GPU XBOX Series X|S diffère des GPU XBOX One (X), à la fois pour la disposition des mipmaps et l’ordre des texels. Le GPU XBOX Series X|S utilise des motifs de swizzle différents de ceux des GPU de la génération XBOX One. L’ordre des texels au sein d’un niveau de mip (le motif de swizzle) a changé, de même que l’ordre et l’alignement des niveaux de mip. Comme pour la génération XBOX One, la bibliothèque XG est disponible pour calculer les dispositions des mips de textures et les motifs de swizzling des texels. La version XBOX Series X|S de XG s’appelle XG_XS et peut être utilisée hors ligne ou au runtime, en compilant et en liant avec xg_xs.h et xg_xs.lib. L’API est très semblable à celle de XG pour XBOX One, avec des modifications liées au mode de swizzle (par opposition au mode de tile) et certains champs modifiés dans les structures de sortie pour refléter les nouveaux attributs du GPU XBOX Series X|S.Dispositions des mipmaps
Sur le GPU XBOX Series X|S, les niveaux de mip sont désormais stockés en mémoire dans l’ordre inverse : les plus petits niveaux de mip (la queue de mips) se trouvent près de l’offset 0 dans la texture, suivis de niveaux de mip de plus en plus grands, le plus grand niveau de mip (mip 0) étant situé à l’offset le plus éloigné de l’adresse de base de la texture. Les textures de tableau sont implémentées différemment, désormais sous la forme d’un tableau de chaînes de mips (par exemple, les mips n-0 de la tranche 0, suivis des mips n-0 de la tranche 1). Pour les GPU de la génération XBOX One, une texture de tableau était implémentée sous la forme d’une chaîne de mips de tableaux (par exemple, toutes les tranches du mip 0, suivies de toutes les tranches du mip 1). Le code de traitement de textures hors ligne utilisant la bibliothèque XG devra s’adapter aux nouvelles dispositions XBOX Series X|S, de même que tout code de streaming de textures au runtime qui faisait des hypothèses sur l’ordre et l’alignement des mips. Les dispositions des mips reposent sur une taille de bloc de texture. Le choix du mode de swizzle (défini ci-dessous) spécifie une taille de bloc de texture. Il existe cinq tailles de bloc possibles : linéaire, 256 octets, 4 Ko, 64 Ko et variable. Chacune des tailles de bloc définit les dimensions de remplissage pour la hauteur et la largeur des mips, en fonction de la dimension de la texture (1D, 2D ou 3D) et de la taille des éléments en octets. Le remplissage de chaque niveau de mip jusqu’à la taille de bloc implique que les offsets des mips sont alignés sur la taille de bloc. Pour éviter une consommation de mémoire excessive pour les textures avec mipmaps utilisant les plus grandes tailles de bloc (4 Ko et 64 Ko), tous les niveaux de mip plus petits qu’un bloc sont regroupés dans une queue de mips de la taille d’un bloc, située à l’offset 0 dans la disposition de la texture. Les niveaux de mip de la queue de mips sont alignés sur 256 octets. Pour les plus petites tailles de bloc (linéaire et 256 octets), les niveaux de mip sont alignés sur 256 octets et ne diffèrent que par les dimensions de remplissage. Le mode de bloc 256 octets utilise des dimensions de remplissage 2D/3D, tandis que le mode de bloc linéaire spécifie toujours une hauteur et une profondeur de remplissage de 1. Les modes de swizzle à taille de bloc « variable » sont pris en charge, mais ne sont pas sélectionnés par défaut par les pilotes graphiques. La taille de bloc des modes de swizzle VAR est de 512 Ko sur Anaconda et de 128 Ko sur Lockhart. Les diagrammes suivants montrent les dispositions d’une texture 2D de 48 × 24 avec 6 niveaux de mip, en utilisant les modes de bloc linéaire, 256 octets et 4 Ko. La disposition pour 64 Ko est semblable à la disposition 4 Ko, simplement avec une taille de bloc plus grande (et une queue de mips plus grande en conséquence).



Structures de disposition XG
L’objet XGTextureAddressComputer est l’interface principale de XG. Il fournit des méthodes de calcul de disposition et d’adressage des texels. La structure de disposition de sortie, XG_RESOURCE_LAYOUT, contient entre un et quatre plans (XG_PLANE_LAYOUT), et chaque plan contient un ou plusieurs niveaux de mip (XG_MIPLEVEL_LAYOUT). Les membres suivants de ces trois structures de disposition sont utiles pour calculer les dispositions de textures XBOX Series X|S.XG_RESOURCE_LAYOUT
- SizeBytes est la taille totale de l’image, y compris tous les plans.
- BaseAlignmentBytes est l’alignement de base de l’image. Chaque plan peut avoir sa propre valeur d’alignement, mais XG_RESOURCE_LAYOUT::BaseAlignmentBytes correspond à l’alignement maximal de tous les plans.
- MipLevels est le nombre de niveaux de mip présents dans l’image. Dans la plupart des cas, un seul des plans peut contenir plus d’un niveau de mip, dans le cas d’une texture avec mipmaps.
XG_PLANE_LAYOUT
- Usage indique la fonction du plan : « DEFAULT », « DEPTH » ou « STENCIL » pour la surface principale (échantillons ou texels) ; « HTILE », « FMASK », « CMASK » ou « DELTA_COLOR_COMPRESSION » pour les métadonnées de compression ; et « LUMA » ou « CHROMA » pour les images au format multimédia à deux plans.
- SizeBytes est la taille totale du plan, y compris toutes les tranches de tableau.
- SliceSizeBytes est la taille totale d’une seule chaîne de mips, qui constitue une tranche de tableau.
- StandardMipCount est le nombre de niveaux de mip qui ne font pas partie de la queue de mips.
- MipTailMipCount est le nombre de niveaux de mip qui font partie de la queue de mips.
XG_MIPLEVEL_LAYOUT
- SizeBytes est la taille de ce niveau de mip.
- OffsetBytes est l’offset de ce niveau de mip par rapport à la base de la chaîne de mips.
- Slice2DSizeBytes est équivalent à SizeBytes pour les textures 2D (de tableau) et correspond à la taille d’une tranche de profondeur pour les textures 3D.
- PaddedWidthElements, PaddedHeightElements et PaddedDepthOrArraySize sont les dimensions du niveau de mip, en éléments de texels, avec remplissage jusqu’à la taille de bloc correspondant au mode de swizzle choisi. N’oubliez pas que les blocs de compression BC correspondent à un élément de texel et à 4 × 4 texels.
- IsMipTail vaut 1 si ce niveau de mip fait partie de la queue de mips, et 0 dans le cas contraire.
Remarques sur le matériel XBOX Series X|S pour XG_MIPLEVEL_LAYOUT
- SizeBytes reflète la taille d’une seule tranche dans une texture de tableau comportant plusieurs tranches. Pour les textures de volume, SizeBytes reflète la taille de toutes les « tranches de profondeur », mais celles-ci peuvent ne pas être contiguës en mémoire.
- OffsetBytes reflète l’offset de ce niveau de mip dans la première tranche de tableau. Pour calculer l’offset de ce niveau de mip dans les tranches 1 à n, ajoutez à OffsetBytes la valeur SliceSizeBytes de la disposition du plan multipliée par l’index de la tranche.
- Notez que pour les textures de volume, chaque niveau de mip peut ne pas être contigu en mémoire. Pour déterminer les plages de mémoire occupées par un niveau de mip de volume, utilisez PlaneLayout.SliceSizeBytes * DepthSliceIndex + MipLayout.OffsetBytes pour l’offset de début de chaque plage, et StartOffset + MipLayout.SliceSizeBytes * MipLayout.SliceDepthElements pour l’offset de fin de chaque plage. Le nombre de tranches de profondeur d’un niveau de mip est égal à la profondeur du mip divisée par MipLayout.SliceDepthElements.
Modes de swizzle
Comme sur XBOX One, chaque descripteur d’image, cible de rendu et cible de profondeur/stencil peut sélectionner l’un des 32 motifs de tiling de textures différents, appelés modes de swizzle sur XBOX Series X|S et modes de tile sur XBOX One. Cependant, la similitude s’arrête là, car la construction de chaque motif sur XBOX Series X|S est très différente de celle sur XBOX One. Hormis la disposition linéaire, il n’existe aucun motif de tiling de textures commun entre XBOX Series X|S et XBOX One. Chaque mode de swizzle du GPU XBOX Series X|S possède plusieurs attributs, qui sont indiqués dans le nom du mode de swizzle.- Taille de bloc : l’unité fondamentale du motif de tiling, exprimée en nombre d’octets. La taille de bloc peut être de 256 octets, 4 Ko, 64 Ko, « variable » (512 Ko ou 128 Ko) ou linéaire.
- Motif de microtiling : la disposition des éléments de texels au sein des blocs. Les motifs de microtiling sont « S », « D », « R » et « Z ». Pour certaines tailles d’éléments, les motifs S et D sont identiques. Le mode de swizzle linéaire n’utilise pas de microtiling.
- Mode XOR de pipe : indique si l’adressage des texels utilise des bits de pipe dans une opération de swizzle XOR. Les paramètres XOR sont « X », « T » et aucun XOR de pipe. Tous les modes de swizzle avec XOR de pipe (« X » ou « T ») ont des motifs de swizzle propres à la configuration matérielle (Anaconda ou Lockhart) ; il faut donc être prudent lors du swizzling hors ligne. Le swizzle de pipe « X » s’étend sur plusieurs blocs, tandis que le swizzle de pipe « T » est limité à chaque bloc.
