Concevoir un compilateur de shaders DirectX meilleur que celui de Microsoft
- Récit sur l’état complexe du compilateur de shaders DirectX de Microsoft et sur les efforts visant à offrir une meilleure expérience aux développeurs de jeux.
- Développement en cours, avec Zig, d’une API graphique expérimentale appelée
sysgpu pour le moteur Mach, successeur de WebGPU, avec prise en charge prévue des backends Metal, Vulkan, Direct3D et OpenGL.
- Il faut compiler des programmes de shaders utilisables avec Direct3D 12.
Bref historique de DirectX
- L’API graphique DirectX utilise HLSL comme langage de shading.
- Avant Direct3D 11, un compilateur nommé
FXC était utilisé, connu notamment pour sa lenteur et la génération d’un code peu optimisé.
FXC n’est plus utilisé, et DXC est arrivé avec Direct3D 12
- Avec la sortie de Direct3D 12 et de Shader Model 6.0 (SM6), Microsoft a abandonné FXC et présenté un nouveau compilateur appelé
DXC.
- DXC est un fork officiel par Microsoft de LLVM/Clang v3.7, dont les modifications sont clairement signalées dans les commentaires.
Ce que les pilotes DirectX prennent au petit-déjeuner : DXBC ou DXIL
- HLSL est le langage de prédilection pour programmer avec Direct3D, mais dans la pratique, les GPU reposent sur des architectures de calcul et des exigences variées.
- Microsoft fournit une API frontend conviviale pour les développeurs, tandis que les fabricants de matériel indépendants écrivent des pilotes qui transforment cela vers quelque chose au plus proche de l’ISA réelle du matériel.
- Avec l’arrivée de DirectX 12 et de Shader Model 6.0, un nouveau format appelé DXIL est utilisé à la place de DXBC.
DXIL
- DXIL est le format officiel actuellement utilisé par les fabricants de pilotes DirectX 12.
- Les développeurs de jeux utilisent le compilateur DXC pour générer du bytecode DXIL, puis le transmettent au pilote graphique afin qu’il soit converti en véritable code machine exécuté sur le matériel GPU.
Modifications du fork LLVM de Microsoft
- Microsoft reconnaît qu’il n’est pas idéal que les fabricants de pilotes indépendants utilisent un format spécifique de bitcode LLVM, et admet que maintenir un fork de LLVM n’a rien d’agréable.
- Microsoft a commencé à travailler à l’intégration directe de la prise en charge de la compilation HLSL dans LLVM/Clang.
Défis pour les développeurs de jeux, WebGPU, etc.
- Une couche d’abstraction graphique doit fournir un langage de shading unifié, et aujourd’hui la plupart des implémentations de WebGPU compilent HLSL vers DXBC ou DXIL.
Détour simple : SPIR-V
- Vulkan/SPIR-V utilise une approche similaire, et c’est le fabricant du GPU qui décide si SPIR-V est optimisé ou non.
Faut-il utiliser dxcompiler.dll ou non ?
- Les runtimes WebGPU doivent choisir entre le nouveau compilateur HLSL DXC, ou l’ancien compilateur FXC officiellement abandonné, moins bon en performances et en qualité du code généré.
Pourquoi ne peut-on pas faire un lien statique ?
- Le fork LLVM de Microsoft ne prend pas en charge l’édition de liens statique, en raison de la complexité du système de build.
Présentation de dxil.dll — un blob propriétaire de signature de code pour les shaders DirectX
dxil.dll n’est pas construit à partir des sources et dépend d’un blob de code propriétaire, spécifique à chaque plateforme, dans le dépôt « open source » de Microsoft.
Problèmes de prise en charge des plateformes
- Microsoft ne distribue
dxil.dll que pour Windows (x86/arm) et Linux (x86), sans fournir de binaire pour macOS ni pour Linux aarch64.
Résumé
- Il est impossible de construire DXC comme bibliothèque statique, et restaurer les fonctionnalités LLVM à cause du blob propriétaire de signature de code représenterait un travail énorme.
- Il n’est pas possible d’effectuer une compilation hors ligne de shaders pour des jeux multiplateformes depuis des pipelines CI sur macOS ou Linux arm.
Amélioration du système de build
- Exploration d’un passage du système de build CMake vers
build.zig afin de permettre une construction sous la forme d’une unique bibliothèque statique.
Résolution des dépendances aux bibliothèques dynamiques
- Fork de la base de code DXC et modification du code C++ pour supprimer les dépendances aux bibliothèques dynamiques.
Résolution de la signature de code propriétaire
- Une méthode a été trouvée pour compiler des shaders HLSL sans dépendre de
dxil.dll.
Résultat
- Mise à disposition d’une bibliothèque
dxcompiler et d’un CLI dxc sous forme de binaires statiques ne dépendant pas du dxil.dll propriétaire.
- Les binaires pour macOS, Linux et Windows sont construits dans le pipeline CI.
Points à noter
- Certains binaires ne sont pas encore construits ou testés, et il est prévu d’utiliser Zig lui-même comme langage de shading à la place de HLSL.
Note personnelle
- Après avoir obtenu un emploi technique à temps plein sous le nom de Stephen, l’auteur est actif en ligne pour construire le moteur Mach.
- Il est enraciné dans le FOSS et estime qu’il faut posséder ses outils et être rendu plus autonome par eux.
- Son rêve est de construire Mach pour tout le monde et de gagner sa vie en vendant des jeux de haute qualité.
Merci de votre lecture
- Consultez machengine.org.
- Envisagez de soutenir le développement pour permettre davantage de travail.
- Rejoignez le serveur Discord de Mach.
- Soutenez le projet sur GitHub.
- machengine.org
L’avis de GN⁺
- Le point le plus important de cet article est l’effort de la communauté de développeurs pour surmonter la complexité et les limites de DXC, le compilateur de shaders DirectX de Microsoft.
- En utilisant Zig pour améliorer le système de build de DXC et en proposant une nouvelle approche pour compiler des shaders HLSL sans dépendre du
dxil.dll propriétaire, le développeur du moteur Mach apporte une contribution importante au développement de jeux multiplateforme.
- L’article souligne l’importance du logiciel open source et le fait que les développeurs doivent pouvoir posséder et contrôler leurs outils, tout en montrant la valeur de la collaboration et de l’innovation au sein de la communauté technique.
1 commentaires
Avis Hacker News
Un excellent aperçu de la complexité de la compilation de shaders pour les API 3D
Problèmes liés à Godot
dxil.dlldu DirectX Shader Compiler distribuée avec Godot.Discussion sur la distribution de .dll supplémentaires
.dllsupplémentaires, au même titre que des middlewares propriétaires déjà utilisés par de nombreux jeux vidéo (Bink, SpeedTree, PhysX, etc.)..DLL.dxil.dlldans leurs fichiers d’installation.dxil.dll.Question sur la signature de DXIL.dll
Changements de DXC dans la couche de génération de code et l’infrastructure de LLVM
Conseil sur l’écosystème Mach
mach-sysgpu, une réimplémentation complète de WebGPU, principalement écrite par Ali Chraghi, âgé de 17 ans.Discussion sur SDL_gpu et SDL3
Utilisation du langage Zig
Expression de gratitude pour ce travail d’infrastructure
Remarque sur la prononciation de DXIL