Passer au contenu principal
DXC prend en charge une interface en ligne de commande (dxc.exe) et une interface .dll (dxcompiler.dll, dxcompiler.lib, dxcapi.h et d3d12shader.h).

Binaires du compilateur

Pour Windows, les derniers binaires du compilateur peuvent être téléchargés depuis GitHub. Nous recommandons de toujours effectuer la mise à jour vers la dernière version. Pour XBOX, les binaires sont installés avec le Microsoft Game Development Kit (GDK) et sont versionnés à chaque version. Notez que pour les .dll et les en-têtes, la convention de nommage « _x » est utilisée pour XBOX One et la convention « _xs » pour XBOX Series X|S. Windows
Outils PC pour XBOX One
Runtime de la console XBOX One
Outils PC pour XBOX Series X|S
Runtime de la console XBOX Series X|S
L’utilisation d’un compilateur conçu et testé pour une plateforme donnée afin de compiler des nuanceurs pour une autre plateforme n’est pas prise en charge.

Interface en ligne de commande de DXC

La liste complète des indicateurs de ligne de commande s’obtient en exécutant dxc.exe -?. Si vous connaissez FXC, de nombreux arguments de ligne de commande sont identiques. Voici quelques indicateurs courants.
DXC a été mis à jour pour ne plus incorporer par défaut le fichier .pdb (base de données de programme/informations de débogage) dans le nuanceur. Par défaut, les .pdb sont externes.
dxc.exe -? indique aussi de quelle variante du compilateur il s’agit : « HLSL Compiler for Windows », « HLSL Compiler for XBOX One » ou « HLSL Compiler for XBOX Series X|S ». Voici un exemple d’utilisation de l’interface en ligne de commande.
Dans cet exemple, myshader.hlsl est compilé en nuanceur de pixels du modèle de nuanceur 6.0. Le nuanceur compilé est écrit dans myshader.bin, comme spécifié par l’indicateur -Fo. Les informations de débogage sont activées avec l’indicateur -Zi, et le .pdb est écrit dans myshader.pdb avec l’indicateur -Fd. Si vous préférez que le compilateur génère automatiquement un nom de .pdb, vous pouvez fournir .\ comme argument de -Fd. Là encore, les informations de débogage du PDB ne sont pas incorporées dans le nuanceur. De plus, sur XBOX, une signature racine doit être fournie pour précompiler le nuanceur.

Hachage du nuanceur

Le hachage du nuanceur peut être enregistré dans un fichier à l’aide de l’indicateur de ligne de commande -Fsh. Avec l’interface .dll, il est toujours disponible par IDxcResult::GetOutput. Sur Windows, la valeur est déterminée par le hachage du DXIL du nuanceur. Sur XBOX, le hachage dépend du type de compilation demandé.
  • Si la précompilation est désactivée, le hachage porte sur le DXIL du nuanceur.
  • Si la précompilation est activée, le hachage porte sur le nuanceur précompilé.
Pour les nuanceurs précompilés, le hachage diffère selon que le DXIL est supprimé ou non, car les nuanceurs qui incluent le DXIL prennent en charge la compilation à l’exécution (si nécessaire), contrairement aux nuanceurs dont le DXIL a été supprimé.

Réflexion

Par défaut, les données de réflexion sont stockées dans le nuanceur. L’indicateur -Qstrip_reflect permet de les supprimer. L’indicateur -Fre permet maintenant d’enregistrer vos données de réflexion dans un fichier distinct, et ce fichier est enregistré même si -Qstrip_reflect est utilisé. De même, IDxcResult::GetOutput permet d’obtenir le blob de réflexion distinct, même si -Qstrip_reflect est utilisé. IDxcUtils::CreateReflection peut créer une interface de réflexion à partir de ces blobs de réflexion distincts.

PDBs

Lorsque votre nuanceur est compilé, le nom de fichier .pdb (fourni avec l’option -Fd) et un hachage du nuanceur sont stockés dans le nuanceur. PIX utilise ces informations pour trouver le .pdb du nuanceur. Sur XBOX, si vous sérialisez vos nuanceurs, seul le hachage du nuanceur est conservé. Dans ce cas, il est préférable d’utiliser l’option -Fd .\ pour utiliser le hachage du nuanceur comme nom de .pdb, afin que PIX puisse facilement trouver votre pdb. Si, pour une raison quelconque, vous devez charger un .pdb portant un autre nom, vous pouvez le charger manuellement dans PIX.

.pdb allégés

Un nouvel indicateur de compilation, « -Zs », crée un nouveau type de .pdb beaucoup plus petit que les .pdb traditionnels, qui réduit le temps de compilation lorsque des .pdb sont générés. Ces .pdb « allégés » ne contiennent que le code source et les arguments de compilation utilisés pour générer le nuanceur. PIX génère « à la demande » les informations de débogage supplémentaires nécessaires lors du débogage du nuanceur. Notez que les .pdb complets (qui contiennent tout ce que contient un .pdb allégé, plus les informations de débogage complètes utilisées par le débogueur) sont toujours pris en charge avec l’indicateur « -Zi ».

Remarque sur le versionnage du compilateur.

Lorsqu’un .pdb est généré, la version du compilateur y est stockée afin que PIX sache quel compilateur a été utilisé à l’origine pour compiler le nuanceur. PIX signale si le compilateur actuellement associé à PIX ne correspond pas à celui utilisé pour générer le nuanceur, et le compilateur correspondant peut être fourni si vous le voulez.

Nouvelle interface pdb.

Une nouvelle interface appelée IDxcPdbUtils a été introduite dans dxcapi.h. Cette interface vous permet d’inspecter le code source, les arguments de compilation, la version du compilateur et le hachage, et de recompiler le nuanceur à partir du pdb si vous le voulez.

