共用方式為


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 可以將柵欄數據寫入記憶體之前,它必須確定柵欄指令前面的基本類型中的所有圖元都會淘汰,並正確地寫入記憶體。

注意 GPU 不需要將整個管線停止,同時等候基本類型的最後一個像素,該基本類型位於要淘汰的柵欄指示之前;GPU 可以改為執行遵循柵欄指示的基本類型。
 
支援每個 GPU 內容虛擬位址空間的硬體必須支援下列類型的柵欄:
  • 一般柵欄 是可在使用者模式中建立的 DMA 緩衝區中插入的柵欄。 由於來自使用者模式的 DMA 緩衝區內容不受信任,因此這類 DMA 緩衝區內的柵欄必須參考 GPU 內容地址空間中的虛擬位址,而不是實體位址。 這類虛擬位址的存取權會受到與 GPU 存取的任何其他虛擬位址相同的記憶體驗證機制所系結。
  • 特殊許可權柵欄 是只能在建立 (且只能在核心模式中存取) 的 DMA 緩衝區中插入的柵欄。 這類 DMA 緩衝區內的柵欄是指記憶體中的實體位址。

    請注意,如果在使用者模式中可存取柵欄目標位址,惡意軟體可能會對柵欄的記憶體位置執行圖形作業,因此會覆寫核心預期接收的內容。

請注意,具特殊許可權的 DMA 緩衝區可以同時包含一般和特殊許可權的柵欄。 不過,如果具特殊許可權的 DMA 緩衝區包含一般柵欄,則產生這類 DMA 緩衝區的核心元件會察覺到內部的一般柵欄可能永遠不會存取。

如果顯示迷你埠驅動程式遺漏 DMA 緩衝區的最後一個柵欄,可能會呼叫驅動程式的 DxgkDdiQueryCurrentFence 函式來報告遺漏的柵欄。 例如,如果硬體產生記憶體柵欄,則會觸發驅動程式的 DxgkDdiInterruptRoutine 函式來讀取記憶體。 不過,如果柵欄的數據在驅動程式嘗試讀取數據 (時無法使用,例如,如果有損壞的晶元組) ,除非中斷已停止,否則通常會在下一個中斷時回報柵欄。 如果中斷已停止,且 DirectX 圖形核心子系統等候太長的時間,則子系統會呼叫驅動程式的 DxgkDdiQueryCurrentFence 函式來驗證目前的柵欄,並判斷可能遺漏的任何擱置的柵欄。

在顯示迷你埠驅動程式從對 DxgkDdiQueryCurrentFence 的呼叫傳回之前,如果尚未報告最新的硬體完成提交柵欄標識碼,驅動程式必須呼叫 DxgkCbNotifyInterrupt 函式來報告柵欄。 若要實作這項功能,驅動程式:

  1. 追蹤上次向操作系統回報的柵欄。
  2. 將 IRQL 引發至裝置中斷。 若要引發 IRQL 以中斷層級,驅動程式可以呼叫 DxgkCbSynchronizeExecution 函式,以與其 DxgkDdiInterruptRoutine 函式同步處理。
  3. 在裝置中斷 IRQL 時,比較最後回報的柵欄與最新的硬體完成柵欄。
  4. 在裝置中斷 IRQL 時,只有在最新的硬體完成柵欄比上次回報的柵欄還新時,才會呼叫 DxgkCbNotifyInterrupt
DxgkDdiQueryCurrentFence 應該設為可分頁。

規格需求

需求
最低支援的用戶端 Windows Vista
目標平台 桌面
標頭 d3dkmddi.h (include D3dkmddi.h)
IRQL PASSIVE_LEVEL

另請參閱

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine