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

# Tesselação

> Tesselação

Este tópico descreve as vantagens e desvantagens da tesselação onchip e offchip.

* [Ações envolvidas na tesselação](#ID4EU)
* [Modo de tesselação onchip](#ID4EAC)
* [Modo de tesselação offchip](#ID4ELC)
* [Heurística usada para executar ondas de DS no modo onchip ou offchip](#ID4E3C)
* [Habilitação da tesselação offchip](#ID4EQD)
* [Definição de parâmetros de tesselação](#ID4E5D)

<a id="ID4EU" />

## Ações envolvidas na tesselação

A tesselação no XBOX One executa as ações a seguir, independentemente de a tesselação ser executada onchip ou offchip.

1. A GPU divide todos os patches gerados por cada desenho individual em grupos de threads.
2. Para cada grupo de threads, a GPU aloca uma certa quantidade de memória de armazenamento de dados local (LDS) em uma unidade de computação (CU). Todos os threads necessários de sombreador de vértice (VS) e de sombreador de casco (HS) são agendados nessa CU.
3. Para cada grupo de threads, a GPU executa tantos threads de VS quanto o número de pontos de controle de entrada, multiplicado pelo número de patches por grupo de threads.

```cpp theme={null}
      VS threads = (input control points) x (patches per threadgroup)  
```

Os threads são sempre empacotados em 64 threads por onda por estágio de sombreador.

1. Para cada grupo de threads, a GPU também executa tantos threads de HS quanto o número de pontos de controle de saída multiplicado pelo número de patches por grupo de threads.

```cpp theme={null}
      HS threads = (output control points) x (patches per threadgroup)  
```

Os threads são sempre empacotados em 64 threads por onda por estágio de sombreador.

1. Todos os threads de HS devem ser executados simultaneamente como um grupo de threads, pois podem ser necessárias barreiras de sincronização. Isso é semelhante ao funcionamento dos grupos de threads de sombreadores de computação, exceto que, neste caso, a sincronização é implícita e não especificada na linguagem de sombreador de alto nível (HLSL).
2. Em seguida, o tesselador da GPU gera threads de sombreador de domínio (DS) para execução, dependendo dos fatores de tesselação calculados pelo HS (também empacotados em 64 threads por onda).

<a id="ID4EAC" />

## Modo de tesselação onchip

Por padrão, o driver do Direct3D 12 sempre configura a GPU para o modo de tesselação onchip. No modo de tesselação onchip, todos os dados dos pontos de controle de entrada e saída e as constantes por patch são armazenados no LDS, incluindo os fatores constantes. Como o LDS é uma memória interna da GPU, nenhuma largura de banda de memória adicional é gerada, e o acesso aos dados tem garantia de baixa latência.

No entanto, como esses dados são necessários para os threads de DS gerados pela tesselação dos patches em um grupo de threads, todos esses threads de DS precisam ser executados na mesma CU que executou os threads de VS e HS do mesmo grupo de threads. Isso impõe uma limitação severa à capacidade da GPU de balancear a carga de trabalho entre as 12 CUs disponíveis, especialmente quando os fatores de tesselação são altos.

Com fatores de tesselação altos, um único grupo de threads pode gerar muitas ondas de threads de DS, e a memória LDS usada fica bloqueada para qualquer outro uso, incluindo outros grupos de threads que, de outra forma, poderiam ser executados na CU. (O LDS também é usado para dados locais de grupos de threads em sombreadores de computação, para valores interpolados de PS e para o modo GS onchip.)

<a id="ID4ELC" />

## Modo de tesselação offchip

A tesselação offchip é uma opção que permite o uso de memória não LDS com sombreadores de casco e de domínio.

O modo de tesselação offchip da GPU é habilitado especificando o sinalizador [D3D12XBOX\_PIPELINE\_STATE\_FLAG\_GS\_ONCHIP\_TS\_OFFCHIP](/pt-BR/reference/graphics/d3d12_x/enums/d3d12_pipeline_state_flags) ou [D3D12XBOX\_PIPELINE\_STATE\_FLAG\_GS\_OFFCHIP\_TS\_OFFCHIP](/pt-BR/reference/graphics/d3d12_x/enums/d3d12_pipeline_state_flags). Esse modo usa a mesma quantidade de LDS que o modo onchip, mas o HS também grava todos os pontos de controle de saída, fatores de tesselação e constantes por patch em um buffer de memória.

Em seguida, uma heurística é usada para executar algumas ondas de DS na mesma CU no modo onchip, lendo os dados do LDS, e para executar outras ondas de DS em outras CUs, usando o modo offchip e lendo os dados da memória. Isso permite que a GPU libere a memória LDS do grupo de threads antes que todas as ondas de DS sejam concluídas, ou mesmo iniciadas, e também permite que a GPU balanceie melhor a carga das ondas de DS entre todas as CUs.

A vantagem de fazer a tesselação offchip é que a memória LDS é liberada para outras finalidades gráficas. Se uma melhoria de desempenho é realmente obtida com a tesselação offchip depende muito do código do título. Pode ser que não haja melhoria de desempenho.

<a id="ID4E3C" />

## Heurística usada para executar ondas de DS no modo onchip ou offchip

A heurística usada para executar algumas ondas de DS no modo onchip e outras no modo offchip é executada por grupo de threads, da seguinte maneira.

* Um thread do HS reúne todos os fatores de tesselação de todos os patches e calcula um fator de tesselação médio para o grupo de threads inteiro. Se esse valor for menor que **TfThreshold**, o modo offchip será desabilitado para o grupo de threads inteiro. Nenhum dado é gravado na memória e todas as ondas de DS são executadas na mesma CU.
* Se o modo offchip não estiver desabilitado para o grupo de threads, as primeiras **DsWaveThreshold** ondas de DS serão executadas no modo onchip; depois disso, a memória LDS será recuperada e todas as ondas de DS restantes serão executadas offchip.

<a id="ID4EQD" />

## Habilitação da tesselação offchip

Os sombreadores de casco e de domínio que serão usados com a tesselação offchip devem ser compilados com a seguinte instrução `#define`.

```cpp theme={null}
__XBOX_ENABLE_HSOFFCHIP  
```

Definir esse valor faz com que os sombreadores de casco ou de domínio sejam pré-compilados para a tesselação offchip e evita a recompilação em runtime. Os sombreadores devem corresponder: ambos offchip ou ambos não offchip.

<a id="ID4E5D" />

## Definição de parâmetros de tesselação

[Uso de D3D12XBOX\_TESSELLATION\_PARAMETERS\_DESC](#ID4EEE)

<a id="ID4EEE" />

### Chamada de HSSetTessellationParameters

Para usar a tesselação offchip, preencha D3D12XBOX\_TESSELLATION\_PARAMETERS\_DESC e passe-a para **CreateGraphicsPipelineStateX**, **CreateDerivedGraphicsPipelineStateX** ou **CreatePipelineState**.

Inicialize os padrões em D3D12XBOX\_TESSELLATION\_PARAMETERS\_DESC chamando **D3D12XboxInitializeDefaultTessellationParameters**.

```cpp theme={null}
typedef struct D3D12XBOX_TESSELLATION_PARAMETERS_DESC
{
    UINT PatchesPerThreadgroup;
    FLOAT TessellationFactorThreshold;
    UINT DsWaveThreshold;
} D3D12XBOX_TESSELLATION_PARAMETERS_DESC;
```

Os campos dessa estrutura são os seguintes.

| Campo | Descrição |
| - | - |
| **PatchesPerThreadgroup** | Quantos patches são processados simultaneamente em uma unidade de computação na GPU. Atualmente, o driver calcula um valor para isso que maximiza o número de patches que podem ser processados simultaneamente. |
| **TfThreshold** | Limite do fator de tesselação. Este é o fator de tesselação médio mínimo em um grupo de threads que faz com que o sombreador de casco alterne dinamicamente do modo onchip para o offchip. Este campo só é válido quando a tesselação offchip está habilitada em PipelineStateObject. Atualmente, o driver calcula um fator de tesselação que gera aproximadamente 256 threads de DS (4 ondas). |
| **DsWaveThreshold** | Limite de ondas do sombreador de domínio: este é o número de ondas de DS iniciadas pela unidade de tesselação usando o método onchip, antes de alternar o processamento de DS para o modo offchip, liberando a memória LDS e começando a iniciar ondas de DS em outras CUs. Atualmente, o driver fixa esse valor em 4 ondas. Este campo só é válido quando a tesselação offchip está habilitada em PipelineStateObjects. |


## Related topics

- [D3D_NAME (consoles XBOX Series)](/pt-BR/reference/graphics/d3d12_xs/enums/d3d_name.md)
- [Visão geral do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-overview.md)
- [Por que usar Mesh Shaders?](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-why.md)
- [Índice de tópicos sob NDA para desenvolvimento de console com o XBOX GDK](/pt-BR/nda/nda-overview.md)
- [Diretório de tópicos NDA: links ativos do Microsoft Learn](/pt-BR/nda/nda-topic-directory.md)
