WDDM 3.0 之前的翻轉隊列模型
許多新式顯示控制器支持對按順序顯示的多個幀排隊的能力。 從 WDDM 2.1 開始,OS 支持將在下一個 VSync 中顯示的多個未完成的翻轉覆蓋請求。 顯示微型端口驅動程序 (KMD) 通過 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVSync 值來表示這種支持。 此功能對于減少高幀速率游戲方案中的延遲非常有用,在這種方案中,多個幀以間隔 0 依次呈現,目的是只顯示最近的幀。
在視頻播放方案中,要按順序顯示的多個未來幀的內容是預先已知的,并且可以排隊到 GPU。 這種提前排隊允許 CPU 在處理排隊幀時進入低功率狀態,從而節省大量電源。 但是,在 WDDM 3.0 之前,OS 沒有機制提交需要在屏幕上保留至少一個 VSync 間隔的幀,而無需進一步的 CPU 干預。 基本硬件翻轉隊列一節介紹了一種解決方案,該解決方案使 CPU 能夠進入低功耗狀態,并將排隊的幀處理卸載到 GPU。
在 WDDM 3.0 之前的游戲方案中,GPU 完成將場景呈現到交換鏈后緩沖區后,會有一個到 CPU 的往返,以便將請求提交以將幀內容呈現到屏幕。 對于接近 VSync 的繁重 GPU 工作負荷,此往返可能會導致幀延遲并錯過預期目標時間,從而導致可觀察的幀故障。 “高級硬件翻轉隊列”部分引入了一種機制,用于避免此 CPU 往返,并將已完成的幀呈現給屏幕且延遲較低。 高級硬件翻轉隊列要求同時具有基本硬件翻轉隊列和 GPU 硬件計劃階段 2 功能。
基本硬件翻轉隊列
下圖演示了呈現三個幀的情況,每個幀在屏幕上停留一個 VSync 間隔
?
示意圖中的填充圖案顯示了?Dxgkrnl?軟件翻轉隊列處理和應用程序線程必須喚醒并執行 CPU 工作的時間。 在每個 VSync 上,顯示控制器必須向 OS 發出完成翻轉的 CPU 通知,并且 OS 必須提交下一個翻轉請求。 應用程序還必須在每個 VSync 上喚醒,并查詢當前統計信息,以最終了解三幀中的最后一幀何時顯示。
從 WDDM 3.0 開始,提供了可以向顯示控制器隊列提交多個未來幀的硬件翻轉隊列 DDI。 如前所述,此機制允許 GPU 的 CPU 和部分在顯示控制器處理多個排隊幀時轉換到較低電源狀態。 此轉換可提高支持硬件的視頻播放方案的電源效率。
下圖說明了建議的體系結構。
借助硬件翻轉隊列方法,應用程序和?Dxgkrnl?CPU 組件在?v2?和?v4?時間之間的兩個 VSync 間隔內處于完全空閑狀態,從而使 CPU 能夠進入低功耗狀態。 只有當應用程序請求等待的幀?N+2?完成時,CPU 才會得到通知。
高級硬件翻轉隊列
在 WDDM 3.0 之前的游戲方案中,GPU 完成將場景呈現到交換鏈后緩沖區后,會有一個到 CPU 的往返,以便將請求提交以將幀內容呈現到屏幕。 下圖顯示了此方案。
如果呈現完成得離 VSync 太近,這種往返的代價可能會導致幀錯過目標,如下圖所示。
?
一些顯示器控制器本身支持等待條件,允許顯示在 GPU 完成呈現幀時提交翻轉請求,而無需 CPU 往返。 由于硬件翻轉隊列可以將已完成的幀?N?提交到沒有 CPU 往返的顯示器,因此它可能會避免錯過的幀,如下圖所示: