ビデオ キャプチャおよびその他の子デバイスのサポート
ディスプレイ ミニポート ドライバーと、ビデオ キャプチャ デバイスまたは別の子デバイスのドライバーは、子ドライバーが親ミニポート ドライバーを介してそのデバイスとの通信に使用できるプライベート インターフェイスを相互に定義できます。 子ビデオ キャプチャ ドライバーは、親ディスプレイ ミニポート ドライバーに密結合する必要があります。 実際、ビデオ キャプチャは、ディスプレイ ミニポート ドライバーの一部として実装できる可能性があります。 ビデオ キャプチャ ドライバーは、I2C バスやその他の目的でアクセスするディスプレイ ミニポート ドライバーとプライベート インターフェイスを使用できます。
プライベート インターフェイスを初期化するために、ビデオ キャプチャ ドライバーは、ディスプレイ ミニポート ドライバーについて IRP_MN_QUERY_INTERFACE 要求を ディスプレイ ポート ドライバー (Dxgkrnl.sys の一部) に送信します。 ディスプレイ ポート ドライバーは、このような要求を受信した後で、ミニポート ドライバーの DxgkDdiQueryInterface 関数を呼び出し、プライベート インターフェイスを初期化する情報を含む QUERY_INTERFACE 構造体へのポインターを渡します。
注: ビデオ キャプチャがディスプレイ ミニポート ドライバーの一部として実装されている場合、ビデオ キャプチャは DxgkDdiQueryInterface を直接呼び出す可能性があります。
子デバイスの各ドライバー (ビデオ キャプチャ デバイスを含む) は、デバイスが関連付けられているハードウェアを示すアダプター GUID を返す必要があります。 アダプター GUID は、AdapterGuid (DXGK_START_INFO 構造体のメンバー) でディスプレイ ミニポート ドライバーに提供され、この構造体を指すのは DxgkStartInfo (アダプターの初期化時に送信される DxgkDdiStartDevice 関数のパラメーター) です。 ユーザー モード キャプチャ コンポーネントは、その後、このアダプター GUID をディスプレイ アダプターにマップできます。
Microsoft Windows 2000 ディスプレイ ドライバー モデルでは、ビデオ キャプチャ アプリケーションはシステム メモリ キャプチャ バッファーをカーネル モードに送信します。 カーネル モードでは、メモリ記述子リスト (MDL) の構造体を使用してシステム メモリ バッファーを記述し、ビデオ キャプチャ ドライバーに MDL を送信します。 Windows Vista ディスプレイ ドライバー モデルでは、システム メモリへのキャプチャのサポートに加えて、ビデオ メモリへのキャプチャもサポートされています。 Direct3D ランタイムは DirectX ビデオ アクセラレーション 2.0 型関数を呼び出して、キャプチャ データに対して後処理を実行するように GPU に指示します。 ビデオ メモリ バッファーを記述する MDL を送信する代わりに、ユーザー モードのディスプレイ ドライバーは、バッファーの割り当てをキャプチャするハンドルである D3DKMT_HANDLE 型の値を送信します。 したがって、ビデオ キャプチャ ドライバーとディスプレイ ミニポート ドライバーの組み合わせでは、キャプチャ バッファーを記述するプライベート データを参照する DxgkCbGetHandleData のような既存のコールバック関数を使用できます。 ドライバーの組み合わせは、DxgkCbGetCaptureAddress コールバック関数を使用してキャプチャ バッファーの物理アドレスを返すこともできます。
ビデオ キャプチャ アプリケーションは Direct3D ランタイムを呼び出してキャプチャ バッファーを作成します。ランタイムは、その後、ユーザー モード ディスプレイ ドライバーを呼び出します。 ランタイムは、キャプチャ バッファーを作成するために、ユーザー モードディスプレイ ドライバーの CreateResource 関数を (CaptureBuffer ビット フィールド フラグを Flags という D3DDDIARG_CREATERESOURCE 構造体のメンバーで設定した状態で) 呼び出します。 ディスプレイ ミニポート ドライバーは、ビデオ メモリ マネージャーの Capture ビット フィールド フラグも指定する必要があり、これはメモリ マネージャーがディスプレイ ミニポート ドライバーの DxgkDdiCreateAllocation 関数を呼び出してキャプチャ バッファーの割り当てを作成するときに指定されます。 キャプチャ バッファーが作成されると、すぐにメモリにピン留めされ、解放されるまでピン留めされません。 キャプチャ スタックはキャプチャ バッファーのカーネル モード割り当てハンドルをキャプチャ ドライバーに送信する必要があるため、ランタイムはユーザー モード ディスプレイ ドライバーの GetCaptureAllocationHandle 関数を呼び出して、各リソース ハンドルをそのリソースのカーネル モード割り当てハンドルにマップします。
キャプチャ ドライバーは、システム メモリへのキャプチャを直接サポートしているかどうかを報告できます。 キャプチャ ドライバーがシステム メモリへの直接キャプチャをサポートしている場合、この目的のために MDL がキャプチャ ドライバーに送信されます。 キャプチャ ドライバーがシステム メモリへの直接キャプチャをサポートしていない場合、ランタイムはビデオ メモリ キャプチャ バッファーを作成し、キャプチャ ドライバーがそれらを埋める必要があります。 ユーザー モード ディスプレイ ドライバーの CaptureToSysMem 関数は、キャプチャ バッファーの内容をシステム メモリサーフェイスにコピーするために呼び出されます。 ランタイムは、 CaptureToSysMem (Blt 関数ではなく) を使用して、ビット ブロック転送 (bitblt) 用の特別なハードウェアを利用でき、ユーザー モードのディスプレイ ドライバーで pfnRenderCb 関数を呼び出す必要がなくなります。
AVStream はビデオ キャプチャを制御するため、DirectX グラフィックス カーネル サブシステムはビデオ キャプチャがいつ発生するかを認識しません。 ただし、グラフィックス カーネル サブシステムは、キャプチャ バッファーとして使用される割り当てを認識します。 キャプチャ バッファーが破棄されようとしている場合、グラフィックス カーネル サブシステムはディスプレイ ミニポート ドライバーの DxgkDdiStopCapture 関数を呼び出して、キャプチャ操作がキャプチャ バッファーとしての割り当ての使用を直ちに停止する必要があることを示します。 キャプチャ操作がキャプチャ スタックを介して既に停止している場合、ドライバーは呼び出しを無視しても問題ありません。