DXGKDDI_QUERYCURRENTFENCE fonction de rappel (d3dkmddi.h)
La fonction DxgkDdiQueryCurrentFence interroge le dernier identificateur de clôture de soumission terminé dans l’unité d’exécution de commande matérielle.
Syntaxe
DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;
NTSTATUS DxgkddiQuerycurrentfence(
[in] IN_CONST_HANDLE hAdapter,
[in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}
Paramètres
[in] hAdapter
Handle d’un bloc de contexte associé à une carte d’affichage. Le pilote miniport d’affichage a précédemment fourni cette poignée au sous-système du noyau graphique Microsoft DirectX dans le paramètre de sortie MiniportDeviceContext de la fonction DxgkDdiAddDevice .
[in/out] pCurrentFence
Pointeur vers une structure DXGKARG_QUERYCURRENTFENCE qui contient des informations sur les données de clôture actuelles.
Valeur retournée
DxgkDdiQueryCurrentFence retourne STATUS_SUCCESS, ou un résultat d’erreur approprié si les données de clôture ne sont pas récupérées avec succès.
Remarques
Une clôture est une instruction qui contient 64 bits de données et une adresse. Le pilote miniport d’affichage peut insérer une clôture dans le flux d’accès direct à la mémoire (DMA) envoyé à l’unité de traitement graphique (GPU). Lorsque le GPU lit la clôture, le GPU écrit les données de clôture à l’adresse de clôture spécifiée. Toutefois, avant que le GPU puisse écrire les données de clôture en mémoire, il doit s’assurer que tous les pixels des primitives qui précèdent l’instruction de clôture sont retirés et correctement écrits en mémoire.
- Les clôtures régulières sont des clôtures qui peuvent être insérées dans une mémoire tampon DMA créée en mode utilisateur. Étant donné que le contenu d’une mémoire tampon DMA en mode utilisateur n’est pas approuvé, les clôtures d’une telle mémoire tampon DMA doivent faire référence à une adresse virtuelle dans l’espace d’adressage du contexte GPU et non à une adresse physique. L’accès à une telle adresse virtuelle est lié par le même mécanisme de validation de la mémoire que toute autre adresse virtuelle accessible par le GPU.
-
Les clôtures privilégiées sont des clôtures qui peuvent être insérées uniquement dans une mémoire tampon DMA créée (et accessible uniquement) en mode noyau. Les clôtures au sein d’une telle mémoire tampon DMA font référence à une adresse physique en mémoire.
Notez que si l’adresse cible de clôture était accessible en mode utilisateur, des logiciels malveillants peuvent effectuer une opération graphique sur l’emplacement de mémoire de la clôture et donc remplacer le contenu de ce que le noyau attendait de recevoir.
Si le pilote de miniport d’affichage a manqué la dernière clôture d’une mémoire tampon DMA, la fonction DxgkDdiQueryCurrentFence du pilote peut être appelée pour signaler la clôture manquée. Par exemple, si le matériel génère une clôture pour la mémoire, la fonction DxgkDdiInterruptRoutine du pilote est déclenchée pour lire la mémoire. Toutefois, si les données de la clôture ne sont pas disponibles lorsque le pilote tente de lire les données (par exemple, s’il existe un chipset défectueux), la clôture est généralement signalée lors de l’interruption suivante, sauf si les interruptions ont été arrêtées. Si les interruptions ont été arrêtées et que le sous-système du noyau graphique DirectX attend trop longtemps pour une clôture, le sous-système appelle la fonction DxgkDdiQueryCurrentFence du pilote pour vérifier la clôture actuelle et déterminer toute clôture en attente qu’il aurait pu manquer.
Avant que le pilote miniport d’affichage ne retourne à partir d’un appel à DxgkDdiQueryCurrentFence, si le dernier identificateur de clôture d’envoi terminé par le matériel n’a pas encore été signalé, le pilote doit appeler la fonction DxgkCbNotifyInterrupt pour signaler la clôture. Pour implémenter cette fonctionnalité, le pilote :
- Suit la dernière clôture signalée au système d’exploitation.
- Déclenche IRQL pour interrompre l’appareil. Pour élever IRQL au niveau d’interruption, le pilote peut appeler la fonction DxgkCbSynchronizeExecution pour synchroniser avec sa fonction DxgkDdiInterruptRoutine .
- Lors de l’interruption de l’appareil IRQL, compare la dernière clôture signalée avec la dernière clôture matérielle terminée.
- Lors de l’interruption de l’appareil IRQL, appelle DxgkCbNotifyInterrupt uniquement lorsque la clôture matérielle la plus récente terminée est plus récente que la dernière clôture signalée.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows Vista |
Plateforme cible | Desktop (Expérience utilisateur) |
En-tête | d3dkmddi.h (inclure D3dkmddi.h) |
IRQL | PASSIVE_LEVEL |