Passer au contenu principal

Introduction

Cette rubrique sert de point de référence pour le portage de vos nuanceurs HLSL (High-Level Shader Language) existants de D3DCompiler (FXC) vers DXCompiler (DXC). Plus précisément, elle fournit des informations sur les points suivants :
  1. Activer certains anciens comportements de compilation de FXC qui sont désactivés par défaut dans DXC. DXC les prend en charge au moyen des indicateurs de compilation suivants :
    • -Gec : active la rétrocompatibilité avec Direct3D 9 (par exemple, active la prise en charge de la sémantique COLOR, qui n’est prise en charge que jusqu’à Direct3D 9).
    • -HV : active la rétrocompatibilité avec FXC en définissant la version du langage sur 2016 (c’est-à-dire -HV 2016). Cela active une sémantique de langage héritée disponible dans FXC.
    • -flegacy-macro-expansion : développe les opérandes avant d’effectuer l’opération de collage de jetons (comportement de FXC).
    • -flegacy-resource-reservation : réserve les affectations explicites de registres inutilisées pour la compatibilité avec le modèle de nuanceur 5.0 et versions antérieures.
    • -D __XBOX_PRECOMPILE_ALL_STAGES : sur XBOX Series X|S, la précompilation des nuanceurs est beaucoup plus conservatrice. Les valeurs par défaut de la XBOX One restent inchangées. Pour plus de renseignements, consultez Définitions XBOX.
  2. Fournir des informations sur les anciennes syntaxes HLSL dépréciées qui étaient prises en charge par FXC mais ne le sont plus par DXC.

Modifications de l’interface .dll du compilateur

Nous vous recommandons d’utiliser la nouvelle fonction IDxcCompiler3::Compile pour compiler les nuanceurs DXC. Pour plus de renseignements sur les routines d’assistance qui faciliteront le portage du code existant vers la nouvelle interface, ainsi que des exemples de code, consultez Utilisation de DXC.

Rétrocompatibilité avec les comportements de FXC

Modèle uniquement multiplicatif pour la fonction intrinsèque pow

Par défaut, DXC utilise toujours le modèle log-mul-exp (expliqué ci-après) pour implémenter la fonction pow. En revanche, FXC utilise aussi, dans certains scénarios, le modèle mul-only pour implémenter la fonction pow. Par exemple, pour les petites valeurs constantes de y (comme pow(x, 3)), FXC utilise le modèle mul-only. La fonction pow peut donc produire des résultats différents selon qu’elle est compilée avec FXC ou avec DXC. Par exemple, pour une valeur d’exécution x=0, pow(x,3) donne respectivement NaN et 0 avec DXC et FXC. Pour obtenir le comportement de FXC pour la fonction pow avec DXC, définissez la version du langage sur 2016 (à l’aide de l’indicateur -HV 2016) lors de la compilation.

Exemple d’implémentation de pow à l’aide du modèle log-mul-exp

Exemple d’implémentation de pow à l’aide du modèle mul-only

Accès hors limites aux tableaux

Par défaut, DXC génère une erreur lorsqu’il trouve des références à un tableau avec un index constant hors limites. Par exemple, le nuanceur HLSL suivant ne se compile pas et produit le message d’erreur : error: array index 3 is out of bounds. Vous pouvez transformer cette erreur en avertissement en définissant la version du langage sur 2016 (c’est-à-dire à l’aide de l’indicateur -HV 2016), uniquement lorsque l’accès hors limites se produit dans du code inutilisé ou mort.

Avertissement lorsque l’attribut unroll ne peut pas être respecté

Lorsque l’attribut unroll est appliqué à une boucle et que le nombre d’itérations de la boucle ne peut pas être déterminé à la compilation ou dépasse un certain seuil, DXC ne parvient pas, par défaut, à compiler des nuanceurs tels que le suivant. Pour transformer cet échec en avertissement, définissez la version du langage sur 2016. Lorsque le nuanceur suivant est compilé avec DXC et l’indicateur -HV 2016, il se compile correctement sans dérouler la boucle et génère un message d’avertissement : warning: Could not unroll the loop.

Sémantique COLOR

