Compilation des objets d’état de pipeline
D3D12 fournit l’interface Pipeline State Object (PSO) pour configurer le GPU avec les nuanceurs et l’état de rendu. Le flux de travail multiplateforme standard pour créer des PSO consiste à précompiler les nuanceurs avec DXC lors d’un processus de génération, puis à remplir un descripteur d’état de pipeline graphique ou de calcul (par exemple D3D12_GRAPHICS_PIPELINE_STATE_DESC) avec le bytecode des nuanceurs et l’état au moment de l’exécution. La validation du pilote garantit la cohérence des entrées/sorties et de l’état pour chaque étape successive du pipeline. Sur PC, la compilation des PSO à l’exécution est nécessaire, car le GPU de l’utilisateur final est généralement inconnu au moment de la génération. Le processus DXC hors connexion doit donc compiler vers un format de bytecode intermédiaire, la représentation intermédiaire basée sur LLVM, DXIL (DirectX Intermediate Language). La création du PSO à l’exécution avec l’une des API disponibles (ci-dessous) amène le pilote GPU à finaliser le code des nuanceurs en compilant le bytecode DXIL en instructions GPU, qui peuvent ensuite être exécutées sur le GPU. À l’exécution :- ID3D12Device::CreatePipelineState
- ID3D12Device::CreateGraphicsPipelineState
- ID3D12Device::CreateGraphicsPipelineStateX
- ID3D12Device::CreateComputePipelineState
- ID3D12Device::CreateComputePipelineStateX
Objets d’état de pipeline sérialisés
La plateforme XBOX fige la configuration matérielle, ce qui rend inutile la distribution d’une représentation intermédiaire du code des nuanceurs. Cela permet de déplacer le processus de compilation des PSO vers le moment de la génération, ce qui supprime la surcharge passée à créer des PSO au démarrage du titre. Des extensions d’API XBOX ont été ajoutées pour sérialiser les PSO dans un format de blob binaire pouvant être enregistré directement sur disque. À l’exécution, ces blobs peuvent être chargés depuis le disque et désérialisés en un état de pipeline fonctionnel. Les PSO peuvent toujours être créés à l’exécution à l’aide des fonctionnalités D3D12 standard, mais la sérialisation offre un moyen d’optimiser la vitesse de démarrage. Étant donné que les PSO sérialisés sont distribués dans les builds de package, un principe de conception essentiel est de minimiser leur empreinte mémoire. Les blobs produits par SerializeGraphicsPipelineStateX doivent être dédupliqués entre tous les PSO précompilés afin de réduire les besoins en mémoire. Les autres métadonnées sans rapport avec leur exécution sont supprimées lors de la sérialisation, ce qui empêche de resérialiser des PSO précédemment désérialisés ; une telle opération échoue avec un message de validation. Les API de sérialisation (ci-dessous) ne sont pas disponibles dans les builds commerciales. Notez que le processus utilisé pour précompiler les PSO doit utiliser un ID3D12Device créé à partir d’une bibliothèque ciblant la plateforme. La fonction D3D12CreateDevice se trouve dans le dossier toolkit de l’installation du GDK, dans d3d12_x.h pour la XBOX One ou d3d12_xs.h pour la XBOX Series X|S ; effectuez la liaison avec d3d12_x.lib ou d3d12_xs.lib en conséquence. Ces bibliothèques s’attendent à ce que les DLL du GDK soient accessibles depuis le répertoire de travail ou via la variable système PATH. Les DLL se trouvent dans le dossier bin de la version correspondante du GDK, par exemple C:\\Program Files (x86)\\Microsoft GDK\\200804\\GXDK\\bin pour August 2020 QFE 4. Au moment de la génération :- Informations d’exécution du processeur de commandes
- État GPU pour les états de fusion/rastérisation/profondeur-gabarit
- État GPU pour les paramètres RTV/DSV
- État GPU pour le traitement des sommets/index, la tessellation et la sortie de flux
- État GPU pour chaque étape matérielle
- Hachage CRC32 du PSO sérialisé
- Numéro de version de la structure sérialisée
- Données de validation
- Forme compacte des arguments de création du PSO
- Configurations de la disposition d’entrée et de la sortie de flux
- Instructions GPU précompilées des nuanceurs matériels
- Numéro de version de la structure sérialisée
- Métadonnées du compilateur de nuanceurs
- Informations de nuanceur PIX
- ID3D12Device::SerializeGraphicsPipelineStateX
- ID3D12Device::DeserializeGraphicsPipelineStateX
- ID3D12Device::SerializeComputePipelineStateX
- ID3D12Device::DeserializeComputePipelineStateX
Objets d’état de pipeline dérivés
Une autre fonctionnalité exposée par l’API D3D12.X est celle des objets d’état de pipeline « dérivés ». Cette fonctionnalité crée des variantes légères de PSO existants, qui ne diffèrent que par l’état matériel (état de profondeur-gabarit, état du rastériseur, état de fusion, masque d’échantillon et limites des nuanceurs). La dérivation d’un PSO entraîne une surcharge d’exécution négligeable par rapport à la compilation d’un PSO. Cela permet au développeur de créer un seul PSO, lié à un ensemble commun de nuanceurs, puis d’en décliner un nombre arbitraire de variantes en ne payant le coût d’exécution complet que pour la création du PSO initial.Objets d’état de pipeline sérialisés et dérivés
Utilisés conjointement, les PSO sérialisés et dérivés offrent un avantage supplémentaire pour réduire la taille du package. Les PSO dérivés permettent aux titres de limiter le nombre de PSO sérialisés à un sous-ensemble de l’ensemble total utilisé par le titre. En dédupliquant les PSO selon les propriétés immuables vis-à-vis des substitutions des PSO dérivés, on obtient un ensemble « de base » à partir duquel tous les autres PSO du titre peuvent être dérivés. Le cas d’utilisation type de ces deux fonctionnalités serait le suivant :- Identifier les PSO présentant des combinaisons uniques de signature racine, de disposition d’entrée, d’étapes de nuanceur, de sorties de flux et de cibles de rendu.
- Sérialiser cet ensemble dédupliqué de PSO de base dans un processus hors connexion et le distribuer dans le package.
- Charger les PSO de base depuis un fichier au démarrage et dériver toutes les variantes de PSO nécessaires au titre.
Contraintes sur les objets d’état de pipeline dérivés
Une restriction notable des PSO dérivés est qu’ils ne peuvent pas modifier le code compilé des nuanceurs. C’est pourquoi les dispositions d’entrée, les formats des cibles de rendu et les paramètres de sortie de flux ne sont pas des options de D3D12XBOX_DERIVED_GRAPHICS_STATE_DESC, car ils nécessiteraient de modifier les instructions GPU du PSO compilé. Le pilote choisit le ou les types de données d’exportation des nuanceurs appropriés lors de la compilation du PSO ; les types d’exportation de nuanceur pris en charge sont uint, sint, unorm, snorm ou float sur 16 ou 32 bits. Le pilote sélectionne le plus petit type dont la précision est supérieure ou égale à celle de la cible de rendu, tout en étant compatible avec la configuration matérielle de fusion. Pour appliquer son choix, le pilote corrige le code compilé du nuanceur avec les instructions d’exportation appropriées, qui convertissent le type utilisé pour les opérations du nuanceur vers le type d’exportation sélectionné par le pilote. Une fois cette correction effectuée, le pilote ne modifie plus ces instructions GPU finalisées. Le choix final des instructions d’exportation des nuanceurs est déterminé par quelques facteurs clés :- Types et nombre de cibles dans lesquelles le code HLSL écrit (SV_TargetN)
- Formats et nombre de cibles de rendu du PSO
- Paramètre alpha-to-coverage
- Paramètres de l’état de fusion
