Le pipeline hérité
Au cours des 20 dernières années, le pipeline graphique a évolué pour atteindre l’état que nous connaissons aujourd’hui. Alors que les fabricants de matériel indépendants (IHV) se livrent une bataille toujours plus intense sur le nombre de cœurs, la capacité mémoire et la bande passante, certains goulots d’étranglement à fonction fixe sont devenus manifestes dans le modèle de traitement géométrique. Figure 1. Le pipeline graphique hérité. Les étapes teintées de bleu sont à fonction fixe. Les étapes teintées de vert sont des shaders programmables.
Le pipeline Mesh Shader
Le pipeline Mesh Shader cible ces limitations du pipeline graphique hérité. Tout d’abord, il supprime l’IA et le tessellateur du pipeline. L’objectif est de maximiser le débit de lancement des waves de shader et de transférer l’IA vers du code de shader capable d’évoluer avec les GPU. Cela peut aider à saturer les cœurs du GPU et à maintenir la pression sur le PA. Ce pipeline offre également la possibilité d’éliminer des charges de travail à différents points du pipeline. Les Amplification Shaders peuvent être utilisés pour effectuer une élimination à faible granularité, par exemple sur des groupes d’objets, des instances ou des meshlets. Les Mesh Shaders peuvent effectuer une élimination à la granularité de la primitive. Cela permet d’écarter tôt et souvent les primitives trivialement éliminables, ce qui économise de précieuses ressources de calcul, de la bande passante mémoire et du débit du PA. Figure 2. Les étapes du pipeline Mesh Shader. Les étapes teintées de vert sont programmables. Les étapes teintées de bleu sont à fonction fixe.
Mesh Shaders
Les Mesh Shaders ont été conçus pour apporter au pipeline de géométrie un niveau de généralité que l’on ne trouvait jusqu’alors que dans les compute shaders. Le développeur dispose ainsi d’un contrôle total sur la charge de travail de chaque thread. Le transfert des lectures d’index et d’attributs de sommets vers le code du shader supprime la dépendance au matériel à fonction fixe, maximise le débit de lancement des waves et permet à l’IA d’évoluer avec le reste du GPU. Leur capacité à spécifier dynamiquement le nombre de sommets et de primitives exportés ouvre la voie à une prise en charge efficace et sur puce de l’élimination des primitives. Celle-ci peut être effectuée par meshlet ou par primitive, selon n’importe quel critère d’élimination arbitraire, au sein du Mesh Shader. Les shaders peuvent ainsi différer les lectures et l’ombrage des attributs de sommets jusqu’à la fin du pipeline, après que plusieurs couches d’élimination ont déjà été effectuées.Amplification Shaders
Les compute shaders sont régulièrement utilisés pour prétraiter des ressources, suivis d’appels de dessin qui consomment leurs résultats à l’aide d’ExecuteIndirect. Il s’agit d’une technique courante pour de nombreuses formes d’élimination par vue. Elle présente toutefois quelques inconvénients subtils qui pourraient être optimisés avec une prise en charge matérielle adéquate. D’une part, les instances de compute shader doivent écrire leurs données dans la mémoire globale. Cela entraîne une latence de lecture et expose les données à la contention de bande passante mémoire à l’échelle du GPU. D’autre part, si le producteur compute et le consommateur graphique sont des opérations consécutives, le GPU doit attendre la fin de toutes les instances de compute shader avant de lancer les appels de dessin consommateurs. Cela est dû à une barrière de ressource de vue d’accès non ordonné (UAV) qui doit garantir que toutes les écritures du compute shader dans l’UAV final sont terminées avant qu’un shader puisse le consommer. Figure 3. Visualisation simplifiée de la planification des waves d’un compute shader immédiatement suivi d’un dessin ExecuteIndirect « DispatchMesh ». Les waves du compute shader (en jaune) sont séparées de l’exécution des waves Mesh Shader (en vert) par un blocage du pipeline dû à une barrière UAV. Les ID numérotés associent le groupe de threads de compute shader appelant à son ensemble de Mesh Shaders enfants.

