> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Spécification du fichier d'archive XBOX Texture Compressor (XBTC)

> Spécification du fichier d'archive XBOX Texture Compressor (XBTC)

Le format de fichier d'archive est défini dans `XBTC.h`, mais il est expliqué en détail dans cette rubrique.

<Note>
  Le format d'archive est susceptible d'évoluer et comprend un numéro de version incrémentiel. Lorsqu'il est appelé sans options, [XBTC.exe](/fr/build/core-features/graphics/newfeatures/xbtc/xbtc) affiche le numéro de version actuel de l'archive. Toute tentative de chargement d'une archive d'une version différente à l'aide de `XBTC.lib` échoue.
</Note>

Chaque archive commence par un en-tête, qui débute par le code FOURCC « XBTC » suivi d'un numéro de version sur 1 octet. (La version « 2 » est documentée ici.) L'en-tête se présente comme suit.

```c++ theme={null}
    struct XBTC_ARCHIVE_HEADER
    {
        uint32_t    Identifier;             // File identifier; "XBTC" as char[].
        uint32_t    Version         : 8;    // Archive format version.
        uint32_t    TextureCount    : 24;   // Number of individual textures in archive.
        uint64_t    DataOffset      : 24;   // Header + Index size in bytes.
        uint64_t    DataSize        : 40;   // Size of all data streams in bytes.
    };
```

Le format d'archive prend en charge plusieurs textures, mais `XBTC.exe` ne permet pas actuellement de combiner des archives ni d'ajouter des textures à une archive. Le champ de décalage des données représente la taille de la TOC. Il représente également la distance de recherche entre le début de l'archive et les données de flux compressées. Dans le cas (futur) où la TOC est stockée dans un fichier distinct, le décalage des données peut être 0, ce qui indique que les flux compressés commencent au début de leur propre fichier. Lorsque tout est contenu dans un seul fichier, `DataOffset` + `DataSize` doit être égal à la taille en octets de l'archive.

Après l'en-tête de l'archive figure un certain nombre de descriptions de textures. Ce nombre est égal à `TextureCount`. Les descriptions de textures sont suivies du même nombre de décalages de recherche de flux, qui indiquent où commencent les données de chaque texture.

```c++ theme={null}
    enum XBTC_TEX_DIMENSION
    {
        XBTC_TEX_DIMENSION_1D,              // 1D Texture or Buffer.
        XBTC_TEX_DIMENSION_2D,              // 2D Texture or Texture Array.
        XBTC_TEX_DIMENSION_3D,              // 3D (Volume) Texture.
        XBTC_TEX_DIMENSION_CUBE             // Cubemap or Cubemap Array.
    };

    enum XBTC_TILING_MODE
    {
        XBTC_TILING_SCARLETT_LINEAR,        // Texel elements are arranged in row major order, mips are 256-byte-aligned.
        XBTC_TILING_SCARLETT_256B,          // Tiles are 256 bytes (NO mip tail).
        XBTC_TILING_SCARLETT_4KB,           // Tiles are 4 KB (4 KB mip tail).
        XBTC_TILING_SCARLETT_64KB,          // Tiles are 64 KB (64 KB mip tail).
        XBTC_TILING_SCARLETT_64KB_PRT,      // Tiles are 64 KB, compressed individually for partial residency.
        XBTC_TILING_STANDARD_SWIZZLE        // D3D Standard Swizzle (64 KB tiles).
    };

    struct XBTC_TEXTURE_INFO
    {
        uint64_t    Format          : 8;    // DXGI_FORMAT
        uint64_t    Dimension       : 2;    // XBTC_TEX_DIMENSION
        uint64_t    Width           : 14;   // Width in pixels of mip 0 (minus 1).
        uint64_t    Height          : 14;   // Height in pixels of mip 0 (minus 1).
        uint64_t    Depth           : 11;   // Depth or array count (minus 1).
        uint64_t    TileMode        : 3;    // XBTC_TILING_MODE
        uint64_t    MipCount        : 4;    // Total number of LODs.
        uint64_t    MipStreams      : 4;    // Number of streamable LODs (excluding base).
        uint64_t    Reserved        : 4;
    };

    struct XBTC_OFFSET_AND_INDEX
    {
        uint64_t    BaseOffset      : 40;   // Base offset into data chunk.
        uint64_t    NextIndex       : 24;   // Base stream index of *next* resource.
    };
```

`XBTC_TEXTURE_INFO` est une représentation compacte d'un `D3D12_RESOURCE_DESC` qui permet de décrire la texture au moment du chargement. Ces informations peuvent servir à calculer les tailles, décalages et alignements en mémoire. Le décalage et l'index permettent de déterminer quels flux compressés correspondent à une texture, ainsi que le décalage de recherche de 40 bits jusqu'au début des données du flux. Cela autorise des archives de 1 To et jusqu'à 16 millions de flux individuels. Le nombre total de flux est indiqué par le `NextIndex` de la dernière texture. Les informations par texture sont suivies d'informations détaillées par flux.

```c++ theme={null}
    struct XBTC_STREAM_INFO
    {
        uint32_t RelativeOffset             // Stream start offset (relative to base).
        uint32_t CompressedSize;            // Length of compressed stream.
        uint32_t InflatedSize;              // Size of stream before Deflate.
        uint32_t UncompressedSize;          // Uncompressed stream size.
    };
```

Les codecs de compression utilisés sur le flux peuvent être déduits des différentes tailles contenues dans les informations du flux. Si `CompressedSize` est inférieur à `InflatedSize`, `Deflate` a été utilisé. Si `InflatedSize` est inférieur à `UncompressedSize`, `BCPack` a été utilisé. Les deux peuvent être utilisés, ou aucun.

Après le tableau `StreamInfo`, un remplissage peut être inséré pour aligner les données de flux compressées sur 16 octets. Les données de flux compressées constituent le reste du fichier.

## Voir aussi

[Vue d'ensemble de XBOX Texture Compressor](/fr/build/core-features/graphics/newfeatures/xbtc/xbox-texture-compressor)

[XBTC.exe](/fr/build/core-features/graphics/newfeatures/xbtc/xbtc)

[Vues d'ensemble des fonctionnalités graphiques de XBOX Series X|S](/fr/build/core-features/graphics/graphics-newfeatures-toc)
