Skip to main content

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). Diagramme d'une texture 2D de 48 par 24 avec 6 niveaux de mip, utilisant le mode de bloc linéaire. La disposition linéaire montre les niveaux de mip ordonnés du plus petit au plus grand, chaque niveau étant aligné sur 256 octets. Diagramme d'une texture 2D de 48 par 24 avec 6 niveaux de mip, utilisant le mode de bloc 256 octets. La disposition 256 octets montre les niveaux de mip ordonnés du plus petit au plus grand, chaque niveau étant aligné sur un bloc rectangulaire de texels de 256 octets. Diagramme d'une texture 2D de 48 par 24 avec 6 niveaux de mip, utilisant le mode de bloc 4 Ko. La disposition 4 Ko montre les niveaux de mip ordonnés du plus petit au plus grand, chaque niveau étant aligné sur un bloc rectangulaire de texels de 4 Ko. Les plus petits niveaux de mip sont regroupés dans une queue de mips, et la queue de mips tient entièrement dans un bloc de 4 Ko. La disposition 64 Ko fonctionne de la même manière que la disposition 4 Ko, mais avec une taille de bloc de 64 Ko. Les textures de tableau sont implémentées sous la forme d’un tableau de chaînes de mips. Pour une texture de tableau de 2 tranches ou plus, imaginez 2 chaînes de mips ou plus placées bout à bout en mémoire. Le diagramme suivant montre la même texture 2D de 48 × 24 avec 6 niveaux de mip, mais cette fois avec 2 tranches de tableau. Diagramme d'une texture 2D de 48 par 24 avec 6 niveaux de mip en mode de bloc 4 Ko, avec 2 tranches de tableau. Les cube maps et les tableaux de cube maps sont un cas particulier de textures de tableau, dans lesquelles le nombre de tranches doit être un multiple de 6. Pour l’adressage des textures, traitez les cube maps de la même manière que les textures de tableau 2D standard. Les textures 3D (de volume) sont implémentées comme des textures 2D, sauf que chaque bloc représente une région 3D d’éléments de texels au lieu d’un rectangle 2D d’éléments de texels. Les tranches du volume sont implémentées comme les tranches d’une texture de tableau, sauf que chaque tranche du volume a une profondeur supérieure à 1 en raison de l’alignement des blocs. Par conséquent, les niveaux de mip individuels d’une texture de volume avec mipmaps peuvent ne pas être contigus en mémoire, car ils sont répartis sur plusieurs tranches. Les textures de volume ne peuvent pas être organisées en tableau.

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.
  1. 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.
  2. 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.
  3. 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.
Le tableau suivant décrit les 32 modes de swizzle différents, leur utilisation actuelle et indique si les vues de cible de rendu, les vues de profondeur/stencil et les textures de volume sont autorisées.

Remarques supplémentaires sur les modes de swizzle

Le GPU XBOX Series X|S définit la taille de bloc en octets, et non en éléments de texels. Cela signifie que plus la taille des éléments de texels en octets augmente, moins chaque bloc contient de texels. C’est l’inverse du GPU XBOX One, qui définissait la taille de bloc principale à 8 × 8 éléments de texels, quelle que soit la taille des éléments. Comme la taille de bloc reste fixe en octets, les motifs de swizzle « S », « D », « R » et « Z » sont interprétés différemment selon la taille des éléments. De plus, les motifs de swizzle sont complètement différents entre les textures 2D et les textures 3D.

Voir aussi

Graphismes
Last modified on October 6, 2026