次の方法で共有


スレッドの同期および TDR

次の図は、WDDM のカーネル モード ディスプレイ ミニポート ドライバー (KMD) のスレッド同期のしくみを示しています。

WDDM でのスレッド同期を示す図。

ハードウェア タイムアウトが発生した場合、システムは タイムアウト検出と回復 (TDR) プロセスを開始します。 GPU スケジューラは、GPU をリセットするドライバーの DxgkDdiResetFromTimeout 関数を呼び出します。

  • DxgkDdiResetFromTimeout は、ランタイム電源管理関数 DxgkDdiSetPowerComponentFState と DxgkDdiPowerRuntimeControlRequest を除き、他の KMD 関数と同期的に呼び出されます。 つまり、 DXgkDdiResetFromTimeout スレッドの実行中に、ドライバーで他のスレッドが実行されていないことが OS によって保証されます。
  • また、 DXgkDdiResetFromTimeout の呼び出し中にアプリケーションがフレーム バッファーにアクセスできないことも保証されます。 そのため、ドライバーは、メモリ コント ローラー フェーズ ロック ループ (PLL) などをリセットできます。

回復スレッドは DxgkDdiResetFromTimeout を実行しますが、割り込みと遅延プロシージャ呼び出し (DPC) は引き続き呼び出すことができます。 KeSynchronizeExecution 関数を使用すると、リセット プロシージャの一部をデバイスの割り込みに対して同期させることができます。

ドライバーが DxgkDdiResetFromTimeout から戻ると、ほとんどのドライバー関数を再度呼び出すことができます。OS は不要になったリソースのクリーンアップを開始します。 クリーンアップ期間中は、指定された理由で次のドライバー関数が呼び出されます。

  • ドライバーは、削除される割り当てについて通知するために呼び出されます。

    たとえば、割り当てがメモリ セグメントでページングされた場合、ドライバーの DxgkDdiBuildPagingBuffer 関数は、DXGKARG_BUILDPAGINGBUFFER構造体の Operation メンバーを DXGK_OPERATION_TRANSFER に設定し、 Transfer.Size メンバーをゼロに設定してドライバーに削除について通知します。 リセット中にコンテンツが失われたため、コンテンツ転送は関係ありません。

    アロケーションが絞りセグメントでページングされた場合、ドライバーの DxgkDdiBuildPagingBuffer 関数は、 DXGKARG_BUILDPAGINGBUFFERの Operation メンバーをDXGK_OPERATION_UNMAP_APERTURE_SEGMENTに設定して呼び出され、アロケーションをアパーチャからマップ解除するようにドライバーに通知します。

  • ドライバーの DxgkDdiReleaseSwizzlingRange 関数が呼び出され、スウィズリングされていない絞りとセグメントの絞り範囲が解放されます。

ドライバーは、絶対に必要でない限り、上記の呼び出し中に GPU にアクセスしないでください。

クリーンアップ期間が終了すると、OS はドライバーの DxgkDdiRestartFromTimeout 関数を呼び出して、クリーンアップが完了し、レンダリングにアダプターを使用して OS が再開されることをドライバーに通知します。