DXGKDDI_QUERYCURRENTFENCE Rückruffunktion (d3dkmddi.h)

Die DxgkDdiQueryCurrentFence-Funktion fragt den letzten abgeschlossenen Übermittlungszaunbezeichner in der Hardwarebefehlsausführungseinheit ab.

Syntax

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

NTSTATUS DxgkddiQuerycurrentfence(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}

Parameter

[in] hAdapter

Ein Handle für einen Kontextblock, der einem Anzeigeadapter zugeordnet ist. Der Anzeigeminiporttreiber hat dieses Handle zuvor für das Microsoft DirectX-Grafikkernsubsystem im Ausgabeparameter MiniportDeviceContext der DxgkDdiAddDevice-Funktion bereitgestellt.

[in/out] pCurrentFence

Ein Zeiger auf eine DXGKARG_QUERYCURRENTFENCE-Struktur , die Informationen zu den aktuellen Zaundaten enthält.

Rückgabewert

DxgkDdiQueryCurrentFence gibt STATUS_SUCCESS oder ein entsprechendes Fehlerergebnis zurück, wenn die Zaundaten nicht erfolgreich abgerufen wurden.

Hinweise

Ein Zaun ist eine Anweisung, die 64 Bits an Daten und eine Adresse enthält. Der Display-Miniporttreiber kann einen Zaun in den DMA-Stream (Direct Memory Access) einfügen, der an die Grafikverarbeitungseinheit (GPU) gesendet wird. Wenn die GPU den Zaun liest, schreibt die GPU die Zaundaten an die angegebene Zaunadresse. Bevor die GPU die Zaundaten jedoch in den Arbeitsspeicher schreiben kann, muss sie sicherstellen, dass alle Pixel aus den Grundtypen, die der Zaunanweisung vorangehen, eingestellt und ordnungsgemäß in den Arbeitsspeicher geschrieben werden.

Hinweis Die GPU muss nicht die gesamte Pipeline anhalten, während sie darauf wartet, dass das letzte Pixel der Grundelemente, die der Zaunanweisung vorangehen, eingestellt wird. die GPU kann stattdessen die Grundtypen ausführen, die der Zaunanweisung folgen.
 
Hardware, die den virtuellen Adressraum pro GPU-Kontext unterstützt, muss die folgenden Arten von Zäunen unterstützen:
  • Reguläre Zäune sind Zäune, die in einen DMA-Puffer eingefügt werden können, der im Benutzermodus erstellt wird. Da der Inhalt eines DMA-Puffers aus dem Benutzermodus nicht vertrauenswürdig ist, müssen Zäune innerhalb eines solchen DMA-Puffers auf eine virtuelle Adresse im GPU-Kontextadressraum und nicht auf eine physische Adresse verweisen. Der Zugriff auf eine solche virtuelle Adresse ist durch denselben Speicherüberprüfungsmechanismus gebunden wie jede andere virtuelle Adresse, auf die die GPU zugreift.
  • Privilegierte Zäune sind Zäune, die nur in einen DMA-Puffer eingefügt werden können, der im Kernelmodus erstellt (und nur zugänglich) wird. Zäune innerhalb eines solchen DMA-Puffers beziehen sich auf eine physische Adresse im Arbeitsspeicher.

    Beachten Sie, dass schadhafte Software, wenn im Benutzermodus auf die Zaunzieladresse zugegriffen werden kann, einen Grafikvorgang über den Speicherspeicherort für den Zaun ausführen und daher den Inhalt des empfangenden Kernels außer Kraft setzen kann.

Beachten Sie, dass ein privilegierter DMA-Puffer sowohl reguläre als auch privilegierte Zäune enthalten kann. Wenn ein privilegierter DMA-Puffer jedoch einen regulären Zaun enthält, ist sich die Kernelkomponente, die einen solchen DMA-Puffer generiert hat, bewusst, dass auf den regulären Zaun möglicherweise nie zugegriffen werden kann.

Wenn der Anzeigeminiporttreiber den letzten Zaun eines DMA-Puffers verpasst hat, wird möglicherweise die DxgkDdiQueryCurrentFence-Funktion des Treibers aufgerufen, um den verpassten Zaun zu melden. Wenn die Hardware beispielsweise einen Zaun zum Arbeitsspeicher generiert, wird die DxgkDdiInterruptRoutine-Funktion des Treibers ausgelöst, um den Arbeitsspeicher zu lesen. Wenn die Daten des Zauns jedoch nicht verfügbar sind, wenn der Treiber versucht, die Daten zu lesen (z. B. wenn ein fehlerhafter Chipsatz vorhanden ist), wird der Zaun normalerweise beim nächsten Interrupt gemeldet, es sei denn, Interrupts wurden beendet. Wenn Interrupts beendet wurden und das DirectX-Grafikkernsubsystem zu lange auf einen Zaun wartet, ruft das Subsystem die DxgkDdiQueryCurrentFence-Funktion des Treibers auf, um den aktuellen Zaun zu überprüfen und einen ausstehenden Zaun zu ermitteln, der möglicherweise übersehen wurde.

Bevor der Anzeigeminiporttreiber von einem Aufruf von DxgkDdiQueryCurrentFence zurückkehrt, muss der Treiber die DxgkCbNotifyInterrupt-Funktion aufrufen, um den Zaun zu melden, wenn der letzte Hardware abgeschlossene Übermittlungszaunbezeichner noch nicht gemeldet wurde. Um diese Funktionalität zu implementieren, führt der Treiber Folgendes aus:

  1. Verfolgt, welcher Zaun zuletzt an das Betriebssystem gemeldet wurde.
  2. Löst IRQL zum Geräteunterbrechung aus. Um IRQL auf interrupt-Ebene anzuheben, kann der Treiber die DxgkCbSynchronizeExecution-Funktion aufrufen, um mit seiner DxgkDdiInterruptRoutine-Funktion zu synchronisieren.
  3. Beim Geräteunterbrechungs-IRQL vergleicht der zuletzt gemeldete Zaun mit dem neuesten Hardware-abgeschlossenen Zaun.
  4. Ruft beim Geräteunterbrechungs-IRQL dxgkCbNotifyInterrupt nur auf, wenn der letzte abgeschlossene Hardwarezaun neuer als der zuletzt gemeldete Zaun ist.
DxgkDdiQueryCurrentFence sollte seitenfähig gemacht werden.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista
Zielplattform Desktop
Kopfzeile d3dkmddi.h (einschließlich D3dkmddi.h)
IRQL PASSIVE_LEVEL

Weitere Informationen

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine