DXGKDDI_PRESENT コールバック関数 (d3dkmddi.h)
DxgkDdiPresent 関数は、ソース割り当てからプライマリ サーフェス (および画面外システム メモリ割り当て) にコンテンツをコピーします。
構文
DXGKDDI_PRESENT DxgkddiPresent;
NTSTATUS DxgkddiPresent(
[in] IN_CONST_HANDLE hContext,
[in/out] INOUT_PDXGKARG_PRESENT pPresent
)
{...}
パラメーター
[in] hContext
コピー情報のデバイス コンテキストへのハンドル。 ディスプレイ ミニポート ドライバーの DxgkDdiCreateContext 関数は、DxgkDdiCreateContext の pCreateContext パラメーターが指すDXGKARG_CREATECONTEXT構造体の hContext メンバーで、このハンドルを以前に返しました。
ドライバーがコンテキストの作成をサポートしていない場合、Microsoft DirectX グラフィックス カーネル サブシステムは、コンテキストへのハンドルをデバイスへのハンドルに置き換えます。 ディスプレイ ミニポート ドライバーの DxgkDdiCreateDevice 関数は、DxgkDdiCreateDevice の pCreateDevice パラメーターが指すDXGKARG_CREATEDEVICE構造体の hDevice メンバーのデバイス ハンドルを以前に返しました。
[in/out] pPresent
コピー操作に関する情報を含む DXGKARG_PRESENT 構造体へのポインター。
戻り値
DxgkDdiPresent は 、次のいずれかの値を返します。
リターン コード | 説明 |
---|---|
STATUS_SUCCESS | DxgkDdiPresent がコンテンツを正常にコピーしました。 |
STATUS_NO_MEMORYまたはSTATUS_INSUFFICIENT_RESOURCES | DxgkDdiPresent では、完了するために必要なメモリを割り当てませんでした。 |
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER | 現在のダイレクト メモリ アクセス (DMA) バッファーが使い果たされました。 |
STATUS_GRAPHICS_CANNOTCOLORCONVERT | ディスプレイ ミニポート ドライバーは、デバイスが実行できなかった色変換のビット ブロック転送 (ビットブレット) を検出しました。 Microsoft Direct3D ランタイムは、アプリケーションの続行を防ぎ、アプリケーションがコンテンツのコピーエラーを受け取ります。 |
STATUS_PRIVILEGED_INSTRUCTION | DxgkDdiPresent は、特権のない命令 (つまり、現在の中央処理装置 [CPU] プロセスの特権を超えてメモリにアクセスする命令) を検出しました。 |
STATUS_ILLEGAL_INSTRUCTION | DxgkDdiPresent で、グラフィックス ハードウェアでサポートできない命令が検出されました。 |
STATUS_INVALID_HANDLE | DxgkDdiPresent がコマンド バッファーで無効なハンドルを検出しました。 |
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | ディスプレイ ミニポート ドライバーが DMA ストリームでエラーを検出しました。 ドライバーがこのエラー コードを返した場合、グラフィックス コンテキスト デバイスは失われた状態になります。 |
注釈
DirectX グラフィックス カーネル サブシステムは、ディスプレイ ミニポート ドライバーの DxgkDdiPresent 関数を呼び出して、通常はソース割り当てからプライマリ サーフェスにコンテンツをコピーします。 (この関数では、画面外のシステム メモリ割り当てにコンテンツをコピーすることもできます)。プライマリ サーフェスは大まかに定義されているため、次のシナリオで DxgkDdiPresent を実装できます。
- ウィンドウの位置に応じて、 DxgkDdiPresent 関数は、同じアダプター上または異なるアダプター間で実行できる異なるプライマリに対して実行する必要があります。
- プライマリはリモート モニター上にあり、ターミナル サービス クライアントまたは Microsoft NetMeeting を介してアクセスされます。
- モード スイッチが最近発生し、プライマリ形式がソース形式と異なるため、色変換が必要です。 さらに、ウィンドウのクリッピングと順序付けにより、 DxgkDdiPresent 操作をクリップできます。
ディスプレイ ミニポート ドライバーは、ドライバーが次の抽象化をサポートしている限り、上記のシナリオの詳細を認識する必要はありません。
- ビデオ メモリ ソースからプライマリ ビデオまたはシステム メモリ変換先へのコピー操作、オフスクリーン システム メモリ ソースからプライマリ宛先へのコピー、プライマリソースとの間のコピー、またはプライマリ ソースからオフスクリーン システム メモリへのコピーでは、ソースは pPresentent 構造体の pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 配列要素 DXGKARG_PRESENTの hDeviceSpecificAllocation メンバーによって指定されます。DxgkDdiPresent のパラメーターが を指します。 デバイスの現在のプライマリまたは画面外のシステム メモリ割り当てのいずれかである宛先は、DXGKARG_PRESENTの pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] 配列要素の hDeviceSpecificAllocation メンバーによって指定されます。 コピー先がソース (つまり、destination == source) と等しい場合、コピー操作は画面間ビット ブロック転送 (bitblt) です。 したがって、グラフィックス サブシステムは、ソースと宛先を次の値に設定します。
- destination != NULL (つまり、destination == nonNULL)
- source != NULL (つまり、source == nonNULL)
- ビデオ メモリが現在の割り当てから別の割り当てに切り替わる場合、ソースをオペレーティング システムで指定し、DXGKARG_PRESENTの pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 配列要素の hDeviceSpecificAllocation メンバーに設定できます。 グラフィックス サブシステムは、ソースと宛先を次の値に設定します。
- destination == NULL
- source != NULL (つまり、source == nonNULL)
メモ no-op flip は、現在スキャンアウトされている割り当てと同じソース割り当てから実行できます。 no-op flip は、レンダリング ストリームに垂直ブランクのキュー待機を挿入するために使用されます。 ディスプレイ ミニポート ドライバーは、別の割り当てに反転しているかのようにハードウェア フリップ コマンドを挿入する必要があります。 - プライマリ サーフェスに対するカラーフィル操作では、ソース割り当ては必要ありません。宛先は、DXGKARG_PRESENTの pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] 配列要素の hDeviceSpecificAllocation メンバーによって指定されるプライマリ割り当てハンドルです。 DXGKARG_PRESENTの Color メンバーは、通常、D3DDDIFORMAT列挙型の D3DDDIFMT_A8R8G8B8 形式です。 ただし、プライマリ形式が淡色化された RGB の場合、 Color にはパレット インデックスが含まれます。 したがって、グラフィックス サブシステムは、ソースと宛先を次の値に設定します。
- destination != NULL (つまり、destination == nonNULL)
- source == NULL
グラフィックス サブシステムは、新しい DMA バッファーを取得し、前の DxgkDdiPresent 呼び出しと同じ RECT 構造体の一覧を使用して、ドライバーの DxgkDdiPresent 関数を再度呼び出します。 ドライバーは、新しい DMA バッファーで停止した場所からドライバーを続行できるように、前の DxgkDdiPresent の呼び出しで RECT リストの完了に対して行われた進行状況の量を記録する pPresent によって指されるDXGKARG_PRESENT構造体の MultipassOffset メンバーを使用する必要があります。 ドライバーの DxgkDdiPresent 関数が RECT 構造体の一覧を完了すると、STATUS_SUCCESSを返します。
DMA バッファーの生成に加えて、ディスプレイ ミニポート ドライバーは、割り当ての物理アドレスがわかっている場合に後で修正プログラムを適用する必要がある DMA バッファー内のさまざまなオフセットを示す修正プログラムの場所の一覧を生成する必要があります。 ビデオ メモリ マネージャーは、割り当て一覧でドライバーに事前にパッチが適用された情報 (つまり、ソースと宛先の最後の物理アドレスを知っている) を提供する場合があります。
ビデオ メモリ マネージャーがこの情報を提供する場合、ドライバーは、これらの物理アドレスが DirectX グラフィックス カーネル サブシステムによって提供される最終的なアドレスであることを判断することによって DMA バッファーを生成する必要があります。 グラフィックス サブシステムは、DMA バッファーで DxgkDdiPatch 関数を呼び出して、後でもう一度パッチを適用しない可能性があります。 そのため、ドライバーは、DMA バッファーを正しく生成するために、パッチ前の情報を使用する必要があります。 DXGKARG_PRESENTの pAllocationList 配列の N番目の要素の SegmentId メンバーが 0 以外の場合、要素 N に対して事前修正プログラムが適用された情報が提供されます。
ソースのプライマリ割り当ては、 DxgkDdiCommitVidPn 関数で指定されます。 指定されたソース (複製モード) から複数のパスが生成された場合、ディスプレイ ミニポート ドライバーは、異なるターゲットのパス回転モードを指定して、出力が正しく回転されていることを確認する必要があります。 DxgkDdiPresent に指定されるすべてのパラメーターは、回転に依存しません。 ソースとターゲットの両方の四角形は、クライアントが認識する画面全体になります (たとえば、768 x 1024)。
DxgkDdiPresent を ページング可能にする必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista |
対象プラットフォーム | デスクトップ |
Header | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |
こちらもご覧ください
DXGKARG_PRESENT