Freigeben über


DXGKDDI_QUERYCURRENTFENCE Rückruffunktion (d3dkmddi.h)

Die DxgkDdiQueryCurrentFence Funktionsabfragen über den neuesten abgeschlossenen Übermittlungszaunbezeichner in der Hardwarebefehlsausführungseinheit.

Syntax

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

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

Parameter

[in] hAdapter

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

[in/out] pCurrentFence

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

Rückgabewert

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

Bemerkungen

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

Hinweis Die GPU ist nicht erforderlich, um die gesamte Pipeline zu halten, während sie auf das letzte Pixel von den Grundtypen wartet, die vor der Zaunanweisung stehen, um zurückzuziehen; 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 Zaunen 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 an den gleichen Speicherüberprüfungsmechanismus gebunden wie jede andere virtuelle Adresse, auf die die GPU zugreift.
  • Privilegierte Zaune sind Zäune, die nur in einen DMA-Puffer eingefügt werden können, der (und nur zugänglich) im Kernelmodus erstellt wird. Zäune innerhalb eines solchen DMA-Puffers beziehen sich auf eine physische Adresse im Arbeitsspeicher.

    Beachten Sie, dass, wenn auf die Zieladresse des Zauns im Benutzermodus zugegriffen werden kann, schadhafte Software einen Grafikvorgang über den Speicherspeicherort für den Zaun ausführen und daher den Inhalt des zu 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 jedoch ein privilegierter DMA-Puffer einen regulären Zaun enthält, ist die Kernelkomponente, die einen solchen DMA-Puffer generiert hat, bewusst, dass der reguläre Zaun innerhalb möglicherweise nie zugänglich ist.

Wenn der Display-Miniporttreiber den letzten Zaun eines DMA-Puffers verpasst hat, wird möglicherweise die DxgkDdiQueryCurrentFence-Funktion aufgerufen, um den verpassten Zaun zu melden. Wenn die Hardware z. B. einen Zaun zum Arbeitsspeicher generiert, wird die DxgkDdiInterruptRoutine-Funktion ausgelöst, um den Speicher zu lesen. Wenn die Daten des Zauns jedoch nicht verfügbar sind, wenn der Fahrer versucht, die Daten zu lesen (z. B. wenn ein defekter Chipsatz vorhanden ist), wird der Zaun normalerweise beim nächsten Interrupt gemeldet, es sei denn, Unterbrechungen wurden angehalten. Wenn Unterbrechungen beendet wurden und das DirectX-Grafik-Kernel-Subsystem zu lange auf einen Zaun wartet, ruft das Subsystem die DxgkDdiQueryCurrentFence--Funktion auf, um den aktuellen Zaun zu überprüfen und alle ausstehenden Zaun zu ermitteln, die er möglicherweise verpasst hat.

Bevor der Anzeigeminiporttreiber von einem Aufruf an DxgkDdiQueryCurrentFencezurückgibt, muss der Treiber die DxgkCbNotifyInterrupt--Funktion aufrufen, um den Zaun zu melden. 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 auf Geräteunterbruch aus. Um IRQL zum Unterbrechen aufzuheben, kann der Treiber die DxgkCbSynchronizeExecution--Funktion aufrufen, um mit der DxgkDdiInterruptRoutine--Funktion zu synchronisieren.
  3. Bei geräteunterbrechen IRQL vergleicht der zuletzt gemeldete Zaun mit dem neuesten hardwaregeschlossenen Zaun.
  4. Bei Geräteunterbruch IRQL ruft DxgkCbNotifyInterrupt nur auf, wenn der neueste abgeschlossene Hardwarezaun neuer als der letzte gemeldete Zaun ist.
DxgkDdiQueryCurrentFence sollte seitenfähig gemacht werden.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows Vista
Zielplattform- Desktop
Header- d3dkmddi.h (einschließlich D3dkmddi.h)
IRQL- PASSIVE_LEVEL

Siehe auch

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine