EvtIddCxMonitorAssignSwapChain 錯誤處理
EvtIddCxMonitorAssignSwapChain 錯誤處理中的變更
在 1903 版之前的 Windows 10 版本中,其他桌面組合不知道 EvtIddCxMonitorAssignSwapChain 失敗。 它繼續轉譯並呈現間接顯示配接器未處理的畫面格,導致IddCx在一段時間後終止間接顯示驅動程式 (IDD)。
從 Windows 10 版本 1903(IddCx 1.4)開始,此回呼的 IddCx 錯誤處理已針對所有驅動程式版本變更,並導入 了STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN 狀態代碼。 如需詳細資訊,請參閱 EvtIddCxMonitorAssignSwapChain。
處理框架處理循環線程中的錯誤
一旦IDD成功從EvtIddCxMonitorAssignSwapChain傳回,它就會擁有 hSwapChain 物件。 如果驅動程式遇到導致無法繼續處理框架的錯誤,它可以呼叫 WdfObjectDelete 來釋放擁有權。 OS 會偵測刪除,並導致建立新的交換鏈。
如果驅動程式知道無法從此錯誤中復原,它應該呼叫 IddCxReportCriticalError 來停止裝置。
處理交換鏈錯誤的建議方法
EvtIddCxMonitorAssignSwapChain 回呼或處理框架時失敗的原因有很多。 失敗分類包括:
- 解決方案特有的暫時性問題,例如硬體的暫時性問題。 這種類型的問題可以使用輕量型復原機制來修正,因為復原會快速發生(通常不到一秒的時間)且不會影響螢幕上的視覺內容(例如,沒有閃爍)。
- 解決方案特有的永久問題,例如驅動程式中的死結或硬體的嚴重問題。 這種類型的問題通常完全無法從快速復原。
- 驅動程式外部事件所造成的 DirectX API 錯誤。 例如,您的驅動程式無法控制事件,例如當 D3D 裝置處理桌面映像的適配卡為 PnpStopped 或發生全 GPU 錯誤且重設時。
- 驅動程式所造成的 DirectX API 錯誤。 驅動程式錯誤可能會導致 D3D 裝置發生錯誤或停止回應。 例如,在紋理界限外呼叫 CopySubResource 時,會將裝置置於錯誤狀態。
- 另一個 IHV GPU 驅動程式所造成的 DirectX API 錯誤。 這些錯誤可能是IDD中觸發IHV GPU驅動程式錯誤的正確呼叫模式的結果。
驅動程式很難準確地區分不同的 DirectX 錯誤。 主要差異在於,外部 DirectX 元件所造成的錯誤可能是暫時性的,而且系統會復原成穩定狀態:而如果錯誤是由間接顯示器或 GPU 驅動程式所造成,則錯誤可能會再次發生。
如需如何將這些錯誤傳播回OS以讓OS重試的詳細資訊,請參閱EvtIddCxMonitorAssignSwapChain。
以下是一些有關如何處理驅動程式中每種錯誤類型的指引。
解決方案特有的暫時性問題
驅動程式應該在處理框架時修正問題。 此動作可能會導致處理畫面的延遲很小。 如果錯誤定期發生,則驅動程式可以考慮將錯誤先佔到永久問題。
解決方案特有的永久問題
驅動程式應該使用等於或高於0x100的主要程式代碼呼叫 IddCxReportCriticalError ,並使用唯一的主要/次要程式代碼來代表錯誤類型,以協助客戶/遙測調查。
DirectX 錯誤
處理 DirectX 錯誤最簡單的方式是將它們傳播回 OS,以便再次重試。 驅動程式應該從 EvtIddCxMonitorAssignSwapChain 傳回STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN,或者,如果在處理框架時發生錯誤,驅動程式應該呼叫 WdfObjectDelete 來釋放交換鏈。
這個簡單的方法會處理外部事件所觸發的錯誤,因為OS會穩定並建立新的交換鏈(可能位於新的 Dxgi 配接器上)。 如果驅動程式對 DirectX 的使用有限,則此方法運作良好。
對於可能因IDD中的Bug或針對在舊/Buggy DirectX 驅動程式上執行的驅動程式所造成之 DirectX 錯誤的更複雜的驅動程式,此方法可能會以無休止的標識符交換鏈失敗循環結束。 為了避免無休止的迴圈,IDD 可以監視這些錯誤的頻率,並在指定的階段達到足夠的錯誤週期時,進行復原階段。 如果遇到 DirectX 錯誤,驅動程式必須終結該 DX 裝置並建立新的裝置,因為一旦 DX 裝置處於錯誤狀態,它永遠不會復原且需要重新建立。
目前階段 | 如果驅動程式偵測到太多連續交換鏈 DirectX 錯誤,驅動程序動作 |
---|---|
EvtIddCxMonitorAssignSwapChain 中提供的轉譯配接器 LUID 是硬體配接器 | 使用 Dxgi 尋找軟體配接器的 LUID,並呼叫 IddCxAdapterSetRenderAdapter 來要求操作系統使用軟體配接器來轉譯桌面。 |
轉譯配接器 LUID 提供於 EvtIddCxMonitorAssignSwapChain 是軟體配接器 | 驅動程式應該使用等於或高於0x100的主要程式代碼呼叫 IddCxReportCriticalError ,並使用唯一的主要/次要程式代碼來代表錯誤類型,以協助客戶/遙測調查 |
例如,驅動程式可以在 EvtIddCxMonitorAssignSwapChain 中考慮連續五次 DirectX 失敗,或在處理包含 1 分鐘的畫面格作為準則,以採取上述表格中目前階段的復原動作。