> ## 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.

# Layouts e tiling de texturas para XBOX Series X|S

> Layouts e tiling de texturas para XBOX Series X|S

## Visão geral

O *tiling de texturas*, também conhecido como *swizzling de texturas*, é o método pelo qual a GPU define a organização dos mipmaps de uma textura e como os texels de cada mipmap são indexados. Este tópico descreve como a GPU do XBOX Series X|S difere das GPUs do XBOX One (X) tanto no layout de mipmaps quanto na ordenação de texels. A GPU do XBOX Series X|S tem padrões de swizzle diferentes dos das GPUs da geração XBOX One. A ordenação dos texels dentro de um nível de mip (o *padrão de swizzle*) mudou, e a ordenação e o alinhamento dos níveis de mip também mudaram.

Assim como na geração XBOX One, a biblioteca XG está disponível para calcular layouts de mip de texturas e padrões de swizzling de texels. A versão da XG para XBOX Series X|S é chamada XG\_XS e pode ser usada offline e também em runtime, compilando e vinculando com xg\_xs.h e xg\_xs.lib. A API é muito semelhante à XG do XBOX One, com alterações relacionadas ao modo de swizzle (em vez do modo de tile) e alguns campos alterados nas estruturas de saída para refletir os novos atributos da GPU do XBOX Series X|S.

## Layouts de mipmaps

Na GPU do XBOX Series X|S, os níveis de mip agora estão em ordem inversa na memória, com os menores níveis de mip (a cauda de mip) perto do deslocamento 0 dentro da textura, seguidos por níveis de mip cada vez maiores, com o maior nível de mip (mip 0) no deslocamento mais distante do endereço base da textura. As texturas de matriz são implementadas de forma diferente, agora como uma matriz de cadeias de mip (por exemplo, mips n-0 da fatia 0, seguidos pelos mips n-0 da fatia 1). Nas GPUs da geração XBOX One, uma textura de matriz era implementada como uma cadeia de mip de matrizes (por exemplo, todas as fatias do mip 0, seguidas por todas as fatias do mip 1).

O código de processamento de texturas offline que usa a biblioteca XG precisará se adaptar aos novos layouts do XBOX Series X|S, assim como qualquer código de streaming de texturas em runtime que fazia suposições sobre a ordenação e os alinhamentos dos mips.

Os layouts de mip são baseados em um tamanho de bloco de textura. A escolha do modo de swizzle (definido a seguir) especifica um tamanho de bloco de textura. Há cinco tamanhos de bloco possíveis: linear, 256 bytes, 4 KB, 64 KB e variável. Cada um dos tamanhos de bloco define dimensões de preenchimento para a altura e a largura do mip, considerando a dimensão da textura (1D, 2D ou 3D) e o tamanho do elemento em bytes. Preencher cada nível de mip até o tamanho do bloco implica que os deslocamentos dos mips estão alinhados ao tamanho do bloco.

Para evitar consumo excessivo de memória em texturas com mipmaps que usam os tamanhos de bloco maiores (4 KB e 64 KB), todos os níveis de mip menores que um bloco são compactados em uma cauda de mip do tamanho de um bloco, localizada no deslocamento 0 do layout da textura. Os níveis de mip na cauda de mip são alinhados a 256 bytes.

Nos tamanhos de bloco menores (linear e 256 bytes), os níveis de mip são alinhados a 256 bytes e diferem apenas nas dimensões de preenchimento. O modo de bloco de 256 bytes usa dimensões de preenchimento 2D/3D, enquanto o modo de bloco linear sempre especifica uma altura e uma profundidade de preenchimento de 1.

Os modos de swizzle com tamanho de bloco "variável" são compatíveis, mas não são selecionados por padrão pelos drivers gráficos. O tamanho do bloco para os modos de swizzle VAR é de 512 KB no Anaconda e de 128 KB no Lockhart.

