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