Windows グラフィックス スタックを介してコマンド バッファーを渡すには、次の一連の操作を実行する必要があります。
Direct3D ランタイムが次のいずれかの UMD 関数を呼び出して指定した操作を実行した場合、ユーザー モード ディスプレイ ドライバー (UMD) はコマンド バッファーの送信を開始します。
また、UMD は、コマンド バッファーがいっぱいになると常にコマンド バッファーの送信を開始します。
UMD は Direct3D ランタイムの pfnRenderCb 関数を呼び出して、コマンド バッファーをランタイムに送信します。
DirectX グラフィックス カーネル サブシステム (Dxgkrnl) は、カーネル モード ディスプレイ ミニポート ドライバー (KMD) DxgkDdiRender または DxgkDdiRenderKm 関数を呼び出してコマンド バッファーを検証し、ハードウェアの形式で DMA バッファーを書き込み、使用されるサーフェスを記述する割り当てリストを生成します。 DMA バッファーにはまだパッチが適用されていないことに注意してください (つまり、割り当てられた物理アドレス)。 手記ランタイムが UMD の Present 関数を呼び出してコマンド バッファーの送信を開始した場合、グラフィックス サブシステムは、DxgkDdiRender または DxgkDdiRenderKm ではなく、KMD のDxgkDdiPresent 関数を呼び出します。
ビデオ メモリ マネージャーは、KMD の DxgkDdiBuildPagingBuffer 関数を 呼び出して、DMA バッファーに付随する割り当て一覧で指定された割り当てを GPU アクセス可能なメモリとの間で移動する特殊な目的の DMA バッファー (ページング バッファーと呼ばれます) を作成します。 詳細については、「 ビデオ メモリ リソースのページング」を参照してください。
GPU スケジューラは、KMD の DxgkDdiPatch 関数を呼び出して、DMA バッファー内のリソースに物理アドレスを割り当てます。 ただし、DxgkDdiBuildPagingBuffer 呼び出し中にページング バッファーの物理アドレスが渡され、割り当てられたため、スケジューラは DxgkDdiPatch を呼び出してページング バッファーに物理アドレスを割り当てる必要はありません。
GPU スケジューラは、KMD の DxgkDdiSubmitCommand 関数を呼び出して、ドライバーがページング バッファーを GPU 実行ユニットにキューに入れたことを要求します。
GPU スケジューラは、KMD の DxgkDdiSubmitCommand 関数を呼び出して、ドライバーが DMA バッファーを GPU 実行ユニットにキューに入れたことを要求します。 GPU に送信された各 DMA バッファーには、フェンス識別子が含まれています。 GPU が DMA バッファーの処理を完了すると、GPU によって割り込みが生成されます。
KMD には、 DxgkDdiInterruptRoutine 関数の割り込みが通知されます。 KMD は、GPU から、完了した DMA バッファーのフェンス識別子を読み取る必要があります。
KMD は DxgkCbNotifyInterrupt 関数を呼び出して、DMA バッファーが完了したことを GPU スケジューラに通知する必要があります。
KMD は DxgkCbQueueDpc 関数を呼び出して、遅延プロシージャ 呼び出し (DPC) をキューに登録する必要があります。
ほとんどの DMA バッファー処理を処理するように KMD の DPC に通知されます。