DXGKDDI_QUERYCURRENTFENCE回呼函式 (d3dkmddi.h)
DxgkDdiQueryCurrentFence 函式會查詢硬體命令執行單位中最新的已完成提交柵欄標識符。
語法
DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;
NTSTATUS DxgkddiQuerycurrentfence(
[in] IN_CONST_HANDLE hAdapter,
[in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}
參數
[in] hAdapter
與顯示配接器相關聯的內容區塊句柄。 顯示迷你埠驅動程式先前已將此句柄提供給 DxgkDdiAddDevice 函式之 MiniportDeviceContext 輸出參數中的 Microsoft DirectX 圖形核心子系統。
[in/out] pCurrentFence
包含目前柵欄數據相關信息 之DXGKARG_QUERYCURRENTFENCE 結構的指標。
傳回值
DxgkDdiQueryCurrentFence 會傳回STATUS_SUCCESS,如果未成功擷取柵欄數據,則傳回適當的錯誤結果。
備註
柵欄是包含 64 位資料和位址的指令。 顯示迷你埠驅動程式可以將柵欄插入直接記憶體存取 (DMA) 數據流中,該數據流會傳送至圖形處理單位 (GPU) 。 當 GPU 讀取柵欄時,GPU 會在指定的柵欄位址寫入柵欄數據。 不過,在 GPU 可以將柵欄數據寫入記憶體之前,它必須確定柵欄指令前面的基本類型中的所有圖元都會淘汰,並正確地寫入記憶體。
- 一般柵欄 是可在使用者模式中建立的 DMA 緩衝區中插入的柵欄。 由於來自使用者模式的 DMA 緩衝區內容不受信任,因此這類 DMA 緩衝區內的柵欄必須參考 GPU 內容地址空間中的虛擬位址,而不是實體位址。 這類虛擬位址的存取權會受到與 GPU 存取的任何其他虛擬位址相同的記憶體驗證機制所系結。
-
特殊許可權柵欄 是只能在建立 (且只能在核心模式中存取) 的 DMA 緩衝區中插入的柵欄。 這類 DMA 緩衝區內的柵欄是指記憶體中的實體位址。
請注意,如果在使用者模式中可存取柵欄目標位址,惡意軟體可能會對柵欄的記憶體位置執行圖形作業,因此會覆寫核心預期接收的內容。
如果顯示迷你埠驅動程式遺漏 DMA 緩衝區的最後一個柵欄,可能會呼叫驅動程式的 DxgkDdiQueryCurrentFence 函式來報告遺漏的柵欄。 例如,如果硬體產生記憶體柵欄,則會觸發驅動程式的 DxgkDdiInterruptRoutine 函式來讀取記憶體。 不過,如果柵欄的數據在驅動程式嘗試讀取數據 (時無法使用,例如,如果有損壞的晶元組) ,除非中斷已停止,否則通常會在下一個中斷時回報柵欄。 如果中斷已停止,且 DirectX 圖形核心子系統等候太長的時間,則子系統會呼叫驅動程式的 DxgkDdiQueryCurrentFence 函式來驗證目前的柵欄,並判斷可能遺漏的任何擱置的柵欄。
在顯示迷你埠驅動程式從對 DxgkDdiQueryCurrentFence 的呼叫傳回之前,如果尚未報告最新的硬體完成提交柵欄標識碼,驅動程式必須呼叫 DxgkCbNotifyInterrupt 函式來報告柵欄。 若要實作這項功能,驅動程式:
- 追蹤上次向操作系統回報的柵欄。
- 將 IRQL 引發至裝置中斷。 若要引發 IRQL 以中斷層級,驅動程式可以呼叫 DxgkCbSynchronizeExecution 函式,以與其 DxgkDdiInterruptRoutine 函式同步處理。
- 在裝置中斷 IRQL 時,比較最後回報的柵欄與最新的硬體完成柵欄。
- 在裝置中斷 IRQL 時,只有在最新的硬體完成柵欄比上次回報的柵欄還新時,才會呼叫 DxgkCbNotifyInterrupt 。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows Vista |
目標平台 | 桌面 |
標頭 | d3dkmddi.h (include D3dkmddi.h) |
IRQL | PASSIVE_LEVEL |