HLSL 2021
Depuis le GDK d’octobre 2023, DXC utilise par défaut le langage HLSL 2021. HLSL 2021 ajoute la prise en charge de diverses fonctionnalités de style C++ :- Fonctions et structures modèles
- Champs de bits sur les éléments de structure
- Surcharge d’opérateurs
- Surcharge de fonctions de style C++
- Court-circuit des opérations logiques pour les scalaires
-HV 2018 au compilateur.
La liste des problèmes en cours sur GitHub est disponible sous l’étiquette HLSL 2021.
N’hésitez pas à signaler un bogue sur GitHub ou à nous écrire à l’adresse AskHLSL@microsoft.com pour nous faire part de vos commentaires et problèmes.
En cours de développement
DXC pour XBOX est actuellement en cours de développement actif. Nous ajouterons une nouvelle interface .dll simplifiée pour le compilateur, de nombreux autres intrinsèques XBOX, la prise en charge de nouveaux modèles de nuanceur ainsi que de nombreuses autres fonctionnalités et améliorations des performances dans les prochaines versions. Vous pouvez communiquer avec l’équipe à l’adresse AskHLSL@microsoft.com.Aide sur le compilateur de nuanceurs
- Utilisation de DXC : comment utiliser l’interface en ligne de commande (dxc) et l’interface .dll (dxcompiler_x.dll) du compilateur
- Guide de portage de FXC vers DXC : quelques conseils et astuces pour le portage des nuanceurs vers DXC
Fonctionnalités propres à XBOX
DXC pour XBOX prend en charge de nombreux intrinsèques et définitions spéciales qui ne sont pas disponibles sur Windows. Pour plus de renseignements, consultez les rubriques suivantes :- Définitions XBOX
- Intrinsèques XBOX
- Extensions HLSL pour XBOX
- Fonctionnalités des modèles de nuanceur prises en charge sur XBOX
Précompilation
Sur XBOX, le compilateur DXC peut compiler le HLSL jusqu’aux instructions finales de l’architecture du jeu d’instructions (ISA) des GPU XBOX. Les titres peuvent ainsi éviter une étape coûteuse de compilation à l’exécution, du DXIL vers les instructions ISA. Nous appelons cette étape de compilation complète « précompilation », car elle compile les nuanceurs en ISA hors ligne (sur le PC de développement) plutôt qu’en ligne (sur la console XBOX). Diverses définitions permettent de contrôler la précompilation. Sur XBOX, il existe essentiellement 3 façons de compiler les nuanceurs. A. Précompilation hors ligne avec DXIL supprimé (/D__XBOX_STRIP_DXIL=1)Documentation externe
Vous pouvez consulter l’intégralité du code source, et même contribuer au nouveau compilateur frontal, sur GitHub : DirectXShaderCompiler. La documentation générale sur le langage HLSL (High-Level Shader Language) est disponible sur Microsoft Docs : Reference for HLSL. La documentation sur le nouveau compilateur et les modèles de nuanceur plus avancés se trouve maintenant sur GitHub : wiki DirectXShaderCompiler.Différences entre DXC sur XBOX et DXC sur Windows
Sur Windows, les nuanceurs sont compilés en DXIL, qui est ensuite envoyé au pilote GPU pour la compilation finale. Sur XBOX, comme le matériel GPU cible est fixe, les nuanceurs sont précompilés par défaut, ce qui permet d’ignorer la phase de compilation à l’exécution.Pour compiler un nuanceur sur XBOX, une signature racine doit être spécifiée afin que le compilateur puisse précompiler le nuanceur. Si le nuanceur est utilisé à l’exécution avec une autre signature racine, une compilation à l’exécution se produit, ce qui est souvent indésirable. Notez que pour tester des nuanceurs ou pour les outils, vous pouvez ignorer complètement la précompilation à l’aide de la définition
__XBOX_DISABLE_PRECOMPILE, mais cela n’est pas recommandé pour une utilisation normale à l’exécution.Prise en charge des fonctionnalités des modèles de nuanceur sur XBOX
XBOX offre une prise en charge partielle des fonctionnalités facultatives des modèles de nuanceur à partir du modèle de nuanceur 6.0. Si aucune fonctionnalité facultative non prise en charge n’est utilisée, vous pouvez compiler vos nuanceurs pour cibler n’importe quel modèle de nuanceur sur XBOX. Les détails des fonctionnalités des modèles de nuanceur sont disponibles sur GitHub. Le tableau ci-dessous détaille la prise en charge des fonctionnalités des modèles de nuanceur sur XBOX.
[1] Consultez les intrinsèques de vague XBOX pour obtenir la liste des intrinsèques et types pris en charge.
[2] Pour la famille XBOX One, nous ne pouvons pas faire pivoter les sommets pour y accéder dans l’ordre du sommet provoquant imposé par la spécification; ils sont donc retournés dans l’ordre fourni par le matériel. Cela correspond au comportement des intrinsèques barycentriques XBOX existants.
[3] Nous ne prenons pas en charge les objets RayQuery de DXR 1.1. Nous prenons toutefois en charge une technique propre à XBOX, appelée parcours inline, qui peut être utilisée à la place des objets RayQuery.
[4] Les qualificateurs d’accès à la charge utile sont ignorés sur XBOX.
Sur XBOX Series X|S, le compilateur de nuanceurs prend en charge les types 16 bits natifs, qui peuvent être activés à l’aide de l’indicateur de compilation -enable-16bit-types et en définissant la version du modèle de nuanceur sur 6.2 ou supérieure. Sur XBOX Series X|S, il est fortement recommandé d’utiliser des types 16 bits natifs plutôt que des types à précision minimale autant que possible. Dans une prochaine version, l’utilisation de -enable-16bit-types ne sera plus nécessaire, car les types 16 bits natifs seront activés par défaut.
[5] Les décalages programmables génèrent de l’ISA si l’on tente de les utiliser, mais le code généré est incorrect et ne fonctionnera pas comme prévu.
[6] Cette fonctionnalité est disponible par l’intrinsèque HLSL XB_Store
[7] L’attribut [WaveOpsIncludeHelperLanes] se compile, mais le compilateur XBOX l’ignore actuellement.
Problèmes connus
- Si vous utilisez des allocateurs personnalisés (DxcCreateInstance2), ils ne doivent pas être libérés avant le déchargement de la .dll dxcompiler.
- PIX ne peut pas trouver automatiquement les .pdb si le nuanceur est sérialisé et que le nom du .pdb ne correspond pas à la chaîne de hachage. À l’avenir, nous ajouterons à PIX une option permettant de rechercher dans tous les .pdb de votre chemin de recherche de .pdb PIX un hachage correspondant, quel que soit le nom du .pdb.
- La taille du DXIL est en moyenne supérieure à celle du DXBC. Nous travaillons activement sur les problèmes de taille du DXIL.
- La taille des données de réflexion sera considérablement réduite dans une prochaine version.
- Le débogueur HLSL de PIX pour les nuanceurs créés avec DXC présente de nombreux problèmes. Nous travaillons activement à en améliorer la qualité.
- __XBOX_ENABLE_SIGNATURE_PACKING ne s’applique actuellement qu’aux étapes de nuanceur de sommets et de nuanceur de pixels.
- Nous travaillons activement à améliorer les performances de compilation et d’exécution. Si certains de vos nuanceurs sont trop longs à compiler ou n’atteignent pas les performances d’exécution attendues, écrivez-nous à l’adresse AskHLSL@microsoft.com ou contactez-nous sur les forums XBOX.
Comprendre les phases et la terminologie des compilateurs GPU
Les compilateurs GPU se composent d’un « frontal », qui analyse le HLSL pour le convertir en un langage intermédiaire, lequel est consommé par le compilateur « dorsal » qui effectue des optimisations de bas niveau propres à la machine et produit le code machine du GPU.Implémentation de NGG dans le compilateur XBOX (Scarlett uniquement)
NGG (Next Generation Geometry) ignore l’étape matérielle IA et permet un débit de primitives beaucoup plus élevé. Indicateurs supplémentaires qui contrôlent la génération de code NGG :
Pour tirer parti de l’élimination automatique, le titre doit :
- Exporter une valeur
SV_Positiondepuis le VS avec ses quatre composantes écrites. - Définir
D3D12_RASTERIZER_DESC.CullModedansD3D12_GRAPHICS_PIPELINE_STATE_DESCsur une valeur autre queD3D12_CULL_MODE_NONE.
D3D12_RASTERIZER_DESC.FrontCounterClockwise est lue à l’exécution pour déterminer l’ordre d’enroulement des sommets. Actuellement, les types d’élimination suivants sont effectués :
- Élimination des faces arrière
- Élimination des triangles d’aire nulle
- Élimination selon le tronc de visualisation
Rentabilité de l’activation de NGG
Bien que l’objectif final soit d’activer l’élimination NGG par défaut, elle n’est actuellement rentable que dans quelques situations connues. Les voici :- Le matériel est limité par le traitement des primitives (4 primitives/cycle d’horloge)
- Nombre élevé de sommets/primitives pour le dessin avec un maillage en serpentin (pour créer de longues séquences de sommets orientés vers l’arrière), de sorte que de longues séquences de sommets sont éliminées.
- Nombreux accès mémoire qui ne servent qu’aux attributs
- Grand nombre d’exportations d’attributs
Améliorations futures
Il s’agit d’une version initiale qui sera améliorée au fil du temps. Les améliorations prévues sont les suivantes :- Ajuster la taille des groupes de threads. L’élimination NGG nécessite l’allocation de LDS. Une taille de groupe de threads importante limite l’occupation du nuanceur compilé en raison des limites d’allocation de LDS.
- Activer la sortie anticipée lorsque l’ensemble du groupe de threads est éliminé.
- Exportations par primitive pour les attributs non interpolés.
- Ajouter des heuristiques pour désactiver l’élimination lorsqu’il peut être déterminé statiquement qu’elle n’est pas rentable. Exemples :
- Instructions dupliquées dans les sections de nuanceur avant et après l’élimination (en raison du partage entre les exportations de position et d’attributs).
- Position.Z vaut 0 : triangle plat (2D) qui ne sera probablement pas éliminé.
- Contournement des petits sous-groupes.
- Autres optimisations mineures.
