Vue d’ensemble
Le mosaïquage des textures (texture tiling), aussi appelé swizzling des 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 les différences entre le GPU de la XBOX Series X|S et les GPU de la XBOX One (X), tant pour la disposition des mipmaps que pour l’ordre des texels. Le GPU de la XBOX Series X|S utilise des modèles de swizzle différents de ceux des GPU de la génération XBOX One. L’ordre des texels dans un niveau de mip (le modèle de swizzle) a changé, tout comme 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 texture et les modèles de swizzling des texels. La version XBOX Series X|S de XG s’appelle XG_XS et peut être utilisée hors ligne ainsi qu’à l’exécution 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 mosaïque) et certains champs modifiés dans les structures de sortie pour refléter les nouveaux attributs du GPU de la XBOX Series X|S.Dispositions des mipmaps
Sur le GPU de la XBOX Series X|S, les niveaux de mip sont maintenant stockés en ordre inverse en mémoire : les plus petits niveaux de mip (la queue de mip) se trouvent près du décalage 0 de la texture, suivis de niveaux de mip de plus en plus grands, le plus grand niveau de mip (mip 0) étant au décalage 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 des textures hors ligne qui utilise la bibliothèque XG devra s’adapter aux nouvelles dispositions de la XBOX Series X|S, tout comme le code de diffusion en continu des textures à l’exécution 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-après) précise 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, selon la dimension de la texture (1D, 2D ou 3D) et la taille des éléments en octets. Le remplissage de chaque niveau de mip jusqu’à la taille de bloc implique que les décalages des mips sont alignés sur la taille de bloc. Pour éviter une consommation de mémoire excessive pour les textures avec mipmaps qui utilisent 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 mip de la taille d’un bloc située au décalage 0 dans la disposition de la texture. Les niveaux de mip de la queue de mip 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 de 256 octets utilise des dimensions de remplissage 2D/3D, tandis que le mode de bloc linéaire précise 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 pour 4 Ko, mais avec une plus grande taille de bloc (et une queue de mip 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 pertinents lors du calcul des dispositions de texture de la 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 est 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 l’usage 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 de 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 mip.
- MipTailMipCount est le nombre de niveaux de mip qui font partie de la queue de mip.
XG_MIPLEVEL_LAYOUT
- SizeBytes est la taille de ce niveau de mip.
- OffsetBytes est le décalage 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 texel, remplies 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 mip, et 0 si le niveau de mip ne fait pas partie de la queue de mip.
Notes 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 le décalage de ce niveau de mip dans la première tranche de tableau. Pour calculer le décalage de ce niveau de mip dans les tranches 1 à n, ajoutez OffsetBytes au SliceSizeBytes de la disposition du plan multiplié 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 le décalage de début de chaque plage, et StartOffset + MipLayout.SliceSizeBytes * MipLayout.SliceDepthElements pour le décalage de fin de chaque plage. Le nombre de tranches de profondeur d’un niveau de mip est 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/gabarit peut sélectionner l’un de 32 modèles de mosaïquage de texture différents, appelés modes de swizzle sur XBOX Series X|S et modes de mosaïque sur XBOX One. Cependant, la ressemblance s’arrête là, car la construction de chaque modèle sur XBOX Series X|S est très différente de celle sur XBOX One. À part la disposition linéaire, il n’existe aucun modèle de mosaïquage de texture commun entre la XBOX Series X|S et la XBOX One. Chaque mode de swizzle du GPU de la XBOX Series X|S possède plusieurs attributs, qui sont indiqués dans le nom du mode de swizzle.- Taille de bloc : La taille de l’unité fondamentale du modèle de mosaïquage, 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.
- Modèle de micromosaïquage : La disposition des éléments de texel dans les blocs. Les modèles de micromosaïquage comprennent « S », « D », « R » et « Z ». Pour certaines tailles d’éléments, les modèles S et D sont identiques. Le mode de swizzle linéaire n’a pas de micromosaïquage.
- 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 comprennent « X », « T » et l’absence de XOR de pipe. Tous les modes de swizzle avec XOR de pipe (« X » ou « T ») ont des modèles 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é à l’intérieur de chaque bloc.
