共用方式為


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 分鐘的畫面格作為準則,以採取上述表格中目前階段的復原動作。