Os diagramas a seguir mostram os layouts de uma textura 2D de 48 × 24 com 6 níveis de mip, usando os modos de bloco linear, de 256 bytes e de 4 KB. O layout de 64 KB é semelhante ao layout de 4 KB, apenas com um tamanho de bloco maior (e uma cauda de mip correspondentemente maior).

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/miplayout-linear.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=afe86d21abd0b445109a1b4858b8851c" alt="Diagrama de uma textura 2D de 48 por 24 com 6 níveis de mip, usando o modo de bloco linear." width="859" height="515" data-path="images/gdk/features/graphics/miplayout-linear.png" /> O layout linear mostra os níveis de mip ordenados do menor para o maior, com cada nível alinhado a 256 bytes.

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/miplayout-256b.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=f0c7e030cd6895bca60b7279906f01bb" alt="Diagrama de uma textura 2D de 48 por 24 com 6 níveis de mip, usando o modo de bloco de 256 bytes." width="609" height="691" data-path="images/gdk/features/graphics/miplayout-256b.png" /> O layout de 256 bytes mostra os níveis de mip ordenados do menor para o maior, com cada nível alinhado a um bloco retangular de texels de 256 bytes.

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/miplayout-4kb.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=5e3ce91321fe9983df07d1515e7a1ff7" alt="Diagrama de uma textura 2D de 48 por 24 com 6 níveis de mip, usando o modo de bloco de 4 KB." width="760" height="892" data-path="images/gdk/features/graphics/miplayout-4kb.png" /> O layout de 4 KB mostra os níveis de mip ordenados do menor para o maior, com cada nível alinhado a um bloco retangular de texels de 4 KB. Os menores níveis de mip são compactados em uma cauda de mip, e a cauda de mip cabe inteiramente em um bloco de 4 KB. O layout de 64 KB funciona da mesma forma que o layout de 4 KB, exceto pelo tamanho de bloco de 64 KB.

As texturas de matriz são implementadas como uma matriz de cadeias de mip. Para uma textura de matriz com 2 ou mais fatias, imagine 2 ou mais cadeias de mip colocadas uma após a outra na memória. O diagrama a seguir mostra a mesma textura 2D de 48 × 24 com 6 níveis de mip, mas desta vez com 2 fatias de matriz.

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/miplayout-4kb-array.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=0159006000fb2ff46891c1e6f7e53dad" alt="Diagrama de uma textura 2D de 48 por 24 com 6 níveis de mip no modo de bloco de 4 KB, com 2 fatias de matriz." width="461" height="928" data-path="images/gdk/features/graphics/miplayout-4kb-array.png" />

Os mapas de cubo e as matrizes de mapas de cubo são um caso especial de texturas de matriz em que a contagem de fatias deve ser um múltiplo de 6. Para fins de endereçamento de texturas, trate os mapas de cubo da mesma forma que as texturas de matriz 2D padrão.

As texturas 3D (de volume) são implementadas como texturas 2D, exceto que cada bloco representa uma região 3D de elementos de texel em vez de um retângulo 2D de elementos de texel. As fatias do volume são implementadas como fatias de uma textura de matriz, exceto que cada fatia do volume tem uma profundidade de fatia maior que 1 devido ao alinhamento do bloco. Como resultado, os níveis de mip individuais de uma textura de volume com mipmaps podem não ser contíguos na memória, pois são divididos em várias fatias. As texturas de volume não podem ser organizadas em matriz.

## Estruturas de layout da XG

O objeto XGTextureAddressComputer é a interface principal da XG. Ele fornece métodos de cálculo de layout e de endereçamento de texels. A estrutura de layout de saída, XG\_RESOURCE\_LAYOUT, contém de um a quatro planos (XG\_PLANE\_LAYOUT), e cada plano contém um ou mais níveis de mip (XG\_MIPLEVEL\_LAYOUT).

Os membros a seguir dessas três estruturas de layout são relevantes ao calcular layouts de texturas do XBOX Series X|S.

### XG\_RESOURCE\_LAYOUT

* SizeBytes é o tamanho total da imagem, incluindo todos os planos.
* BaseAlignmentBytes é o alinhamento base da imagem. Cada plano pode ter seu próprio valor de alinhamento, mas XG\_RESOURCE\_LAYOUT::BaseAlignmentBytes é o alinhamento máximo de todos os planos.
* MipLevels é o número de níveis de mip presentes na imagem. Na maioria dos casos, apenas um dos planos pode conter mais de um nível de mip, no caso de uma textura com mipmaps.

### XG\_PLANE\_LAYOUT

