Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’objectif de la signature racine version 1.1 est d’autoriser les applications à indiquer aux pilotes lorsque les descripteurs dans un tas de descripteurs ne changent pas ou que les descripteurs de données pointent pour ne pas changer. Cela permet aux pilotes d’effectuer des optimisations qui peuvent être possibles en sachant qu’un descripteur ou la mémoire à laquelle il pointe est statique pendant une certaine période.
- Vue d’ensemble
-
indicateurs statiques et volatiles
- DESCRIPTORS_VOLATILE
- DATA_VOLATILE
- DATA_STATIC_WHILE_SET_AT_EXECUTE
- DATA_STATIC
- combinaison d’indicateurs
- récapitulatif des indicateurs
-
résumé de l’API version 1.1
- énumérations
- structures
- Functions
- méthodes
- structures d’assistance
- Conséquences d’une violation des indicateurs statiques
- gestion des versions
- rubriques connexes
Aperçu
La version de signature racine 1.0 permet le contenu des tas de descripteur et de la mémoire à laquelle ils pointent pour être modifiés librement par les applications chaque fois que les listes de commandes /bundles qui les référencent sont potentiellement en cours de vol sur le GPU. Toutefois, très souvent, les applications n’ont pas réellement besoin de la flexibilité nécessaire pour modifier les descripteurs ou la mémoire après les commandes qui les référencent ont été enregistrées.
Les applications sont souvent facilement en mesure de :
- Configurez les descripteurs (et la mémoire à laquelle ils pointent) avant de lier des tables de descripteur ou des descripteurs racines sur une liste de commandes ou un bundle.
- Assurez-vous que ces descripteurs ne changeront pas tant que la liste de commandes /bundles faisant référence à ces descripteurs n’a pas fini de s’exécuter pour la dernière fois.
- Vérifiez que les données vers laquelle les descripteurs pointent ne changent pas pendant la même durée.
Sinon, une application peut uniquement être en mesure d’honorer ces données ne change pas pendant une durée plus courte dans le temps. En particulier, les données peuvent être statiques pour la fenêtre dans le temps pendant l’exécution de la liste de commandes qu’une liaison de paramètre racine (table de descripteur ou de descripteur racine) pointe actuellement vers les données. En d’autres termes, une application peut souhaiter exécuter l’exécution sur la chronologie GPU qui met à jour certaines données entre les périodes où elle est définie via un paramètre racine, sachant que lorsqu’elle est définie, elle sera statique.
Si les descripteurs, ou les descripteurs de données pointent vers, ne changent pas, les pilotes d’optimisation spécifiques peuvent être spécifiques au fournisseur de matériel, et il est important qu’ils ne modifient pas le comportement autre que l’amélioration possible des performances. Conserver autant de connaissances sur l’intention de l’application que possible n’impose pas de fardeau aux applications.
Une optimisation est que de nombreux pilotes peuvent produire des accès à la mémoire plus efficaces par les nuanceurs s’ils connaissent les promesses qu’une application peut faire sur le caractère statique des descripteurs et des données. Par exemple, les pilotes peuvent supprimer un niveau d’indirection pour accéder à un descripteur dans un tas en le convertissant en descripteur racine si le matériel particulier n’est pas sensible à la taille de l’argument racine.
La tâche supplémentaire pour les développeurs utilisant la version 1.1 consiste à faire des promesses sur la volatilité et la statique-ness des données dans la mesure du possible, afin que les pilotes puissent rendre les optimisations qui sont logiques. Les développeurs n’ont pas à faire de promesses sur la statique-ness.
La version 1.0 de la signature racine continue de fonctionner inchangée, bien que les applications qui recompilent les signatures racines soient définies par défaut sur Signature racine 1.1 maintenant (avec une option permettant de forcer la version 1.0 si vous le souhaitez).
Indicateurs statiques et volatiles
Les indicateurs suivants font partie de la signature racine pour permettre aux pilotes de choisir une stratégie permettant de mieux gérer les arguments racines individuels lorsqu’ils sont définis, et incorporent également les mêmes hypothèses dans les objets d’état de pipeline (PSO) lorsqu’ils sont compilés à l’origine , car la signature racine fait partie d’un psO.
Les indicateurs suivants sont définis par l’application et s’appliquent aux descripteurs ou aux données.
typedef enum D3D12_DESCRIPTOR_RANGE_FLAGS
{
D3D12_DESCRIPTOR_RANGE_FLAG_NONE = 0,
D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE = 0x1,
D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE = 0x2,
D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC = 0x8
} D3D12_DESCRIPTOR_RANGE_FLAGS;
typedef enum D3D12_ROOT_DESCRIPTOR_FLAGS
{
D3D12_ROOT_DESCRIPTOR_FLAG_NONE = 0,
D3D12_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE = 0x2,
D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC = 0x8
} D3D12_ROOT_DESCRIPTOR_FLAGS;
DESCRIPTORS_VOLATILE
Avec cet indicateur défini, les descripteurs d’un tas de descripteurs pointés par une table de descripteur racine peuvent être modifiés par l’application à tout moment, sauf si la liste de commandes/bundles qui lient la table de descripteur a été envoyée et n’ont pas terminé l’exécution. Par exemple, l’enregistrement d’une liste de commandes et la modification ultérieure des descripteurs dans un tas de descripteurs fait référence à avant soumettre la liste de commandes pour l’exécution est valide. Il s’agit du seul comportement pris en charge de la signature racine version 1.0.
Si l’indicateur DESCRIPTORS_VOLATILE n’est pas défini, les descripteurs sont statiques. Il n’existe aucun indicateur pour ce mode. Les descripteurs statiques signifient que les descripteurs d’un tas de descripteurs pointés par une table de descripteur racine ont été initialisés au moment où la table de descripteur est définie sur une liste de commandes/bundle (pendant l’enregistrement) et que les descripteurs ne peuvent pas être modifiés tant que la liste de commandes /bundle n’a pas terminé son exécution pour la dernière fois. Pour la signature racine version 1.1, les descripteurs statiques sont l’hypothèse par défaut, et l’application doit spécifier l’indicateur de DESCRIPTORS_VOLATILE si nécessaire.
Pour les bundles utilisant des tables de descripteur statiques avec des descripteurs statiques, les descripteurs doivent être prêts à commencer au moment où le bundle est enregistré (par opposition au moment où le bundle est appelé), et ne changent pas tant que le bundle n’a pas terminé son exécution pour la dernière fois. Les tables de descripteur pointant vers des descripteurs statiques doivent être définies pendant l’enregistrement groupé et non héritées dans le bundle. Il est valide pour qu’une liste de commandes utilise une table de descripteur statique avec des descripteurs statiques qui ont été définis dans un bundle et retournés à la liste de commandes.
Lorsque les descripteurs sont statiques, il existe un autre changement de comportement qui nécessite que l’indicateur de DESCRIPTORS_VOLATILE soit défini. Les accès hors limites aux vues de mémoire tampon (par opposition aux vues Texture1D/2D/3D/Cube) ne sont pas valides et produisent des résultats non définis, y compris la réinitialisation possible de l’appareil, plutôt que de retourner des valeurs par défaut pour les lectures ou la suppression d’écritures. L’objectif de la suppression de la possibilité pour les applications de dépendre du matériel hors limites de la vérification d’accès consiste à permettre aux pilotes de choisir de promouvoir les accès de descripteur statique aux accès de descripteur racine s’ils jugent plus efficaces. Les descripteurs racines ne prennent pas en charge la vérification hors limites.
Si les applications dépendent d’un comportement d’accès en mémoire hors limites sans risque lors de l’accès aux descripteurs, elles doivent marquer les plages de descripteurs qui accèdent à ces descripteurs comme DESCRIPTORS_VOLATILE.
DATA_VOLATILE
Avec ce jeu d’indicateurs, les données pointées par des descripteurs peuvent être modifiées par le processeur à tout moment, sauf si la liste de commandes/bundles qui lie la table de descripteur a été envoyée et n’a pas terminé l’exécution. Il s’agit du seul comportement pris en charge de la signature racine version 1.0.
L’indicateur est disponible dans les indicateurs de plage de descripteur et les indicateurs de descripteur racine.
DATA_STATIC_WHILE_SET_AT_EXECUTE
Avec ce jeu d’indicateurs, les données pointées par des descripteurs ne peuvent pas changer à partir du moment où le descripteur racine ou la table de descripteur sous-jacent est défini sur une liste de commandes/un bundle pendant l’exécution sur la chronologie GPU, et se terminent lorsque les dessins/répartitions suivants ne référencent plus les données.
Avant qu’une table de descripteur racine ou de descripteur ait été définie sur le GPU, ces données peuvent être modifiées même par la même liste de commandes/bundle. Les données peuvent également être modifiées alors qu’un descripteur racine ou une table de descripteur pointant vers celle-ci est toujours définie sur la liste de commandes /bundle, tant que les dessins/distributions qui font référence à celui-ci sont terminés. Toutefois, cela nécessite que la table de descripteur soit remontée à la liste de commandes avant la prochaine fois que le descripteur racine ou la table de descripteur est déréférencé. Cela permet au pilote de savoir que les données pointées par un descripteur racine ou une table de descripteur descripteur ont changé.
La différence essentielle entre DATA_STATIC_WHILE_SET_AT_EXECUTE et DATA_VOLATILE est avec DATA_VOLATILE un pilote ne peut pas indiquer si les données copiées dans une liste de commandes ont modifié les données pointées par un descripteur, sans effectuer de suivi d’état supplémentaire. Par conséquent, si, par exemple, un pilote peut insérer n’importe quelle sorte de commandes de pré-extraction de données dans sa liste de commandes (pour rendre l’accès du nuanceur aux données connues plus efficace, par exemple), DATA_STATIC_WHILE_SET_AT_EXECUTE permet au pilote de savoir qu’il doit uniquement effectuer la pré-extraction des données au moment où elle est définie via SetGraphicsRootDescriptorTable, SetComputeRootDescriptorTable ou l’une des méthodes permettant de définir la vue de mémoire tampon constante, la vue des ressources du nuanceur ou l’affichage d’accès non ordonné.
Pour les bundles, la promesse que les données sont statiques lors de l’exécution s’applique de manière unique à chaque exécution du bundle.
L’indicateur est disponible dans les indicateurs de plage de descripteur et les indicateurs de descripteur racine.
DATA_STATIC
Si cet indicateur est défini, les données pointées par les descripteurs ont été initialisées au moment où un descripteur racine ou une table de descripteur référençant la mémoire a été définie sur une liste de commandes/bundle pendant l’enregistrement, et les données ne peuvent pas être modifiées tant que la liste de commandes /bundle n’a pas terminé l’exécution pour la dernière fois.
Pour les bundles, la durée statique démarre au niveau du descripteur racine ou du paramètre de table de descripteur pendant l’enregistrement du bundle, par opposition à l’enregistrement d’une liste de commandes appelante. En outre, une table de descripteur pointant vers des données statiques doit être définie dans le bundle et non héritée. Il est valide pour qu’une liste de commandes utilise une table de descripteur pointant vers des données statiques définies dans un bundle et retournées à la liste de commandes.
L’indicateur est disponible dans les indicateurs de plage de descripteur et les indicateurs de descripteur racine.
Combinaison d’indicateurs
Au plus un des indicateurs DATA peut être spécifié à la fois, à l’exception des plages de descripteurs Sampler qui ne prennent pas en charge les indicateurs DATA du tout, car les échantillonneurs ne pointent pas vers les données.
L’absence d’indicateurs DATA pour les plages de descripteurs SRV et CBV signifie qu’un comportement par défaut de DATA_STATIC_WHILE_SET_AT_EXECUTE est supposé. La raison pour laquelle cette valeur par défaut est choisie au lieu de DATA_STATIC est que DATA_STATIC_WHILE_SET_AT_EXECUTE est beaucoup plus susceptible d’être une valeur par défaut sûre pour une majorité de cas, tout en produisant encore une certaine opportunité d’optimisation mieux que la valeur par défaut de DATA_VOLATILE.
L’absence d’indicateurs DATA pour les plages de descripteurs UAV signifie qu’un comportement par défaut de DATA_VOLATILE est supposé, étant donné que les UAV sont généralement écrites.
DESCRIPTORS_VOLATILE ne peut pas être combinée avec DATA_STATIC, mais peut être combinée avec les autres indicateurs DATA. La raison pour laquelle DESCRIPTORS_VOLATILE peut être combinée avec DATA_STATIC_WHILE_SET_AT_EXECUTE est que les descripteurs volatiles nécessitent toujours que les descripteurs soient prêts pendant l’exécution de la liste de commandes/ du bundle, et DATA_STATIC_WHILE_SET_AT_EXECUTE ne fait que des promesses sur la statique au sein d’un sous-ensemble d’exécutions de liste de commandes/bundle.
Résumé de l’indicateur
Les tableaux suivants résument les combinaisons d’indicateurs qui peuvent être utilisées.
Paramètres de D3D12_DESCRIPTOR_RANGE_FLAGS valides | Description |
---|---|
Aucun indicateur défini | Les descripteurs sont statiques (valeur par défaut). Hypothèses par défaut pour les données : pour SRV/CBV : DATA_STATIC_WHILE_SET_AT_EXECUTE et pour les UAV : DATA_VOLATILE. Ces valeurs par défaut pour SRV/CBV correspondent en toute sécurité aux modèles d’utilisation pour la majorité des signatures racines. |
DATA_STATIC | Les descripteurs et les données sont statiques. Cela optimise le potentiel d’optimisation du pilote. |
DATA_VOLATILE | Les descripteurs sont statiques et les données sont volatiles. |
DATA_STATIC_WHILE_SET_AT_EXECUTE | Les descripteurs sont statiques et les données sont statiques lors de l’exécution. |
DESCRIPTORS_VOLATILE | Les descripteurs sont volatiles et les hypothèses par défaut sont faites sur les données : pour SRV/CBV : DATA_STATIC_WHILE_SET_AT_EXECUTE et pour les UAV : DATA_VOLATILE. |
DESCRIPTORS_VOLATILE | DATA_VOLATILE | Les descripteurs et les données sont volatiles, équivalents à la signature racine 1.0. |
DESCRIPTORS_VOLATILE | DATA_STATIC_WHILE_SET_AT_EXECUTE | Les descripteurs sont volatiles, mais notez que cela ne leur permet toujours pas de changer pendant l’exécution de la liste de commandes. Il est donc valide de combiner la déclaration supplémentaire que les données sont statiques lors de l’exécution via la table de descripteur racine pendant l’exécution . Les descripteurs sous-jacents sont effectivement statiques plus longtemps que les données ne sont promises à être statiques. |
Paramètres de D3D12_ROOT_DESCRIPTOR_FLAGS valides | Description |
---|---|
Aucun indicateur défini | Hypothèses par défaut pour les données : pour SRV/CBV : DATA_STATIC_WHILE_SET_AT_EXECUTE et pour les UAV : DATA_VOLATILE. Ces valeurs par défaut pour SRV/CBV correspondent en toute sécurité aux modèles d’utilisation pour la majorité des signatures racines. |
DATA_STATIC | Les données sont statiques, le meilleur potentiel pour l’optimisation du pilote. |
DATA_STATIC_WHILE_SET_AT_EXECUTE | Les données sont statiques lors de l’exécution. |
DATA_VOLATILE | Équivalent à la signature racine 1.0. |
Résumé de l’API version 1.1
Les appels d’API suivants activent la version 1.1.
Énumérations
Ces énumérations contiennent les indicateurs clés pour spécifier le descripteur et la volatilité des données.
- D3D_ROOT_SIGNATURE_VERSION : ID de version.
- D3D12_DESCRIPTOR_RANGE_FLAGS : plage d’indicateurs déterminant si les descripteurs ou les données sont volatiles ou statiques.
- D3D12_ROOT_DESCRIPTOR_FLAGS : plage similaire d’indicateurs à D3D12_DESCRIPTOR_RANGE_FLAGS, sauf que seuls les indicateurs de données s’appliquent aux descripteurs racines.
Structures
Les structures mises à jour (de la version 1.0) contiennent des références aux indicateurs de volatilité/statique.
D3D12_FEATURE_DATA_ROOT_SIGNATURE : passez cette structure à CheckFeatureSupport pour vérifier la prise en charge de la version 1.1 de la signature racine.
D3D12_VERSIONED_ROOT_SIGNATURE_DESC : peut contenir n’importe quelle version d’une description de signature racine et est conçue pour être utilisée avec les fonctions de sérialisation/désérialisation répertoriées ci-dessous.
Ces structures sont équivalentes à celles utilisées dans la version 1.0, avec l’ajout de nouveaux champs d’indicateurs pour les plages de descripteurs et les descripteurs racines :
Fonctions
Les méthodes répertoriées ici remplacent les fonctions d’origine D3D12SerializeRootSignature et D3D12CreateRootSignatureDeserializer, car elles sont conçues pour fonctionner sur n’importe quelle version de la signature racine. Le formulaire sérialisé est ce qui est passé dans l’APICreateRootSignature. Si un nuanceur a été créé avec une signature racine, le nuanceur compilé contient déjà une signature racine sérialisée.
- D3D12SerializeVersionedRootSignature : si une application génère de façon procédurale la structure de données D3D12_VERSIONED_ROOT_SIGNATURE, elle doit rendre le formulaire sérialisé à l’aide de cette fonction.
- D3D12CreateVersionedRootSignatureDeserializer : génère une interface qui peut retourner la structure de données désérialisée, via GetUnconvertedRootSignatureDesc.
Méthode
L’interface ID3D12VersionedRootSignatureDeserializer est créée pour désérialiser la structure de données de signature racine.
- GetRootSignatureDescAtVersion : convertit les structures de description de signature racine en version demandée.
- GetUnconvertedRootSignatureDesc : retourne un pointeur vers une structure D3D12_VERSIONED_ROOT_SIGNATURE_DESC.
Structures d’assistance
Des structures d’assistance ont été ajoutées pour faciliter l’initialisation de certaines structures de la version 1.1.
- CD3DX12_DESCRIPTOR_RANGE1
- CD3DX12_ROOT_PARAMETER1
- CD3DX12_STATIC_SAMPLER1
- CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC
Reportez-vous à Structures et fonctions d’assistance pour D3D12.
Conséquences d’une violation des indicateurs statiques
Les indicateurs de descripteur et de données décrits ci-dessus (ainsi que les valeurs par défaut implicites par l’absence d’indicateurs particuliers) définissent une promesse par l’application au pilote sur son comportement. Si une application enfreint la promesse, il s’agit d’un comportement non valide : les résultats ne sont pas définis et peuvent être différents entre différents pilotes et matériels.
La couche de débogage a des options pour valider que les applications respectent leurs promesses, y compris les promesses par défaut fournies avec l’utilisation de la signature racine version 1.1 sans définir d’indicateurs.
Gestion des versions
Lors de la compilation des signatures racines attachées aux nuanceurs, les compilateurs HLSL plus récents devront par défaut compiler la signature racine à la version 1.1, tandis que les anciens compilateurs HLSL prennent uniquement en charge la version 1.0. Notez que les signatures racines 1.1 ne fonctionnent pas sur les systèmes d’exploitation qui ne prennent pas en charge la signature racine 1.1.
La version de signature racine compilée avec un nuanceur peut être forcée à une version particulière à l’aide de /force_rootsig_ver <version>
. Forcer la version réussit si le compilateur peut conserver le comportement de la signature racine compilée au niveau de la version forcée, par exemple en supprimant des indicateurs non pris en charge dans la signature racine qui servent uniquement à des fins d’optimisation, mais qui n’affectent pas le comportement.
Ainsi, une application peut, par exemple, compiler une signature racine 1.1 à la fois 1.0 et 1.1 lors de la génération de l’application et sélectionner la version appropriée au moment de l’exécution en fonction du niveau de prise en charge du système d’exploitation. Toutefois, il serait plus efficace d’espace pour qu’une application compile individuellement des signatures racines (en particulier si plusieurs versions sont nécessaires), séparément des nuanceurs. Même si les nuanceurs ne sont pas initialement compilés avec une signature racine attachée, l’avantage de la validation de la validation de la signature racine avec un nuanceur peut être conservé à l’aide de l’option de compilateur /verifyrootsignature
. Plus tard au moment de l’exécution, les objets de service peuvent être créés à l’aide de nuanceurs qui n’ont pas de signatures racines dans ceux-ci tout en passant la signature racine souhaitée (peut-être la version appropriée prise en charge par le système d’exploitation) en tant que paramètre distinct.
Rubriques connexes