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.
- 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.
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:
- Verfolgt, welcher Zaun zuletzt an das Betriebssystem gemeldet wurde.
- 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.
- Beim Geräteunterbrechungs-IRQL vergleicht der zuletzt gemeldete Zaun mit dem neuesten Hardware-abgeschlossenen Zaun.
- Ruft beim Geräteunterbrechungs-IRQL dxgkCbNotifyInterrupt nur auf, wenn der letzte abgeschlossene Hardwarezaun neuer als der zuletzt gemeldete Zaun ist.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows Vista |
Zielplattform | Desktop |
Kopfzeile | d3dkmddi.h (einschließlich D3dkmddi.h) |
IRQL | PASSIVE_LEVEL |