dcl_interface_dynamicindexed (sm5 - asm)
Déclarez des pointeurs de table de fonctions (interfaces).
dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...} |
---|
Élément | Description |
---|---|
Fp # |
[in] Pointeurs de table de fonctions. |
Notes
Chaque interface doit être liée à partir de l’API pour que le nuanceur soit utilisable. La liaison donne une référence à l’une des tables de fonctions afin que les emplacements de méthode puissent être renseignés. Le compilateur ne génère pas de pointeurs pour les objets non référencés.
Un pointeur de table de fonctions a un ensemble complet d’emplacements de méthode pour éviter le niveau d’indirection supplémentaire requis par une représentation pointeur vers pointeur vers vtable C++. Cela nécessiterait également que ces pointeurs soient à 5 tuples. Dans le modèle d’inlining virtuel HLSL, on sait toujours quelle variable/entrée globale est utilisée pour un appel, afin que nous puissions configurer des tables par objet racine.
Les déclarations de pointeur de fonction indiquent quelles tables de fonctions sont autorisées à utiliser avec elles. Cela permet également la dérivation des informations de corrélation de méthode.
La première [] d’une déclaration d’interface est la taille du tableau. Si l’indexation dynamique est utilisée, la déclaration l’indique comme indiqué. Un tableau de pointeurs d’interface peut également être indexé statiquement. Il n’est pas nécessaire que les tableaux de pointeurs d’interface signifient une indexation dynamique.
La numérotation des pointeurs d’interface commence à 0 pour la première déclaration et prend ensuite en compte la taille du tableau, de sorte que le premier pointeur après un tableau de quatre entrées fp0[4][1] serait fp4[][].
Le deuxième [] d’une déclaration d’interface est le nombre de sites d’appel, qui doit correspondre au nombre de corps dans chaque table référencée dans la déclaration.
Il n’existe aucune limite au nombre de choix de table de fonctions (ft#) pouvant être répertoriés dans une déclaration d’interface.
Une table de fonctions donnée (ft#) peut apparaître plusieurs fois dans une ou plusieurs déclarations d’interface.
Restrictions
Le nombre de sites d’objets dans un nuanceur, qui correspond à la somme de toutes les déclarations fp# de leurs déclarations [arraySize], ne doit pas être supérieur à 253. Ce nombre correspond au nombre de pointeurs qui peuvent être présents. Le runtime applique cette limite de 253 pour conserver une limite sur la taille de la DDI pour la communication de ces données de pointeur.
Le nombre de sites d’appel dans un nuanceur, qui correspond à la somme de toutes les instructions fcall du nombre de cibles de branche potentielles, ne doit pas être supérieur à 4 096.
Par exemple, un fcall qui utilise un index statique pour la première dimension fp[][] compte comme un :
fcall fp0[0][0] // +1
Fcall qui utilise un index dynamique compte comme nombre d’éléments dans le tableau (premier [] de dcl_interface) :
dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...
fcall fp1[r0.z + 0][1] // +2
Cette limite permet à certaines implémentations de s’adapter facilement à des tables de sélections de corps de fonction dans un stockage de type mémoire tampon constante.
Cette instruction s’applique aux étapes suivantes du nuanceur :
Sommet | Coque | Domain | Géométrie | Pixel | Compute |
---|---|---|---|---|---|
X | X | X | X | X | X |
Modèle de nuanceur minimal
Cette instruction est prise en charge dans les modèles de nuanceur suivants :
Modèle de nuanceur | Prise en charge |
---|---|
Modèle de nuanceur 5 | Oui |
Modèle de nuanceur 4.1 | non |
Modèle de nuanceur 4 | non |
Modèle de nuanceur 3 (DirectX HLSL) | non |
Shader Model 2 (DirectX HLSL) | non |
Modèle de nuanceur 1 (DirectX HLSL) | non |
cs_4_0 et cs_4_1 prennent en charge cette instruction pour les UAV et SRV.