DXGKDDI_RENDERKM コールバック関数 (d3dkmddi.h)
GDI ハードウェア アクセラレーションをサポートするディスプレイ アダプターの場合、DxgkDdiRenderKm 関数は、カーネル モード正規ディスプレイ ドライバー (CDD) が渡したコマンド バッファーから直接メモリ アクセス (DMA) バッファーを生成します。
構文
DXGKDDI_RENDERKM DxgkddiRenderkm;
NTSTATUS DxgkddiRenderkm(
[in] IN_CONST_HANDLE hContext,
[in/out] INOUT_PDXGKARG_RENDER pRenderKmArgs
)
{...}
パラメーター
[in] hContext
DMA バッファーとコマンド バッファーのデバイス コンテキストへのハンドル。 ディスプレイ ミニポート ドライバーの DxgkDdiCreateContext 関数は、以前に、dxgkDdiCreateContext の pCreateContext パラメーターが指す DXGKARG_CREATECONTEXT 構造体の hContext メンバー このハンドルを返しました。
ドライバーがコンテキストの作成をサポートしていない場合、Microsoft DirectX グラフィックス カーネル サブシステムは、コンテキストへのハンドルをデバイスへのハンドルに置き換えます。 ディスプレイ ミニポート ドライバーの DxgkDdiCreateDevice 関数は、以前、dxgkDdiCreateDevice の pCreateDevice パラメーターが指す DXGKARG_CREATEDEVICE 構造体の hDevice メンバー内のデバイス ハンドル 返しました。
[in/out] pRenderKmArgs
DMA バッファーと書式設定されたコマンド バッファーに関する情報を含む DXGKARG_RENDER 構造体へのポインター。
ディスプレイ ミニポート ドライバーが GDI ハードウェア アクセラレーションをサポートしている場合は、pRenderKmArgs - pCommand>、DXGK_RENDERKM_COMMAND コマンド バッファーを指します。
ドライバーは、入力コマンド バッファーを DMA バッファー コマンドに変換し、パッチの場所の一覧をビルドする必要があります。
戻り値
DxgkDdiRenderKm は、次のいずれかの値を返します。
リターン コード | 説明 |
---|---|
STATUS_SUCCESS | コマンド バッファー全体が変換されました。 |
STATUS_NO_MEMORY | DxgkDdiRenderKm 、完了するために必要なメモリを割り当てませんでした。 |
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER | 現在の DMA バッファーが使い果たされました。 |
STATUS_INVALID_PARAMETER | DxgkDdiRenderKm 、グラフィックス ハードウェアでサポートできなかった命令パラメーターが検出。ただし、グラフィックス ハードウェアは命令自体をサポートできます。 ドライバーは、このエラー コードを返す必要はありません。 代わりに、サポートされていない命令パラメーターを検出したときにSTATUS_ILLEGAL_INSTRUCTIONを返すことができます。 |
STATUS_INVALID_USER_BUFFER | DxgkDdiRenderKm 、検出されたデータまたは命令のアンダーランまたはオーバーラン。 つまり、ドライバーが受け取った命令またはデータが予想よりも少ないか、またはそれ以上でした。 ドライバーは、このエラー コードを返す必要はありません。 代わりに、データまたは命令のアンダーランまたはオーバーランを検出したときにSTATUS_ILLEGAL_INSTRUCTIONを返すことができます。 |
STATUS_INVALID_HANDLE | DxgkDdiRenderKm コマンド バッファーで無効なハンドルが検出されました。 |
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | ディスプレイ ミニポート ドライバーが DMA ストリームでエラーを検出しました。 ドライバーがこのエラー コードを返した場合、グラフィックス コンテキスト デバイスは失われた状態になります。 |
備考
DirectX グラフィックス カーネル サブシステムは、ディスプレイ ミニポート ドライバーの DxgkDdiRenderKm 関数を呼び出して、オペレーティング システムによって提供されるカーネル モード正規ディスプレイ ドライバー (CDD) によって渡されるコマンド バッファーから DMA バッファーを生成します。 出力 DMA バッファーに加えて、ディスプレイ ミニポート ドライバーも出力パッチの場所の一覧を生成する必要があります。 ビデオ メモリ マネージャーでは、この一覧を使用して DMA バッファーを適切に分割および修正します。
カーネル バッファーへのアクセスには、try/except
コードからの保護は必要ありません。
ディスプレイ ミニポート ドライバーは、情報をより最適に再作成できる場合、CDD が提供する情報を使用する必要はありません。 たとえば、pRender->pPatchLocationListIn メンバーが空の場合、ユーザー モードのディスプレイ ドライバーが入力パッチの場所リストを提供していないため、ディスプレイ ミニポート ドライバーは、代わりにコマンド バッファーの内容に基づいて、pRender->pPatchLocationListOut メンバーのコンテンツを生成できます。
DirectX グラフィックス カーネル サブシステムは、デバイス固有のハンドルに加えて、各割り当ての最後の既知の GPU セグメント アドレスを表示ミニポート ドライバーを提供します。 割り当てインデックス N が現在ページ アウトされている場合、DirectX グラフィックス カーネル サブシステムは、DXGKARG_RENDER の pAllocationList メンバーの N番目の要素の SegmentId メンバーを 0 に設定します。 SegmentId 割り当てリストの N番目の要素のメンバーが 0 に設定されていない場合は、DirectX グラフィックス カーネル サブシステムが DMA バッファーを再パッチする DxgkDdiPatch 関数を呼び出す前に、指定されたセグメント アドレス情報を使用して生成された DMA バッファーにパッチを適用する必要があります。 DirectX グラフィックス カーネル サブシステムは、ドライバーが適切に修正プログラムを適用する必要がある DMA バッファーで DxgkDdiPatch 関数を呼び出さない可能性があるため、ドライバーは要求されたときにこの初期修正を実行する必要があります。
ドライバーの DxgkDdiRenderKm 関数は、前述のように初期 DMA バッファーの修正プログラムの適用を実行しますが、ドライバーは引き続き、DXGKARG_RENDER の pPatchLocationListOut メンバーが指定する出力パッチの場所の一覧に割り当てへのすべての参照を挿入する必要があります。 DMA バッファーが GPU に送信される前に割り当てのアドレスが変更される可能性があるため、このリストにはすべての参照が含まれている必要があります。したがって、DirectX グラフィックス カーネル サブシステムは、dma バッファーを再パッチする DxgkDdiPatch 関数を呼び出します。
割り当てをバインド解除するには、ディスプレイ ミニポート ドライバーは、NULL ハンドルを参照する割り当てリスト内の要素を指定し、NULL 割り当てを参照する修正プログラムの場所要素 使用できます。 通常、ドライバーは、NULL 要素として、割り当てリストの最初の要素 (要素 0) を使用する必要があります。
保証されたコントラクト DMA モードでは、ディスプレイ ミニポート ドライバーが DMA バッファーにコマンド バッファーを変換するとき、CDD は変換コマンドのための十分なリソースを保証する必要があります。 翻訳に十分なリソースが存在しない場合、ディスプレイ ミニポート ドライバーは DMA バッファーを拒否する必要があります。 詳細については、「保証されたコントラクト DMA バッファー モデル の使用」を参照してください。
DxgkDdiRenderKm をページング可能にする必要があります。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 7 |
ターゲット プラットフォーム の | デスクトップ |
ヘッダー | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |
関連項目
DxgkDdiCreateContextの
DxgkDdiCreateDeviceをする
DxgkDdiOpenAllocationをする
DxgkDdiPatchをする
DxgkDdiRenderをする