次の方法で共有


コマンド バッファーの送信

Windows グラフィックス スタックを介してコマンド バッファーを渡すには、次の一連の操作を実行する必要があります。

  1. Direct3D ランタイムが次のいずれかの UMD 関数を呼び出して指定した操作を実行した場合、ユーザー モード ディスプレイ ドライバー (UMD) はコマンド バッファーの送信を開始します。

    • グラフィックスを表示する Present 関数。
    • ハードウェア コマンドを送信する Flush 関数。
    • 現在のコマンド バッチで使用されるリソースをロックする Lock 関数。

    また、UMD は、コマンド バッファーがいっぱいになると常にコマンド バッファーの送信を開始します。

  2. UMD は Direct3D ランタイムの pfnRenderCb 関数を呼び出して、コマンド バッファーをランタイムに送信します。

  3. DirectX グラフィックス カーネル サブシステム (Dxgkrnl) は、カーネル モード ディスプレイ ミニポート ドライバー (KMD) DxgkDdiRender または DxgkDdiRenderKm 関数を呼び出してコマンド バッファーを検証し、ハードウェアの形式で DMA バッファーを書き込み、使用されるサーフェスを記述する割り当てリストを生成します。 DMA バッファーにはまだパッチが適用されていないことに注意してください (つまり、割り当てられた物理アドレス)。 手記ランタイムが UMD の Present 関数を呼び出してコマンド バッファーの送信を開始した場合、グラフィックス サブシステムは、DxgkDdiRender または DxgkDdiRenderKm ではなく、KMD のDxgkDdiPresent 関数を呼び出します。

  4. ビデオ メモリ マネージャーは、KMD の DxgkDdiBuildPagingBuffer 関数を 呼び出して、DMA バッファーに付随する割り当て一覧で指定された割り当てを GPU アクセス可能なメモリとの間で移動する特殊な目的の DMA バッファー (ページング バッファーと呼ばれます) を作成します。 詳細については、「 ビデオ メモリ リソースのページング」を参照してください。

  5. GPU スケジューラは、KMD の DxgkDdiPatch 関数を呼び出して、DMA バッファー内のリソースに物理アドレスを割り当てます。 ただし、DxgkDdiBuildPagingBuffer 呼び出し中にページング バッファーの物理アドレスが渡され、割り当てられたため、スケジューラは DxgkDdiPatch を呼び出してページング バッファーに物理アドレスを割り当てる必要はありません。

  6. GPU スケジューラは、KMD の DxgkDdiSubmitCommand 関数を呼び出して、ドライバーがページング バッファーを GPU 実行ユニットにキューに入れたことを要求します。

  7. GPU スケジューラは、KMD の DxgkDdiSubmitCommand 関数を呼び出して、ドライバーが DMA バッファーを GPU 実行ユニットにキューに入れたことを要求します。 GPU に送信された各 DMA バッファーには、フェンス識別子が含まれています。 GPU が DMA バッファーの処理を完了すると、GPU によって割り込みが生成されます。

  8. KMD には、 DxgkDdiInterruptRoutine 関数の割り込みが通知されます。 KMD は、GPU から、完了した DMA バッファーのフェンス識別子を読み取る必要があります。

  9. KMD は DxgkCbNotifyInterrupt 関数を呼び出して、DMA バッファーが完了したことを GPU スケジューラに通知する必要があります。

  10. KMD は DxgkCbQueueDpc 関数を呼び出して、遅延プロシージャ 呼び出し (DPC) をキューに登録する必要があります。

  11. ほとんどの DMA バッファー処理を処理するように KMD の DPC に通知されます。