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 コールバック内 またはフレームの処理中にエラーが発生する理由はいくつかあります。 エラーの分類には、次のものがあります。
- ハードウェアの一時的な問題など、ソリューションに固有の一時的な問題。 この種類の問題は、回復が迅速に (通常は 1 秒未満) 発生し、画面上のビジュアル コンテンツに影響を与えない (ちらつきがないなど) ため、ユーザー エクスペリエンスに影響を与えない軽量の回復メカニズムで修正できます。
- ドライバーのデッドロックやハードウェアの重大な問題など、ソリューションに固有の永続的な問題。 通常、この種の問題は、まったくない場合は迅速に復旧できません。
- ドライバーの外部のイベントによって発生する DirectX API エラー。 たとえば、D3D デバイスがデスクトップ イメージを処理するアダプターが PnpStopped であったり、GPU 全体の障害が発生してリセットされた場合など、ドライバーはイベントを制御しません。
- ドライバーによって発生する DirectX API エラー。 ドライバーのバグにより、D3D デバイスがエラーまたはハングする可能性があります。 たとえば、テクスチャの境界外で座標を指定して CopySubResource を呼び出すと、デバイスがエラー状態になります。
- 別の IHV GPU ドライバーによって発生する DirectX API エラー。 これらのエラーは、IHV GPU ドライバーのバグをトリガーする IDD の正しい呼び出しパターンの結果である可能性があります。
ドライバーが異なる DirectX エラーを正確に区別することは困難です。 メイン違いは、外部 DirectX コンポーネントによって発生するエラーは一時的である可能性が高く、システムは安定した状態に回復します。一方、エラーが間接ディスプレイまたは GPU ドライバーによって引き起こされる場合は、バグが再び発生する可能性があります。
OS が再試行されるようにこれらのエラーを OS に反映する方法の詳細については、 EvtIddCxMonitorAssignSwapChain を参照してください。
ドライバーの各種類のエラーに対処する方法に関するガイダンスを次に示します。
ソリューションに固有の一時的な問題
ドライバーは、フレームの処理中に問題を解決する必要があります。 この操作により、フレームの処理が少し遅れる可能性があります。 エラーが定期的に発生する場合、ドライバーは永続的な問題にエラーを回避することを検討できます。
ソリューションに固有の永続的な問題
ドライバーは、0x100以上のメジャー コードを使用して IddCxReportCriticalError を呼び出し、一意のメジャー/マイナー コードを使用して、顧客/テレメトリの調査に役立つエラーの種類を表す必要があります。
DirectX エラー
DirectX エラーを処理する最も簡単な方法は、もう一度再試行できるように、それらを OS に反映することです。 ドライバーは EvtIddCxMonitorAssignSwapChain から STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAINを返す必要があります。または、フレームの処理中にエラーが発生した場合は、 WdfObjectDelete を呼び出してスワップチェーンを解放する必要があります。
この単純な方法では、OS が安定し、新しいスワップチェーン (場合によっては新しい Dxgi アダプター) が作成されるため、外部イベントによってトリガーされるエラーを処理します。 ドライバーによる DirectX の使用が制限されている場合、このアプローチは適切に機能します。
IDD のバグによって DirectX エラーが発生する可能性があるより複雑なドライバーや、古いドライバーまたはバグのある DirectX ドライバーで実行されているドライバーの場合、このアプローチは ID スワップチェーンエラーの無限ループで終わる可能性があります。 無限ループを回避するために、IDD はこれらのエラーの頻度を監視し、特定のステージが十分なエラー サイクルに達したときに復旧のステージ間を移動できます。 DirectX エラーが発生した場合は、ドライバーがその DX デバイスを破棄し、新しいデバイスを作成することが重要です。DX デバイスがエラー状態になると回復することは決してないため、再作成する必要があります。
現在のステージ | 連続するスワップチェーン DirectX エラーが多すぎる場合のドライバー アクション |
---|---|
EvtIddCxMonitorAssignSwapChain で 提供されるレンダー アダプター LUID はハードウェア アダプターです | Dxgi を使用してソフトウェア アダプターの LUID を検索し、 IddCxAdapterSetRenderAdapter を呼び出して、OS がデスクトップのレンダリングにソフトウェア アダプターを使用するように要求します。 |
EvtIddCxMonitorAssignSwapChain で提供される レンダー アダプター LUID はソフトウェア アダプターです | ドライバーは、0x100以上のメジャー コードを使用して IddCxReportCriticalError を呼び出し、一意のメジャー/マイナー コードを使用して、顧客/テレメトリの調査に役立つエラーの種類を表す必要があります |
たとえば、ドライバーは、上の表の現在のステージの復旧アクションを実行する基準として、1 分のフレームを処理しているときに、 EvtIddCxMonitorAssignSwapChain で 5 つの DirectX エラーが連続して発生したか、5 つのエラーを考慮できます。