次の方法で共有


DXGKDDI_QUERYCURRENTFENCE コールバック関数 (d3dkmddi.h)

DxgkDdiQueryCurrentFence 関数は、ハードウェア コマンド実行ユニットで完了した最新の送信フェンス識別子に関するクエリを実行します。

構文

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

NTSTATUS DxgkddiQuerycurrentfence(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}

パラメーター

[in] hAdapter

ディスプレイ アダプターに関連付けられているコンテキスト ブロックへのハンドル。 ディスプレイ ミニポート ドライバーは、DxgkDdiAddDevice 関数の出力パラメーター ミニポートDeviceContext の Microsoft DirectX グラフィックス カーネル サブシステムにこのハンドルを提供しました。

[in/out] pCurrentFence

現在のフェンス データに関する情報を含む DXGKARG_QUERYCURRENTFENCE 構造体へのポインター。

戻り値

DxgkDdiQueryCurrentFence は、STATUS_SUCCESSを返します。フェンス データが正常に取得されない場合は、適切なエラー結果が返されます。

備考

フェンス は、64 ビットのデータとアドレスを含む命令です。 ディスプレイ ミニポート ドライバーは、グラフィックス処理装置 (GPU) に送信されるダイレクト メモリ アクセス (DMA) ストリームにフェンスを挿入できます。 GPU がフェンスを読み取ると、GPU は指定されたフェンス アドレスにフェンス データを書き込みます。 ただし、GPU がフェンス データをメモリに書き込む前に、フェンス命令の前にあるプリミティブのすべてのピクセルがインベントリから削除され、メモリに適切に書き込まれるようにする必要があります。

注意 GPU は、フェンス命令の前にあるプリミティブからの最後のピクセルがインベントリから削除されるまで待機している間、パイプライン全体をストールさせる必要はありません。GPU は、代わりにフェンス命令に従うプリミティブを実行できます。
 
GPU コンテキストごとの仮想アドレス空間をサポートするハードウェアでは、次の種類のフェンスをサポートする必要があります。
  • 通常のフェンス は、ユーザー モードで作成された DMA バッファーに挿入できるフェンスです。 ユーザー モードからの DMA バッファーの内容は信頼されないため、このような DMA バッファー内のフェンスは、物理アドレスではなく GPU コンテキスト アドレス空間内の仮想アドレスを参照する必要があります。 このような仮想アドレスへのアクセスは、GPU がアクセスする他の仮想アドレスと同じメモリ検証メカニズムによってバインドされます。
  • 特権フェンス は、カーネル モードで作成された (アクセス可能な) DMA バッファーにのみ挿入できるフェンスです。 このような DMA バッファー内のフェンスは、メモリ内の物理アドレスを指します。

    フェンスのターゲット アドレスにユーザー モードでアクセスできた場合、悪意のあるソフトウェアはフェンスのメモリ位置に対してグラフィックス操作を実行し、カーネルが受け取ると予想される内容の内容をオーバーライドする可能性があることに注意してください。

特権 DMA バッファーには、通常のフェンスと特権フェンスの両方を含めることができます。 ただし、特権 DMA バッファーに通常のフェンスが含まれている場合、このような DMA バッファーを生成したカーネル コンポーネントは、内部の通常のフェンスにアクセスできない可能性があることを認識します。

ディスプレイ ミニポート ドライバーが DMA バッファーの最後のフェンスを見逃した場合、ドライバーの DxgkDdiQueryCurrentFence 関数が呼び出されて、見落とされたフェンスが報告される可能性があります。 たとえば、ハードウェアがメモリへのフェンスを生成した場合、ドライバーの DxgkDdiInterruptRoutine 関数がトリガーされてメモリが読み取られます。 ただし、ドライバーがデータの読み取りを試みたときにフェンスのデータを使用できない場合 (たとえば、欠陥のあるチップセットがある場合)、通常、割り込みが停止されない限り、フェンスは次の割り込み時に報告されます。 割り込みが停止し、DirectX グラフィックス カーネル サブシステムがフェンスを待機しすぎる場合、サブシステムはドライバーの DxgkDdiQueryCurrentFence 関数を呼び出して現在のフェンスを検証し、見逃した可能性のある保留中のフェンスを特定します。

ディスプレイ ミニポート ドライバーが DxgkDdiQueryCurrentFence 呼び出しから戻る前に、最新のハードウェア完了送信フェンス識別子がまだ報告されていない場合、ドライバーはフェンスを報告するために、DxgkCbNotifyInterrupt 関数を呼び出す必要があります。 この機能を実装するために、ドライバーは次の操作を行います。

  1. オペレーティング システムに最後に報告されたフェンスを追跡します。
  2. IRQL をデバイスへの割り込みを発生させます。 IRQL を割り込みレベルに上げるために、ドライバーは、DxgkCbSynchronizeExecution 関数を呼び出して、DxgkDdiInterruptRoutine 関数と同期できます。
  3. デバイス割り込み IRQL で、最後に報告されたフェンスと、ハードウェアが完了した最新のフェンスを比較します。
  4. デバイス割り込み IRQL では、DxgkCbNotifyInterrupt 呼び出、最新のハードウェア完了フェンスが最後に報告されたフェンスより新しい場合にのみ呼び出されます。
DxgkDdiQueryCurrentFence ページング可能にする必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista
ターゲット プラットフォーム デスクトップ
ヘッダー d3dkmddi.h (D3dkmddi.h を含む)
IRQL PASSIVE_LEVEL

関連項目

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt する

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine