次の方法で共有


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

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

構文

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

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

パラメーター

[in] hAdapter

ディスプレイ アダプターに関連付けられているコンテキスト ブロックへのハンドル。 ディスプレイ ミニポート ドライバーは、DxgkDdiAddDevice 関数の MiniportDeviceContext 出力パラメーターの 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
対象プラットフォーム デスクトップ
Header d3dkmddi.h (D3dkmddi.h を含む)
IRQL PASSIVE_LEVEL

こちらもご覧ください

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine