- Actions impliquées dans la tessellation
- Mode de tessellation sur puce
- Mode de tessellation hors puce
- Heuristique utilisée pour exécuter les vagues DS en mode sur puce ou hors puce
- Activation de la tessellation hors puce
- Définition des paramètres de tessellation
Actions impliquées dans la tessellation
La tessellation sur XBOX One effectue les actions suivantes, que la tessellation soit réalisée sur puce ou hors puce.- Le GPU répartit tous les patchs générés par chaque appel de dessin individuel en groupes de threads.
- Pour chaque groupe de threads, le GPU alloue une certaine quantité de mémoire LDS (Local Data Store) dans une unité de calcul (CU). Tous les threads de vertex shader (VS) et de hull shader (HS) nécessaires sont planifiés sur cette CU.
- Pour chaque groupe de threads, le GPU exécute autant de threads VS que de points de contrôle d’entrée, multiplié par le nombre de patchs par groupe de threads.
- Pour chaque groupe de threads, le GPU exécute également autant de threads HS que de points de contrôle de sortie, multiplié par le nombre de patchs par groupe de threads.
- Tous les threads HS doivent s’exécuter simultanément en tant que groupe de threads, car des barrières de synchronisation peuvent être nécessaires. Ce fonctionnement est similaire à celui des groupes de threads des compute shaders, à ceci près que la synchronisation est ici implicite et n’est pas spécifiée dans le langage HLSL (High-Level Shader Language).
- Le tessellateur du GPU génère ensuite les threads de domain shader (DS) à exécuter, en fonction des facteurs de tessellation calculés par le HS (également regroupés par 64 threads par vague).
Mode de tessellation sur puce
Par défaut, le pilote Direct3D 12 configure toujours le GPU en mode de tessellation sur puce. Dans ce mode, toutes les données des points de contrôle d’entrée et de sortie ainsi que les constantes par patch sont stockées dans la mémoire LDS, y compris les facteurs constants. Comme la mémoire LDS est interne au GPU, aucune bande passante mémoire supplémentaire n’est générée et l’accès aux données bénéficie d’une latence faible garantie. Toutefois, comme ces données sont nécessaires aux threads DS générés par la tessellation des patchs d’un groupe de threads, tous ces threads DS doivent s’exécuter sur la même CU que celle qui a exécuté les threads VS et HS de ce groupe de threads. Cela limite fortement la capacité du GPU à équilibrer la charge de travail entre les 12 CU disponibles, en particulier lorsque les facteurs de tessellation sont élevés. Avec des facteurs de tessellation élevés, un seul groupe de threads peut générer de nombreuses vagues de threads DS, et la mémoire LDS utilisée est bloquée pour tout autre usage, y compris pour d’autres groupes de threads qui auraient autrement pu s’exécuter sur la CU. (La mémoire LDS est également utilisée pour les données locales des groupes de threads dans les compute shaders, pour les valeurs interpolées des PS et pour le mode GS sur puce.)Mode de tessellation hors puce
La tessellation hors puce est une option qui permet d’utiliser une mémoire autre que la mémoire LDS avec les hull shaders et les domain shaders. Le mode de tessellation hors puce du GPU est activé en spécifiant l’indicateur D3D12XBOX_PIPELINE_STATE_FLAG_GS_ONCHIP_TS_OFFCHIP ou D3D12XBOX_PIPELINE_STATE_FLAG_GS_OFFCHIP_TS_OFFCHIP. Ce mode utilise la même quantité de mémoire LDS que le mode sur puce, mais le HS écrit également tous les points de contrôle de sortie, les facteurs de tessellation et les constantes par patch dans un tampon mémoire. Une heuristique est ensuite utilisée pour exécuter certaines vagues DS sur la même CU en mode sur puce, en lisant les données depuis la mémoire LDS, et pour exécuter d’autres vagues DS sur d’autres CU en mode hors puce, en lisant les données depuis la mémoire. Cela permet au GPU de libérer la mémoire LDS du groupe de threads avant que toutes les vagues DS soient terminées, voire lancées, et d’équilibrer plus efficacement les vagues DS entre toutes les CU. L’avantage de la tessellation hors puce est que la mémoire LDS est libérée pour d’autres usages graphiques. Le gain de performances réellement obtenu par la tessellation hors puce dépend fortement du code du titre. Il est possible qu’aucune amélioration des performances n’en résulte.Heuristique utilisée pour exécuter les vagues DS en mode sur puce ou hors puce
L’heuristique utilisée pour exécuter certaines vagues DS en mode sur puce et d’autres en mode hors puce s’applique à chaque groupe de threads de la manière suivante.- Un thread du HS rassemble tous les facteurs de tessellation de tous les patchs et calcule un facteur de tessellation moyen pour l’ensemble du groupe de threads. Si cette valeur est inférieure à TfThreshold, le mode hors puce est désactivé pour l’ensemble du groupe de threads. Aucune donnée n’est écrite en mémoire et toutes les vagues DS s’exécutent sur la même CU.
- Si le mode hors puce n’est pas désactivé pour le groupe de threads, les DsWaveThreshold premières vagues DS s’exécutent en mode sur puce, après quoi la mémoire LDS est récupérée et toutes les vagues DS restantes s’exécutent hors puce.
Activation de la tessellation hors puce
Les hull shaders et les domain shaders destinés à être utilisés avec la tessellation hors puce doivent être compilés avec l’instruction#define suivante.