.pdb pour le lancer de rayons (préversion)

Une prise en charge limitée des .pdb pour le lancer de rayons est maintenant activée. Pour utiliser cette fonctionnalité, compilez les bibliothèques de lancer de rayons avec les indicateurs -Zi -Qembed_debug. Pour la création de RTPSO hors ligne côté PC comme pour la création de RTPSO à l’exécution, utilisez le nouvel appel ID3D12Device8::SetCompileTimeShaderPdbPathX pour spécifier l’emplacement du PDB. Si ce chemin est défini, le pilote stocke un fichier .pdb associé à chaque RTPSO. PIX peut ensuite charger et utiliser les .pdb générés. Vous pouvez aussi générer des .pdb allégés de lancer de rayons et les enregistrer dans des fichiers .pdb individuels au lieu de les incorporer dans les nuanceurs, à l’aide des indicateurs -Zs -Fd. L’utilisation de l’API ID3D12Device8::SetCompileTimeShaderPdbPathX reste pour l’instant nécessaire pour créer le .pdb de l’objet d’état de lancer de rayons. PIX peut utiliser les multiples .pdb de bibliothèque du RTPSO pour afficher l’intégralité du code source des nuanceurs. Pour plus de renseignements, consultez la documentation PDB des nuanceurs dans PIX.

Interface DLL de DXCompiler

Les informations suivantes s’appliquent aux variantes du compilateur pour Windows, XBOX One et XBOX Series X|S. Nous omettrons toute mention de « _x » et « _xs » lorsqu’elle n’est pas nécessaire, mais les informations s’appliquent aux trois plateformes. Pour utiliser l’interface .dll, incluez dxcapi.h et d3d12shader.h, et liez votre code à la bibliothèque dxcompiler.lib ou chargez directement dxcompiler.dll.
Le chargement et le déchargement manuels d’autres .dll requises par le compilateur ne sont pas pris en charge. Nous vous recommandons de laisser la .dll chargée pendant toute la durée de vie de votre programme plutôt que de la charger et de la décharger pour chaque compilation de nuanceur.
Une fois la .dll du compilateur chargée, appelez DxcCreateInstance pour créer les différentes interfaces du compilateur.
L’appel à DxcCreateInstance est thread-safe, mais les objets créés par DxcCreateInstance ne le sont pas. Les objets du compilateur doivent être créés puis utilisés sur le même thread.

Compilation multiplateforme

Si vous choisissez de créer un seul exécutable qui compile pour plusieurs plateformes, vous ne pouvez lier votre code à aucune des bibliothèques dxcompiler. Vous devez charger directement les différentes .dll et obtenir l’adresse de la fonction DxcCreateInstance de chacune. Les objets créés pour une plateforme cible du compilateur ne peuvent en aucun cas être utilisés avec un objet créé pour une autre plateforme cible. Les en-têtes « _xs » peuvent être utilisés, mais toutes les fonctionnalités ne sont pas entièrement prises en charge sur les trois plateformes. Il faut aussi veiller à ce que les .dll chargées par dxcompiler.dll soient correctement gérées.

Utilisation de l’interface du compilateur

Nous vous recommandons d’utiliser la dernière interface IDxcCompiler3 pour tirer parti des fonctionnalités les plus récentes, notamment la possibilité de spécifier davantage d’arguments, comme en ligne de commande, les blobs nommés et l’accès direct au hachage du nuanceur. Si vous effectuez un portage depuis IDxcCompiler2, vous pouvez utiliser IDxcUtils::BuildArguments si vous préférez une interface similaire à IDxcCompiler::Compile ou IDxcCompiler2::CompileWithDebug. Bien que l’interface IDxcCompiler3::Compile ressemble à l’interface en ligne de commande, les arguments sont passés sous forme de chaînes individuelles. De plus, les guillemets utilisés en ligne de commande pour regrouper des arguments contenant des espaces en un seul argument peuvent être omis, et les séquences d’échappement requises pour les caractères spéciaux de la ligne de commande ne sont pas nécessaires. L’exemple de code suivant utilise l’interface pour compiler myshader.hlsl tout en générant un .pdb. Le flux général consiste à appeler IDxcCompiler3::Compile, puis à examiner IDxcResult pour obtenir le tampon d’erreurs, le nuanceur compilé, le .pdb et le hachage du nuanceur.
Le nom du .pdb doit être transmis à la fonction Compile à l’aide de l’argument -Fd. Comme en ligne de commande, -Fd .\ peut être utilisé pour que le compilateur génère automatiquement le nom du PDB. Si le nom du PDB est généré automatiquement, vous devez utiliser ce nom pour enregistrer votre fichier .pdb afin que PIX puisse le trouver.
Dans l’exemple suivant, la vérification courante des erreurs a été omise par souci de concision.

Utilisation d’allocateurs personnalisés

DxcCreateInstance2 est un point d’entrée de dxcompiler qui permet à l’appelant de fournir une implémentation d’IMalloc qui sera utilisée pour toutes les opérations mémoire liées aux appels à cet objet. Pour fournir une implémentation d’IMalloc valide, l’utilisateur doit implémenter une méthode QueryInterface qui vérifie correctement les interfaces prises en charge, faute de quoi le compilateur risque de planter. Voici un exemple de code à titre de référence.

Extensions de l’interface DLL pour XBOX

Après la précompilation d’un nuanceur à l’aide de l’interface dxcompiler, des statistiques spécifiques du nuanceur peuvent être interrogées sur XBOX. Voici un exemple de code (la vérification des erreurs est omise par souci de concision).

Voir aussi

Compilateur de nuanceurs
Dernière modification le 8 octobre 2026