La sémantique COLOR n’est pas prise en charge par défaut dans DXC. Lorsque vous écrivez de nouveaux nuanceurs HLSL ciblant DXC, utilisez plutôt SV_Target. Toutefois, DXC offre aussi la possibilité de compiler des nuanceurs faisant référence à la sémantique COLOR en lui passant l’indicateur -Gec. Par exemple, le code HLSL suivant doit se compiler correctement avec DXC lorsque l’indicateur -Gec est utilisé.

Propriété Length sur les tableaux constants

La propriété Length sur les tableaux constants est prise en charge dans DXC avec l’indicateur -Gec, comme le montre l’exemple suivant.

Écriture dans les variables globales

Les variables globales sont traitées comme des constantes en HLSL, mais comme FXC, DXC permet aussi d’écrire dans les variables globales avec l’indicateur -Gec, comme le montre l’exemple suivant.

Réservation de ressources héritée à l’aide de l’indicateur -flegacy-resource-reservation

Pour le modèle de nuanceur 5.0 ou antérieur, FXC tenait compte de l’allocation de registres des ressources inutilisées lors de l’allocation des registres des ressources utilisées. Par exemple, lors de la compilation du nuanceur suivant avec FXC en SM5.0 et 5.1, Tex1[1] est lié respectivement à t4 et à t0. Avec DXC, pour obtenir le comportement d’allocation des ressources de FXC avec SM5.0 ou antérieur, utilisez l’indicateur -flegacy-resource-reservation.

Liaison des ressources avec FXC en SM5.0

Liaison des ressources avec FXC en SM5.1

Liaison des ressources avec DXC en SM6.0 sans l’indicateur -flegacy-resource-reservation

Liaison des ressources avec DXC en SM6.0 avec l’indicateur -flegacy-resource-reservation

Développement de macros hérité à l’aide de l’indicateur -flegacy-macro-expansion

Le nuanceur HLSL suivant se compile correctement avec FXC, mais génère une erreur avec DXC, car b##slot est remplacé par bSLOT_VAL au lieu de b3, ce qui fait échouer la compilation. Pour obtenir le comportement de remplacement de jetons de FXC avec DXC, compilez avec l’indicateur supplémentaire « -flegacy-macro-expansion ».
Dans ce cas, vous pouvez éviter d’utiliser l’indicateur -flegacy-macro-expansion en suivant les règles standard du préprocesseur.
-flegacy-macro-expansion n’est d’aucune aide lorsque les jetons ne sont pas des arguments de macro, même si fxc les développe quand même. Le code suivant génère une erreur même si -flegacy-macro-expansion est utilisé.
La modification suivante rend le code HLSL conforme aux règles standard du préprocesseur, et l’option -flegacy-macro-expansion n’est plus nécessaire.

Comportements de FXC non pris en charge

Effect Framework

Les fonctionnalités liées à l’Effect Framework ne sont plus prises en charge.

Paramètres uniformes sur les fonctions d’entrée

Les paramètres uniformes sur les fonctions d’entrée ne sont plus pris en charge.

Interfaces

Les interfaces ne sont plus prises en charge.

Les fonctions d’échantillonnage de texture propres à une dimension ne sont plus prises en charge

Les fonctions tex1D, tex2D et autres fonctions d’échantillonnage similaires sont maintenant dépréciées. Pour savoir comment effectuer le portage vers les fonctions d’échantillonnage prises en charge, consultez l’exemple suivant.

Exemple utilisant l’ancienne syntaxe d’échantillonnage, qui n’est plus prise en charge

Exemple illustrant la syntaxe d’échantillonnage prise en charge

Chevauchement de sémantiques non pris en charge

DXC interdit l’utilisation de sémantiques en double. Par exemple, le nuanceur suivant ne se compile pas avec DXC.

« ConstantBuffer » non pris en charge comme nom de tampon constant

À partir de SM5.1, HLSL prend en charge les tampons constants indexables au moyen de la construction de modèle ConstantBuffer. ConstantBuffer est donc un mot clé réservé et DXC interdit son utilisation comme nom de tampon.

Nous communiquer avec

Pour toute question, demande d’aide ou signalement de problème, vous pouvez nous contacter à l’adresse AskHLSL@microsoft.com.

Voir aussi

Compilateur de nuanceurs
Dernière modification le 8 octobre 2026