Validation basée sur GPU et couche de débogage Direct3D 12
Cette rubrique explique comment optimiser l’utilisation de la couche de débogage Direct3D 12. La validation basée sur GPU (GBV) permet des scénarios de validation sur la chronologie GPU qui ne sont pas possibles pendant les appels d’API sur l’UC. GbV est disponible à partir des outils Graphics pour la mise à jour anniversaire Windows 10.
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écomposition de l’état des ressources.
- Indexation au-delà de la fin du tas de descripteur dans un nuanceur.
- Les nuanceurs accèdent aux ressources dans un état incompatible.
- Utilisation d’échantillonneurs non initialisés ou incompatibles dans un nuanceur.
GbV fonctionne en créant des nuanceurs corrigés qui ont été ajoutés 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 supplémentaires et répartit les appels 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 la 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 changer la façon dont le matériel effectue des copies même si le résultat final ne doit pas être modifié. L’application perçoit toujours ces listes de commandes COPY et la couche de débogage les valide.
Activation de la validation basée sur GPU
GbV peut être forcé à l’aide de DirectX Panneau de configuration (DXCPL) en forçant sur la couche de débogage Direct3D 12 et en forçant également 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 gbV 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);
}
Utilisation recommandée
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 gbV peut ralentir beaucoup les choses. Les développeurs peuvent envisager d’activer gbV avec des jeux de données plus petits (par exemple, des démonstrations de moteur ou de petits niveaux de jeu avec moins de ressources et d’authentification unique) ou lors d’une mise en place précoce de l’application pour réduire les problèmes de performances. Avec un contenu plus volumineux, envisagez d’activer gbV sur une ou deux machines de test dans une passe de test nocturne.
Sortie de débogage
GbV produit une sortie de débogage après l’exécution d’un appel à ExecuteCommandLists sur le GPU. Étant donné qu’il s’agit de la chronologie GPU, la sortie de débogage peut être asynchrone avec d’autres validations de chronologie du processeur. Les développeurs d’applications peuvent souhaiter injecter leur propre attente après exécution pour synchroniser la sortie de débogage.
La sortie gbV identifie l’endroit où se produit un nuanceur, ainsi que le nombre actuel de tirages/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 couleur 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 (index de dessin) et les noms des objets d’interface D3D associés sont également fournis.
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 de débogage de couche
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 énumérations et structures suivantes :
- D3D12_DEBUG_COMMAND_LIST_PARAMETER_TYPE
- D3D12_DEBUG_DEVICE_PARAMETER_TYPE
- D3D12_GPU_BASED_VALIDATION_PIPELINE_STATE_CREATE_FLAGS
- D3D12_GPU_BASED_VALIDATION_SHADER_PATCH_MODE
- D3D12_DEBUG_COMMAND_LIST_GPU_BASED_VALIDATION_SETTINGS
- D3D12_DEBUG_DEVICE_GPU_BASED_VALIDATION_SETTINGS