共用方式為


DXGKDDI_QUERYCURRENTFENCE回呼函式 (d3dkmddi.h)

DxgkDdiQueryCurrentFence 函式會查詢硬體命令執行單位中最新的已完成提交柵欄標識碼。

語法

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

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

參數

[in] hAdapter

與顯示配接器相關聯的內容區塊句柄。 顯示迷你埠驅動程式先前已將此句柄提供給 MiniportDeviceContextDxgkDdiAddDevice 函式的 Microsoft DirectX 圖形核心子系統。

[in/out] pCurrentFence

包含目前柵欄數據相關信息之 DXGKARG_QUERYCURRENTFENCE 結構的指標。

傳回值

DxgkDdiQueryCurrentFence 傳回STATUS_SUCCESS,如果無法成功擷取柵欄數據,則傳回適當的錯誤結果。

言論

柵欄 是包含 64 位數據和位址的指令。 顯示迷你埠驅動程式可以在傳送至圖形處理單元 (GPU) 的直接記憶體存取 (DMA) 數據流中插入柵欄。 當 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 (包括 D3dkmddi.h)
IRQL PASSIVE_LEVEL

另請參閱

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine