Différences générales
- Le Game OS du Microsoft GDK prend en charge la sérialisation et la désérialisation des objets d’état de pipeline (PSO) afin d’éviter les coûts de construction des PSO à l’exécution dans le pilote. Cette fonctionnalité est la même que dans l’ERA. Le Game OS du Microsoft GDK accepte comme entrées valides les nuanceurs précompilés, les nuanceurs non précompilés, les nuanceurs dérivés et les PSO sérialisés. Nous recommandons d’utiliser des PSO sérialisés pour la vitesse, les économies d’espace et un meilleur contrôle par l’utilisateur.
- XBOX fournit de l’ESRAM, ce qui permet d’utiliser les mémoires tampons et les ressources de texture dans la mémoire la plus rapide possible. Maximiser l’utilisation de l’ESRAM est essentiel pour obtenir de hautes performances. Dans Gestion des ressources natives pour XBOX One, consultez la sous-section « Specifying Fast ESRAM Memory for a Buffer or Texture », et consultez Vue d’ensemble de la mémoire XG.
- Les files d’attente de commandes du Game OS du Microsoft GDK ne sont pas thread-safe. Il incombe au titre de synchroniser explicitement l’accès multithread aux files d’attente de commandes graphiques, de calcul et de copie/DMA. Sinon, les commandes émises dans la file d’attente risquent d’être corrompues, ce qui peut ensuite entraîner des blocages ou des plantages du GPU.
- Une seule file d’attente de commandes de chaque type peut être créée sur XBOX, sauf si l’extension CreateCommandQueueX est utilisée pour sélectionner explicitement un pipe/moteur et (pour le calcul) un index de file d’attente pour la file d’attente de commandes. Une seule file d’attente de commandes graphiques peut être créée, quelle que soit l’API utilisée. Une file d’attente de calcul ou de copie/DMA peut être créée par pipe/moteur GPU et index de file d’attente disponibles.
- Les barrières de ressources du Game OS du Microsoft GDK encouragent l’utilisation généralisée des transitions D3D12_RESOURCE_BARRIER_FLAG_BEGIN_ONLY et D3D12_RESOURCE_BARRIER_FLAG_END_ONLY, et il est recommandé de spécifier des indicateurs D3D12XBOX_RESOURCE_FLAG_PREFER* supplémentaires lors de la création de certains types de ressources (consultez D3D12_RESOURCE_FLAGS). Consultez la section « Barrières de ressources » ci-dessous, ainsi que D3D12_RESOURCE_BARRIER_FLAGS.
- Le Game OS du Microsoft GDK prend en charge un modèle de présentation différent du système d’appels Present de chaîne d’échange de Direct3D 12 sur PC. Pour en savoir plus sur le nouveau modèle de présentation, consultez Planification et présentation des images sur XBOX One.
- Le Game OS du Microsoft GDK encourage l’accès aux cibles de rendu multiéchantillonnées dans un état compressé pour des raisons de performance, et encourage également les ressources de profondeur/gabarit compressées. Dans la section Barrières de ressources ci-dessous, consultez Travailler directement avec des ressources compressées.
- Le Game OS du Microsoft GDK prend en charge un certain nombre d’extensions matérielles propres au GPU.
- Les extensions Direct3D 12.x du Game OS du Microsoft GDK fournissent les éléments suivants :
- Types de tas de descripteurs supplémentaires
- Manipulation directe des descripteurs
- Composition de signatures racines et variantes de diffusion
- Exécution asynchrone des listes de commandes (exécution avant la fermeture)
- Il incombe au titre de s’assurer que le GPU a terminé tous ses accès à une ressource avant de la détruire. Un titre doit insérer des clôtures (fences) à la fin des accès aux ressources et attendre que ces clôtures soient franchies avant de ramener à 0 le nombre de références des objets de ressource.
- Le Game OS du Microsoft GDK ne prend pas en charge l’utilisation du type de liste de commandes COPY (D3D12_COMMAND_LIST_TYPE_COPY) avec l’interface standard ID3D12GraphicsCommandList. Le Game OS du Microsoft GDK fournit plutôt une interface dédiée à la copie (ID3D12XboxDmaCommandList). Cette interface comprend la fonctionnalité de copie standard de ID3D12GraphicsCommandList ainsi que des extensions pour le matériel du moteur DMA de XBOX, comme la compression/décompression LZ et le décodage JPEG. Si vous prévoyez d’écrire du code multiplateforme pour les listes de commandes de copie Direct3D 12, nous recommandons d’utiliser un
typedefpour l’interface de liste de commandes de copie, qui serait défini comme ID3D12XboxDmaCommandList sur le Game OS du Microsoft GDK et comme ID3D12GraphicsCommandList sur PC.
Pilotes de vente au détail, instrumentés et de débogage
Avec le Gaming eXtensions Development Kit (GXDK), trois pilotes peuvent être utilisés pour aider à tester et à déboguer un titre. Pilote de vente au détail : Optimisé pour les performances, et non pour l’instrumentation ou le débogage. Ne vérifie pas l’exactitude des paramètres. Des paramètres incorrects transmis au pilote de vente au détail risquent de causer une corruption, des plantages ou des blocages du GPU. Les titres ne peuvent être livrés qu’avec le pilote de vente au détail. Les autres pilotes (instrumenté et de débogage) ne sont présents que sur les kits de développement. Pilote instrumenté : Active l’instrumentation PIX. Assez léger. Peut être utilisé pour aider à déboguer les problèmes de synchronisation et d’autres problèmes de minutage. Ne vérifie pas l’exactitude des paramètres. Pilote de débogage : Effectue des tests de validation sur les paramètres transmis aux appels d’API, ce qui peut aider à déboguer les problèmes d’exactitude et de performance. Toutefois, les bogues de minutage peuvent ne pas être reproduits lors de l’utilisation du pilote de débogage, car le traitement de validation affecte les performances à l’exécution. Pour ajuster le niveau de validation, appelez ID3D12Device::SetDebugFlagsX. Pour sélectionner le pilote utilisé, appelez l’une des méthodes suivantes.Objets d’état de pipeline (PSO) hors ligne et dérivés
Un objet d’état de pipeline (PSO) hors ligne permet des améliorations de performance considérables par rapport à la création de l’état de pipeline à l’exécution, en encapsulant l’état de pipeline (y compris les nuanceurs) dans un seul objet qui peut être chargé et défini rapidement. Un PSO hors ligne stocke l’état des nuanceurs précompilés, de la cible de rendu et du gabarit de profondeur. Les objets PSO hors ligne sont stockés sur disque et sont ensuite chargés par l’application au besoin. Sur PC, il existe un système semblable, mais non identique, appelé mise en cache des PSO. Pour créer des objets PSO hors ligne, utilisez l’outil PSO (fourni sous forme d’exemple du Microsoft Game Development Kit (GDK) situé dans le dossier\bin du GXDK), ou écrivez votre propre outil qui utilise les API de sérialisation de l’état de pipeline, énumérées ci-dessous.
API pour les PSO hors ligne
Les API suivantes manipulent les PSO hors ligne.- ID3D12Device::SerializeGraphicsPipelineStateX : Cette méthode sérialise un PSO afin de permettre un chargement efficace à l’exécution. Elle est destinée à être appelée dans le cadre d’un processus de création de contenu hors ligne, exécuté sur un PC (pris en charge par le pilote
umd12_pc.dllouxgs12_pc_xs.dll), et n’est pas destinée à être appelée pendant l’exécution d’un titre. - ID3D12Device::DeserializeGraphicsPipelineStateX : Cette méthode désérialise (charge) un PSO graphique précédemment sérialisé. Cette méthode n’invoque jamais la compilation de nuanceurs à l’exécution, bien que dans de rares cas, elle génère une erreur indiquant que des PSO plus anciens doivent être recompilés.
- D3D12XBOX_SERIALIZE_SHADER : Cette structure contient des pointeurs vers les instructions GPU sérialisées du nuanceur et, éventuellement, vers des métadonnées sérialisées.
- D3D12XBOX_DESERIALIZE_SHADER : Cette structure contient des pointeurs vers les instructions GPU brutes désérialisées du nuanceur et vers les métadonnées désérialisées.
- D3D12XBOX_SERIALIZE_FLAGS : Cette énumération définit les indicateurs de sérialisation.
- D3D12XBOX_SERIALIZE_GRAPHICS_PIPELINE_STATE : Cette structure contient l’état de pipeline sérialisé.
- D3D12XBOX_DESERIALIZE_GRAPHICS_PIPELINE_STATE : Cette structure contient l’état de pipeline désérialisé.
PSO dérivés
Étant donné que le nombre de changements de l’état de pipeline est plus élevé que ce dont une application a probablement besoin, il n’est pas logique de créer des PSO hors ligne pour chaque variation. Créez plutôt un PSO hors ligne pour un état de base couramment utilisé, puis utilisez des PSO dérivés pour apporter des modifications limitées au PSO hors ligne. Les modifications apportées au PSO hors ligne ne peuvent pas porter sur le nuanceur ou la cible de rendu. Pour un jeu typique, la majorité des objets PSO doivent être créés hors ligne, les permutations étant effectuées à l’exécution à l’aide des API suivantes.- ID3D12Device::CreateDerivedGraphicsPipelineStateX : Cette méthode offre un moyen efficace de créer une variation d’un PSO graphique dérivée d’un PSO graphique source. Cette méthode garantit qu’aucune recompilation ni aucune correction de nuanceur n’est effectuée dans le cadre du processus de création.
- D3D12XBOX_DERIVED_GRAPHICS_STATE_TYPE : Cette énumération identifie l’état qui peut être modifié (profondeur/gabarit, rastérisation, fusion et masque d’échantillon).
- D3D12XBOX_DERIVED_GRAPHICS_STATE_DESC : Cette structure contient les descriptions du nouvel état requis.
Exemples illustrant les PSO hors ligne et les PSO dérivés
L’exemple Direct3D 12.x Deferred Context utilise des PSO hors ligne et des PSO dérivés. Les exemples Direct3D 12.x suivants utilisent des PSO hors ligne.- Bokeh Effect
- Compute Particles
- Deferred Particles
- Draw Bundles
- Dynamic Cube Map
- ESRAM
- Mesh Rendering
- Simple Bezier
- Simple Instancing
- Simple Lighting
- Simple Triangle
Tas de descripteurs
Sur PC Windows, les tas de descripteurs créés avec D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE ne peuvent pas être utilisés comme source pour les copies de descripteurs. Sur le Microsoft Game Development Kit (GDK), les copies de descripteurs créées avec ID3D12Device::CopyDescriptors et ID3D12Device::CopyDescriptorsSimple prennent en charge tous les tas de descripteurs comme tas source, et la copie est effectuée au moyen d’une vue en lecture seule mise en cache et efficace du tas source.Création de ressources
Les ressources d’arguments indirects doivent spécifier D3D12XBOX_RESOURCE_FLAG_ALLOW_INDIRECT_BUFFER au moment de la création de la ressource. Les ressources dotées de cet indicateur doivent faire l’objet d’une transition vers l’état de ressource D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT. D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT n’est pas inclus dans l’état de ressource combiné D3D12_RESOURCE_STATE_GENERIC_READ sur le Game OS du Microsoft GDK. Sur le Game OS du Microsoft GDK, D3D12_RESOURCE_STATE_GENERIC_READ est déclaré comme suit :Barrières de ressources
Une barrière de ressource avise le pilote qu’une synchronisation de plusieurs accès à une même ressource pourrait être nécessaire, comme la synchronisation de la lecture et de l’écriture dans la même texture. La version GXDK du Game OS du Microsoft GDK de ID3D12GraphicsCommandList::ResourceBarrier prend en charge la combinaison des indicateurs D3D12_RESOURCE_STATE_COPY_SOURCE et D3D12_RESOURCE_STATE_COPY_DEST, afin que les copies intra-ressource soient prises en charge. Les copies intra-ressource sont celles où la source et la destination se trouvent dans la même sous-ressource de la même ressource.- API pour les barrières de ressources
- Barrières de ressources lors des transitions d’utilisation
- Travailler directement avec des ressources compressées
- Barrières pour la transition entre des états d’utilisation qui incluent ou non l’accès en écriture
API pour les barrières de ressources
Sur le Game OS du Microsoft GDK, les barrières de ressources sont implémentées en appelant les méthodes suivantes.- ID3D12GraphicsCommandList::ResourceBarrier. Cette méthode avise le pilote qu’il doit synchroniser plusieurs accès aux ressources. Cette méthode est documentée en détail (pour une utilisation sur PC) sur Microsoft Docs : ID3D12GraphicsCommandList::ResourceBarrier. Les méthodes propres à XBOX de ID3D12GraphicsCommandList sont documentées dans le GDK.
- ID3D12XboxDmaCommandList::ResourceBarrier
Barrières de ressources lors des transitions d’utilisation
Sur PC Windows, les barrières de ressources peuvent effectuer des mises en veille prudentes du GPU ainsi que le vidage et l’invalidation des caches. En revanche, sur le Game OS du Microsoft GDK, les barrières de ressources effectuent une synchronisation, une invalidation et une décompression prudentes lors des transitions d’utilisation. Dans le cadre de cette différence, il existe des indicateurs de création de ressources propres à XBOX qui sont recommandés, mais non essentiels.- D3D12XBOX_RESOURCE_FLAG_PREFER_INDEX_BUFFER
- D3D12XBOX_RESOURCE_FLAG_PREFER_INDIRECT_BUFFER
- D3D12XBOX_RESOURCE_FLAG_PREFER_PREDICATION_BUFFER
- D3D12XBOX_RESOURCE_FLAG_PREFER_STREAM_OUTPUT
- D3D12XBOX_RESOURCE_FLAG_DENY_COMPRESSION_DATA
Travailler directement avec des ressources compressées
Les types d’utilisation de ressources suivants empêchent la décompression lors des transitions de barrières de ressources et permettent de consommer les ressources dans un état compressé.- D3D12XBOX_RESOURCE_STATE_PRESERVE_COMPRESSED_COLOR
- D3D12XBOX_RESOURCE_STATE_PRESERVE_COMPRESSED_DEPTH
- D3D12XBOX_RESOURCE_STATE_PRESERVE_COMPRESSED_STENCIL
- D3D12XBOX_RESOURCE_STATE_PRESERVE_COMPRESSED_DEPTH_STENCIL
- D3D12XBOX_RESOURCE_STATE_PRESERVE_INDIRECT_COLOR_CLEAR
- D3D12XBOX_RESOURCE_STATE_PRESERVE_SCATTERED_COLOR_FMASK
- D3D12XBOX_RESOURCE_STATE_PRESERVE_EXPANDED_COLOR
- D3D12XBOX_RESOURCE_STATE_PRESERVE_EXPANDED_DEPTH
- D3D12XBOX_RESOURCE_STATE_PRESERVE_EXPANDED_STENCIL
- D3D12XBOX_RESOURCE_STATE_PRESERVE_EXPANDED_DEPTH_STENCIL
Barrières pour la transition entre des états d’utilisation qui incluent ou non l’accès en écriture
Sur le Game OS du Microsoft GDK, l’approche recommandée pour effectuer les transitions de barrières, au-delà de l’approche de Direct3D 12/PC, consiste à identifier les barrières qui impliquent une transition d’états d’utilisation incluant l’accès en écriture vers des états d’utilisation n’incluant pas l’accès en écriture. Ces barrières, lorsqu’elles sont effectuées sur D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES, doivent être divisées en une barrière fractionnée, avec un appel BEGIN_ONLY et un appel END_ONLY, lorsque du travail GPU indépendant est disponible pour exécution, comme suit.- D3D12_RESOURCE_BARRIER_FLAG_BEGIN_ONLY est utilisé pour amorcer une transition de barrière vers un nouvel état (sans la terminer), ce qui la place dans une condition temporaire sans accès.
- Ajoutez le travail indépendant à la liste de commandes.
- D3D12_RESOURCE_BARRIER_FLAG_END_ONLY est utilisé dans un appel ResourceBarrier subséquent pour terminer la transition et passer de la condition temporaire sans accès et de l’ancien état à un accès actif dans le nouvel état.
#define pour Direct3D 12.x et Direct3D 12/PC.
Consultez D3D12_RESOURCE_BARRIER_FLAGS.
