Pular para o conteúdo principal

O pipeline legado

Nos últimos 20 anos, o pipeline gráfico evoluiu até chegar ao estado hoje familiar. À medida que os fornecedores independentes de hardware (IHVs) se concentram em uma disputa cada vez mais ampla por contagem de núcleos, capacidade de memória e largura de banda, certos gargalos de função fixa se tornaram evidentes no modelo de processamento geométrico. Figura 1. O pipeline gráfico legado. Os estágios em azul são de função fixa. Os estágios em verde são shaders programáveis. O pipeline gráfico legado Um dos gargalos mais problemáticos é o input assembler (IA). O IA é um componente de hardware localizado no topo do pipeline gráfico, responsável por processar índices e buscar dados de vértices. O número de unidades de IA não escalou na mesma proporção que outros recursos da GPU. O número pequeno e fixo de unidades de IA introduz uma taxa de lançamento restritiva que frequentemente não consegue saturar os núcleos da GPU com trabalho. Na parte inferior do pipeline de geometria está o primitive assembler (PA). Esse componente de hardware compõe os vértices transformados em primitivos, executa rotinas de culling e clipping e, em seguida, encaminha as instâncias restantes para a rasterização. Ele tem uma taxa de exportação fixa, e manter essa taxa pode ser desafiador. Em alguns casos, isso pode ser devido ao IA: se as waves de shader pudessem ser lançadas no pipeline mais rapidamente, mais primitivos poderiam ser enviados em paralelo. Mais cargas de trabalho paralelas em andamento podem manter melhor a pressão sobre o PA. Outra limitação do pipeline gráfico legado é que os métodos de culling de geometria no pipeline tradicional são limitados. A geometria descartada reduz a taxa de transferência efetiva e desperdiça largura de banda de memória e ALU carregando e sombreando atributos de vértices que nunca verão a luz do dia. Idealmente, gostaríamos de poder fazer culling em uma infinidade de granularidades para descartar a geometria o mais cedo possível.

O pipeline de Mesh Shader

O pipeline de Mesh Shader trata dessas limitações do pipeline gráfico legado. Em primeiro lugar, ele remove o IA e o tessellator do pipeline. A intenção é maximizar a taxa de lançamento de waves de shader e transferir o IA para o código de shader, que pode escalar com as GPUs. Isso pode ajudar a saturar os núcleos da GPU e manter a pressão sobre o PA. Esse pipeline também oferece a capacidade de fazer culling de cargas de trabalho em vários pontos do pipeline. Os Amplification Shaders podem ser usados para culling de baixa granularidade, como em relação a objetos agrupados, instâncias ou meshlets. Os Mesh Shaders podem fazer culling com granularidade por primitivo. Isso fornece um caminho para descartar primitivos trivialmente descartáveis cedo e com frequência, economizando computação, largura de banda de memória e taxa de transferência do PA preciosas. Figura 2. Os estágios do pipeline de Mesh Shader. Os estágios em verde são programáveis. Os estágios em azul são de função fixa. Diagrama de estágios do pipeline de Mesh Shader

Mesh Shaders

Os Mesh Shaders foram projetados para oferecer ao pipeline de geometria um nível de generalidade encontrado apenas em compute shaders. Isso dá ao desenvolvedor controle total sobre a carga de trabalho de cada thread. Mover as buscas de índices e atributos de vértices para o código de shader remove a dependência de hardware de função fixa, maximizando as taxas de lançamento de waves e permitindo que o IA escale com o restante da GPU. A capacidade deles de especificar dinamicamente as contagens de exportação de vértices e primitivos abre caminho para um suporte eficiente e on-chip ao culling de primitivos. Isso pode ser feito por meshlet ou por primitivo, em relação a qualquer critério de culling arbitrário dentro do Mesh Shader. Isso permite que os shaders adiem as buscas e o sombreamento de atributos de vértices até o final do pipeline, depois que várias camadas de culling já tiverem sido realizadas.

Amplification Shaders

Os compute shaders são usados regularmente para pré-processar recursos, seguidos por chamadas de desenho que consomem seus resultados usando ExecuteIndirect. Essa é uma técnica comum para muitas formas de culling por visão. Ela tem algumas desvantagens sutis que poderiam ser otimizadas com o suporte de hardware adequado. Em primeiro lugar, as instâncias de compute shader devem gravar seus dados na memória global. Isso gera latência de busca e as sujeita à contenção de largura de banda de memória em toda a GPU. Em segundo lugar, se o produtor de computação e o consumidor gráfico forem operações consecutivas, a GPU deverá aguardar a conclusão de todas as instâncias de compute shader antes de lançar as chamadas de desenho consumidoras. Isso é causado por uma barreira de recurso de unordered access view (UAV), que deve garantir que todas as gravações do compute shader na UAV final sejam concluídas antes que qualquer shader possa consumi-la. Figura 3. Visualização simplificada do agendamento de waves de um compute shader seguido imediatamente de um desenho ExecuteIndirect “DispatchMesh”. As waves de compute shader (amarelo) são separadas da execução das waves de Mesh Shader (verde) por uma paralisação do pipeline devido a uma barreira UAV. Os IDs numerados relacionam o grupo de threads de compute shader que fez a invocação ao seu cluster de Mesh Shaders filhos. Diagrama de uma visualização simplificada do agendamento de waves, mostrando uma carga de trabalho de compute shader seguida imediatamente de uma chamada ExecuteIndirect usando DispatchMesh. As waves de compute shader, mostradas em amarelo, são separadas da execução das waves de Mesh Shader correspondentes, mostradas em verde, por uma paralisação no pipeline devido a uma barreira de recurso UAV. O estágio de Amplification Shader foi criado para resolver esses problemas. O produtor e o consumidor são encadeados (pipelined): memória entre estágios on-chip, sem flush intermediário do pipeline. O agendamento das waves de Amplification Shader e de Mesh Shader é intercalado, o que pode saturar mais completamente a GPU com trabalho. Ele também oferece um nível de capacidade generalizada de redução ou ampliação da carga de trabalho que simplesmente não existe no pipeline gráfico legado. Isso pode ser usado para implementar recursos como técnicas de culling, seleção dinâmica de nível de detalhe (LOD) por instância ou rotinas de tesselação personalizadas. Figura 4. Visualização do agendamento de waves de uma carga de trabalho de Amplification Shader. A paralisação é eliminada do pipeline. Os IDs numerados relacionam o grupo de threads de Amplification Shader que fez a invocação ao seu cluster de Mesh Shaders filhos. Diagrama de uma visualização simplificada do agendamento de waves, mostrando uma carga de trabalho de Amplification Shader. As waves de Amplification Shader, mostradas em amarelo, são intercaladas com as waves de Mesh Shader correspondentes, mostradas em verde, eliminando a paralisação do pipeline.

Confira também

Visão geral do pipeline de Mesh Shader Visão geral da API de Mesh Shader Uso do pipeline de Mesh Shader
Última modificação em 6 de outubro de 2026