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 :- 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émantiqueCOLOR, 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.
- 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 fonctionIDxcCompiler3::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 ».
