Validation basée sur GPU et couche de débogage Direct3D 12

Cette rubrique explique comment utiliser au mieux la couche de débogage Direct3D 12. La validation basée sur GPU (GBV) active des scénarios de validation sur les chronologie GPU qui ne sont pas possibles lors des appels d’API sur le processeur. GbV est disponible à partir de Graphics Tools pour Windows 10 mise à jour anniversaire.

Objectif de la validation basée sur gpu

La validation basée sur GPU permet d’identifier les erreurs suivantes :

  • Utilisation de descripteurs non initialisés ou incompatibles dans un nuanceur.
  • Utilisation de descripteurs référençant des ressources supprimées dans un nuanceur.
  • Validation des états de ressources promus et de la dégradation de l’état des ressources.
  • Indexation au-delà de la fin du tas de descripteur dans un nuanceur.
  • Accès au nuanceur des ressources dans un état incompatible.
  • Utilisation d’échantillonneurs non initialisés ou incompatibles dans un nuanceur.

La vbG fonctionne en créant des nuanceurs corrigés dont la validation est ajoutée directement au nuanceur. Les nuanceurs corrigés inspectent les arguments racine et les ressources accessibles pendant l’exécution du nuanceur et signalent les erreurs à une mémoire tampon de journal. GbV injecte également des opérations et des appels dispatch supplémentaires dans les listes de commandes d’application pour valider et suivre les modifications apportées à l’état des ressources imposées par la liste de commandes sur le chronologie GPU.

Étant donné que gbV nécessite la possibilité d’exécuter des nuanceurs, les listes de commandes COPY sont émulées par une liste de commandes COMPUTE. Cela peut potentiellement changer la façon dont le matériel effectue des copies, mais le résultat final ne doit pas être modifié. L’application perçoit toujours qu’il s’agit de listes de commandes COPY et la couche de débogage les valide en tant que telles.

Activation de la validation basée sur GPU

Vous pouvez forcer la vue gbV à utiliser le Panneau de configuration DirectX (DXCPL) en forçant la couche de débogage Direct3D 12 et en forçant la validation basée sur gpu (nouvel onglet dans le panneau de configuration). Une fois activé, gbV reste activé jusqu’à ce que l’appareil Direct3D 12 soit libéré. Vous pouvez également activer la vbG par programmation avant de créer l’appareil Direct3D 12 :

void EnableShaderBasedValidation()
{
    CComPtr<ID3D12Debug> spDebugController0;
    CComPtr<ID3D12Debug1> spDebugController1;
    VERIFY(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0)));
    VERIFY(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1)));
    spDebugController1->SetEnableGPUBasedValidation(true);
}

En règle générale, vous devez exécuter votre code avec la couche de débogage activée la plupart du temps. Toutefois, la vbG peut ralentir beaucoup les choses. Les développeurs peuvent envisager d’activer la vbG avec des jeux de données plus petits (par exemple, des démonstrations de moteur ou de petits niveaux de jeu avec moins de psO et de ressources) ou lors de l’augmentation précoce de l’application pour réduire les problèmes de performances. Avec un contenu plus volumineux, envisagez d’activer la VGB sur une ou deux machines de test lors d’une passe de test nocturne.

Sortie de débogage

GbV génère une sortie de débogage après qu’un appel à ExecuteCommandLists a terminé l’exécution sur le GPU. Étant donné qu’il s’agit de l’chronologie la sortie de débogage peut être asynchrone avec d’autres validations chronologie processeur. Les développeurs d’applications peuvent souhaiter injecter leur propre wait-after-execute pour synchroniser la sortie de débogage.

La sortie gbV identifie l’endroit où une erreur s’est produite dans un nuanceur, ainsi que le nombre actuel de dessins/distributions et les identités des objets associés (par exemple, liste de commandes, file d’attente, psO, etc.).

Exemple de message de débogage

Le message d’erreur suivant indique qu’une ressource nommée « Mémoire tampon de couleurs principale » a été accessible dans un nuanceur en tant que ressource de nuanceur, mais qu’elle était dans l’état d’accès non ordonné lorsque le nuanceur s’est exécuté sur le GPU. Des informations supplémentaires, telles que l’emplacement dans la source du nuanceur, le nom de la liste de commandes et le nombre de dessins (Draw Index) et les noms des objets d’interface D3D associés sont également fournies.

D3D12 ERROR: Incompatible resource state: Resource: 0x0000016F61A6EA80:'Main Color Buffer', 
Subresource Index: [0], 
Descriptor heap index: [0], 
Binding Type In Descriptor: SRV, 
Resource State: D3D12_RESOURCE_STATE_UNORDERED_ACCESS(0x8), 
Shader Stage: PIXEL, 
Root Parameter Index: [0], 
Draw Index: [0], 
Shader Code: E:\FileShare\MiniEngine_GitHub_160128\MiniEngine_GitHub\Core\Shaders\SharpeningUpsamplePS.hlsl(37,2-59), 
Asm Instruction Range: [0x138-0x16b], 
Asm Operand Index: [3], 
Command List: 0x0000016F6F75F740:'CommandList', SRV/UAV/CBV Descriptor Heap: 0x0000016F6F76F280:'Unnamed ID3D12DescriptorHeap Object', 
Sampler Descriptor Heap: <not set>, 
Pipeline State: 0x0000016F572C89F0:'Unnamed ID3D12PipelineState Object',  
[ EXECUTION ERROR #942: GPU_BASED_VALIDATION_INCOMPATIBLE_RESOURCE_STATE]

API Debug Layer

Pour activer la couche de débogage, appelez EnableDebugLayer.

Pour activer la validation basée sur GPU, appelez SetEnableGPUBasedValidation et reportez-vous aux méthodes des interfaces suivantes :

Reportez-vous aux structures et énumérations suivantes :