* Usage é a finalidade do plano: "DEFAULT", "DEPTH" ou "STENCIL" para a superfície primária (amostras ou texels); "HTILE", "FMASK", "CMASK" ou "DELTA\_COLOR\_COMPRESSION" para metadados de compactação; e "LUMA" ou "CHROMA" para imagens em formato multimídia de dois planos.
* SizeBytes é o tamanho total do plano, incluindo todas as fatias de matriz.
* SliceSizeBytes é o tamanho total de uma única cadeia de mip, que compõe uma fatia de matriz.
* StandardMipCount é o número de níveis de mip que não fazem parte da cauda de mip.
* MipTailMipCount é o número de níveis de mip que fazem parte da cauda de mip.

### XG\_MIPLEVEL\_LAYOUT

* SizeBytes é o tamanho deste nível de mip.
* OffsetBytes é o deslocamento deste nível de mip a partir da base da cadeia de mip.
* Slice2DSizeBytes será equivalente a SizeBytes para texturas 2D (de matriz) e será o tamanho de uma fatia de profundidade para texturas 3D.
* PaddedWidthElements, PaddedHeightElements e PaddedDepthOrArraySize são as dimensões do nível de mip, em elementos de texel, preenchidas até o tamanho de bloco correspondente ao modo de swizzle escolhido. Lembre-se de que os blocos de compactação BC são um elemento de texel e 4 × 4 texels.
* IsMipTail é 1 se este nível de mip fizer parte da cauda de mip e 0 se o nível de mip não fizer parte da cauda de mip.

#### Observações sobre o hardware do XBOX Series X|S para XG\_MIPLEVEL\_LAYOUT

* SizeBytes refletirá o tamanho de apenas uma fatia em uma textura de matriz com várias fatias. Para texturas de volume, SizeBytes refletirá o tamanho de todas as "fatias de profundidade", mas elas podem não ser contíguas na memória.
* OffsetBytes refletirá o deslocamento deste nível de mip na primeira fatia de matriz. Para calcular o deslocamento até este nível de mip nas fatias 1-n, some OffsetBytes ao SliceSizeBytes do layout do plano multiplicado pelo índice da fatia.
* Observe que, para texturas de volume, cada nível de mip pode não ser contíguo na memória. Para determinar os intervalos de memória ocupados por um nível de mip de volume, use PlaneLayout.SliceSizeBytes \* DepthSliceIndex + MipLayout.OffsetBytes para o deslocamento inicial de cada intervalo e StartOffset + MipLayout.SliceSizeBytes \* MipLayout.SliceDepthElements para o deslocamento final de cada intervalo. O número de fatias de profundidade de um nível de mip é a profundidade do mip dividida por MipLayout.SliceDepthElements.

## Modos de swizzle

Assim como no XBOX One, cada descritor de imagem, destino de renderização e destino de profundidade/estêncil pode selecionar um entre 32 padrões diferentes de tiling de texturas, conhecidos como *modos de swizzle* no XBOX Series X|S e *modos de tile* no XBOX One. No entanto, a semelhança termina aí, pois a construção de cada padrão no XBOX Series X|S é bastante diferente da do XBOX One. Além do layout linear, não há padrões de tiling de texturas em comum entre o XBOX Series X|S e o XBOX One.

Cada modo de swizzle na GPU do XBOX Series X|S tem vários atributos, que são indicados no nome do modo de swizzle.

1. **Tamanho do bloco:** o tamanho da unidade fundamental do padrão de tiling, especificado como um número de bytes. O tamanho do bloco pode ser 256 bytes, 4 KB, 64 KB, "variável" (512 KB ou 128 KB) ou linear.
2. **Padrão de microtiling:** o layout dos elementos de texel dentro dos blocos. Os padrões de microtiling incluem "S", "D", "R" e "Z". Para alguns tamanhos de elemento, os padrões S e D são idênticos. O modo de swizzle linear não tem microtiling.
3. **Modo de XOR de pipe:** indica se o endereçamento de texels usa bits de pipe em uma operação de swizzle XOR. As configurações de XOR incluem "X", "T" e sem XOR de pipe. Todos os modos de swizzle com XOR de pipe ("X" ou "T") têm padrões de swizzle específicos da configuração de hardware (Anaconda vs. Lockhart), portanto, é preciso ter cuidado ao fazer swizzling offline. O swizzle de pipe "X" abrange vários blocos, enquanto o swizzle de pipe "T" fica restrito a cada bloco.

