GPU 先佔
從 Windows 8 開始,可以使用較新的 GPU 先佔模型。 在此模型中,操作系統不再允許先佔 GPU 直接記憶體存取, (DMA) 封包遭到停用,並保證先佔要求會在啟動 逾時偵測和復原 (TDR) 進程之前傳送至 GPU。
需求 | 描述 |
---|---|
最低 Windows 顯示器驅動程式模型 (WDDM) 版本 | 1.2 |
最低 Windows 版本 | 8 |
驅動程序實作- 僅限完整圖形和轉譯 | 強制性 |
WHLK 需求和測試 | Device.Graphics...先占測試, Device.Graphics...FlipOnVSyncMmIo |
如果無法成功優先執行長時間執行的封包,高優先順序 GPU 工作,例如桌面視窗管理員 (DWM) 所需的工作,可能會延遲,導致視窗轉換和動畫期間發生問題。 此外,無法先占長時間執行的 GPU 封包可能會導致 TDR 進程重複重設 GPU,最後會發生系統錯誤檢查。
注意所有 WDDM 1.2 顯示迷你埠驅動程式都必須支援 Windows 8 先佔模型。 不過,在作業中時,WDDM 1.2 驅動程式也可以拒絕 Windows 8 先佔模型,並保留 Microsoft DirectX 圖形核心子系統排程器的 Windows 7 行為。
GPU 先佔裝置驅動程式介面 (DIS)
下列設備驅動器介面 (DIS) 可供顯示迷你埠驅動程序實作 Windows 8 GPU 先佔模型。
- DxgkCbCreateContextAllocation
- DxgkCbDestroyContextAllocation
- pfnSetPriorityCb
- Dxgkrnl 介面
- DXGKRNL_INTERFACE
- D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY
- D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY
- D3DKMDT_PREEMPTION_CAPS
- D3DKMT_QUERYADAPTERINFO
- DXGK_DRIVERCAPS
- DXGK_SUBMITCOMMANDFLAGS
- DXGK_VIDSCHCAPS
- DXGKARGCB_CREATECONTEXTALLOCATION
顯示迷你埠驅動程序實作
請遵循下列一般步驟,在您的顯示迷你埠驅動程序中實作 Windows 8 GPU 先佔模型:
- 針對具有 DXGKDDI_INTERFACE_VERSION= DXGKDDI_INTERFACE_VERSION_WIN8> 的標頭編譯驅動程式。
- 將 DXGK_VIDSCHCAPS 結構的PreemptionAware 和 MultiEngineAware 成員設定為 1,以宣告對 Windows 8 GPU 先占模型的支援。 若要支援 Windows 7 先佔模型,請將 PreemptionAware 設定為零。
- 在 D3DKMDT_PREEMPTION_CAPS 結構中指定支援的先占數據粒度層級,它會從 D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY 和 D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY 列舉中取得常數值。
- 如果硬體支援延遲內容切換,請將長度為零的緩衝區提交至 DxgkDdiSubmitCommand 函式,並將 pSubmitCommand-Flags-ContextSwitch>> 成員設定為 1。 請注意DXGK_SUBMITCOMMANDFLAGS結構之 ContextSwitch 成員下的討論。
- 藉由呼叫 DxgkCbCreateContextAllocation 函式來設定 GPU 內容配置和裝置內容配置。 請注意函式的中提供的特定指示和限制。
- 呼叫 DxgkCbDestroyContextAllocation 函式,以終結使用 DxgkCbCreateContextAllocation 建立的 GPU 內容配置和裝置內容配置。
- 準備 DMA 緩衝區以回應對 DxgkDdiBuildPagingBuffer 函式的呼叫時,請填入 DXGKARG_BUILDPAGINGBUFFER 結構內的 InitContextResource 內部結構,以初始化內容資源。 如果收回或重新放置內容資源,視訊記憶體管理員將會保留內容資源的內容。
- 驅動程式必須支援下一個垂直同步處理的記憶體對應I/O翻轉。在 Windows 8 中,即使翻轉擱置,GPU 排程器仍會嘗試先佔硬體。 因此,為了防止卸除和轉譯成品,驅動程式必須支援記憶體對應的 I/O 翻轉模型,而且必須將 DXGK_FLIPCAPS 結構的 FlipOnVSyncMmIo 成員設定為 1,並支援 FlipOnVSyncMmIo 底下所述的作業。
實作中的記憶體對應考慮
建立強固的驅動程式,以支援 Windows 8 GPU 先佔模型,並遵循下列指引來提供高品質的用戶體驗:
- 當 DirectX 圖形核心 (Dxgkrnl) 排程器傳送先佔命令時,從 GPU 要求中間 DMA 緩衝區先佔。 具有中 DMA 緩衝區先佔更細微度的硬體裝置,應該會產生更好的客戶體驗。
- 允許重複使用分頁命令柵欄標識碼:如果先佔要求導致在硬體佇列中先佔分頁命令,Dxgkrnl 排程器將會重新提交預先佔位的分頁命令,且原本用於它們的相同柵欄標識符,而且分頁命令會在該引擎的任何其他命令之前排程。 系統會以新指派的柵欄標識元重新提交非分頁命令。
- 提供分割 DMA 緩衝區的修補程式位置清單,請參閱 分割 DMA 緩衝區。
- 驗證模式稱為系結外洩偵測,可逐步解說修補程式位置清單,並拒絕未解除系結的封包,或未針對每個分割封包重新編譯配置。 某些硬體支援虛擬位址,允許額外的間接存取層級,讓此驗證不必要。 在這種情況下,若要指出驅動程式退出退出驗證模式,請將 DXGK_VIDSCHCAPS 結構的 NoDmaPatching 成員設定為 1。
- 在 Windows 7 中,Dxgkrnl 排程器保證會循序執行對應至相同轉譯命令的所有分割 DMA 封包,而不會切換至另一個轉譯內容。 在 Windows 8 先佔模型中,排程器可以從兩個對應至相同轉譯命令的分割封包之間,從不同的內容執行轉譯封包。 因此,察覺先佔的驅動程序應該以與一般完整封包提交相同的方式處理分割/部分 DMA 封包提交。 特別是,GPU 狀態必須儲存或還原到這類提交的界限。
- 當分割 DMA 緩衝區的內容廣播至連結的顯示器適配卡 (LDA) 模式中,多個實體 GPU 會連結至單一、更快速、虛擬 GPU 時,先佔感知驅動程式不得變更分割 DMA 緩衝區的內容。 這是因為在 Windows 8 先佔模型中,Dxgkrnl 排程器不再保證同步執行分割封包序列,而不需要切換到另一個內容。 變更分割 DMA 封包內容的驅動程式會危害封包數據的完整性,因為如果封包是在另一個引擎上執行,它會在相同的 DMA 緩衝區數據復本上運作。
- 在 Windows 8 GPU 先佔模型中,Dxgkrnl 排程器會針對具有相關聯「送出訊號」同步處理基本類型的封包啟用先佔。 如果裝置搭配硬體型等候狀態使用「送出訊號」同步處理基本類型,則必須支援在滿足等候條件之前先佔等候指令的能力。
硬體認證需求
如需硬體裝置在實作此功能時必須符合的需求資訊,請參閱 Device.Graphics 的相關 WHCK 檔...先占測試與 Device.Graphics...FlipOnVSyncMmIo。
如需使用 Windows 8 新增的功能檢閱,請參閱 WDDM 1.2 功能。