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



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