A tabela a seguir descreve os 32 modos de swizzle diferentes, para que são usados atualmente e se exibições de destino de renderização, exibições de estêncil de profundidade e texturas de volume são permitidas.

| Nome | Observações | RTV permitido | DSV permitido | 3D permitido |
| - | - | - | - | - |
| LINEAR | Layout linear, usado para todas as texturas 1D | Sem MSAA | Não | Sim |
| 256B\_S | | Sem MSAA | Não | Não |
| 256B\_D | | Sem MSAA | Não | Não |
| 256B\_R | | Não | Não | Não |
| 4KB\_Z | | Não | Não | Não |
| 4KB\_S | Modo de swizzle padrão para texturas comuns | Sem MSAA | Não | Sim |
| 4KB\_D | | Sem MSAA | Não | Não |
| 4KB\_R | | Não | Não | Não |
| 64KB\_Z | | Não | Não | Não |
| 64KB\_S | | Sem MSAA | Não | Sim |
| 64KB\_D | Modo de swizzle padrão para recursos em tiles | Sem MSAA | Não | Não |
| 64KB\_R | | Não | Não | Não |
| VAR\_Z | | Não | Não | Não |
| VAR\_S | | Não | Não | Não |
| VAR\_D | | Não | Não | Não |
| VAR\_R | | Não | Não | Não |
| 64KB\_Z\_T | | Não | Não | Não |
| 64KB\_S\_T | | Sem MSAA | Não | Sim |
| 64KB\_D\_T | | Sem MSAA | Não | Não |
| 64KB\_R\_T | | Não | Não | Não |
| 4KB\_Z\_X | | Não | Não | Não |
| 4KB\_S\_X | | Não | Não | Sim |
| 4KB\_D\_X | | Não | Não | Não |
| 4KB\_R\_X | | Não | Não | Não |
| 64KB\_Z\_X | Modo de swizzle obrigatório para destinos de estêncil de profundidade e superfícies de metadados de compactação FMASK | Sem MSAA | Sim | Sim |
| 64KB\_S\_X | | Sem MSAA | Não | Sim |
| 64KB\_D\_X | | Sem MSAA | Não | Sim |
| 64KB\_R\_X | Modo de swizzle padrão para destinos de renderização e UAVs; obrigatório para destinos de renderização MSAA | Sim | Não | Sim |
| VAR\_Z\_X | | Não | Não | Não |
| VAR\_S\_X | | Não | Não | Não |
| VAR\_D\_X | | Não | Não | Não |
| VAR\_R\_X | | Sim | Não | Não |

## Observações adicionais sobre os modos de swizzle

A GPU do XBOX Series X|S define o tamanho do bloco em unidades de bytes, e não em elementos de texel. Isso significa que, à medida que o tamanho do elemento de texel em bytes aumenta, menos texels estão presentes em cada bloco. Isso contrasta com a GPU do XBOX One, que estabelecia o tamanho de bloco principal como 8 × 8 elementos de texel, independentemente do tamanho do elemento.

Como o tamanho do bloco permanece fixo em bytes, os padrões de swizzle "S", "D", "R" e "Z" são interpretados de forma diferente para vários tamanhos de elemento. Além disso, os padrões de swizzle são completamente diferentes entre texturas 2D e texturas 3D.

## Confira também

[Gráficos](/pt-BR/build/core-features/graphics/gc-graphics-toc)


## Related topics

- [Criando layouts de controles por toque para game streaming do XBOX](/pt-BR/build/core-features/common/game-streaming/building-touch-layouts/index.md)
- [GetResourceAllocationInfo1 (consoles XBOX Series)](/pt-BR/reference/graphics/d3d12/interfaces/id3d12device4/methods/id3d12device4_getresourceallocationinfo1_public.md)
- [Diretório de tópicos NDA: links ativos do Microsoft Learn](/pt-BR/nda/nda-topic-directory.md)
- [GetResourceAllocationInfo](/pt-BR/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_getresourceallocationinfo_public.md)
- [D3D12_TEXTURE_BARRIER (consoles XBOX Series)](/pt-BR/reference/graphics/d3d12/structs/d3d12_texture_barrier_public.md)
