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.

Note Le GPU n’est pas nécessaire pour bloquer l’ensemble du pipeline pendant qu’il attend le dernier pixel des primitives qui précèdent l’instruction de clôture pour se retirer ; le GPU peut à la place exécuter les primitives qui suivent l’instruction de clôture.
 
Le matériel qui prend en charge l’espace d’adressage virtuel par contexte GPU doit prendre en charge les types de clôtures suivants :
  • 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.

Notez qu’une mémoire tampon DMA privilégiée peut contenir des clôtures régulières et privilégiées. Toutefois, si une mémoire tampon DMA privilégiée contient une clôture régulière, le composant noyau qui a généré une telle mémoire tampon DMA sait que la clôture normale à l’intérieur peut ne jamais être accessible.

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 :

  1. Suit la dernière clôture signalée au système d’exploitation.
  2. 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 .
  3. 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.
  4. 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.
DxgkDdiQueryCurrentFence doit être rendu paginable.

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

Voir aussi

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine