- Ações envolvidas na tesselação
- Modo de tesselação onchip
- Modo de tesselação offchip
- Heurística usada para executar ondas de DS no modo onchip ou offchip
- Habilitação da tesselação offchip
- Definição de parâmetros de tesselação
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.- A GPU divide todos os patches gerados por cada desenho individual em grupos de threads.
- 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.
- 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.
- 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.
- 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).
- 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).
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.)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 ou D3D12XBOX_PIPELINE_STATE_FLAG_GS_OFFCHIP_TS_OFFCHIP. 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.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.
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.
