次の方法で共有


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

DxgkDdiPresent 関数は、ソース割り当てからプライマリ サーフェス (および画面外システム メモリ割り当て) にコンテンツをコピーします。

構文

DXGKDDI_PRESENT DxgkddiPresent;

NTSTATUS DxgkddiPresent(
  [in]     IN_CONST_HANDLE hContext,
  [in/out] INOUT_PDXGKARG_PRESENT pPresent
)
{...}

パラメーター

[in] hContext

コピー情報のデバイス コンテキストへのハンドル。 ディスプレイ ミニポート ドライバーの DxgkDdiCreateContext 関数は、DxgkDdiCreateContextpCreateContext パラメーターが指すDXGKARG_CREATECONTEXT構造体の hContext メンバーで、このハンドルを以前に返しました。

ドライバーがコンテキストの作成をサポートしていない場合、Microsoft DirectX グラフィックス カーネル サブシステムは、コンテキストへのハンドルをデバイスへのハンドルに置き換えます。 ディスプレイ ミニポート ドライバーの DxgkDdiCreateDevice 関数は、DxgkDdiCreateDevicepCreateDevice パラメーターが指す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 操作をクリップできます。
上記のシナリオは非同期的に変更される可能性があるため、ユーザー モードのディスプレイ ドライバーは、ディスプレイ ミニポート ドライバーの DxgkDdiPresent 関数のハードウェア命令を事前にコンパイルできません。 ディスプレイ ミニポート ドライバーは、実際の DxgkDdiPresent 操作のハードウェア コマンドを作成する必要があり、出力 DMA バッファーに配置する必要があります。 ディスプレイ ミニポート ドライバーの DxgkDdiPresent 関数を呼び出して DMA バッファーを生成した後、オペレーティング システムは、そのバッファーがレンダリングされる前にシナリオの変更が発生しないことを保証します。

ディスプレイ ミニポート ドライバーは、ドライバーが次の抽象化をサポートしている限り、上記のシナリオの詳細を認識する必要はありません。

  • ビデオ メモリ ソースからプライマリ ビデオまたはシステム メモリ変換先へのコピー操作、オフスクリーン システム メモリ ソースからプライマリ宛先へのコピー、プライマリソースとの間のコピー、またはプライマリ ソースからオフスクリーン システム メモリへのコピーでは、ソースは pPresentent 構造体の pAllocationList[DXGK_PRESENT_SOURCE_INDEX] 配列要素 DXGKARG_PRESENThDeviceSpecificAllocation メンバーによって指定されます。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
すべての DxgkDdiPresent シナリオが正しく動作するには、ディスプレイ ミニポート ドライバーの DxgkDdiCreateDevice 関数は、ディスプレイまたは画面外のターゲットに少なくとも 1 つの RECT 四角形を表示するために必要なハードウェア コマンドを保持するのに十分な大きさにDXGK_DEVICEINFO構造体の DmaBufferSize メンバーを設定する必要があります。 ただし、ドライバーの DxgkDdiPresent 関数は、DxgkDdiPresent シナリオのサブrectanglesの数が現在の DMA バッファーを使い果たし、ドライバーが続行するために別の DMA バッファーを必要とする場合は、STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFERを返すことができます。

グラフィックス サブシステムは、新しい 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 に対して事前修正プログラムが適用された情報が提供されます。

メモ ドライバーの DxgkDdiPresent 関数は DMA バッファーに事前修正プログラムを適用する場合でも、DXGKARG_PRESENTの pPatchLocationListOut メンバーが指定する出力パッチの場所の一覧に割り当てへのすべての参照 挿入する必要があります。 DMA バッファーが GPU に送信される前に割り当てのアドレスが変更される可能性があるため、ドライバーは、これらの参照を挿入する必要があります。したがって、DirectX グラフィックス カーネル サブシステムは DxgkDdiPatch 関数を呼び出して DMA バッファーを再パッチします。
 
ドライバーが回転をサポートしている場合 (つまり、DxgkDdiEnumVidPnCofuncModality 関数の呼び出しで、D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION構造体の RotationSupport メンバーの回転モードのサポートを報告します)、ドライバーはソースから宛先へのローテーションされたビット ブロック転送 (bitblt) を実行できる必要があります。 DXGKARG_PRESENTの Flags メンバーのDXGK_PRESENTFLAGS構造体で Rotate ビット フィールド フラグが指定されている場合、ドライバーは回転していないサーフェスから現在のソースの最終方向に向かうかのように回転を適用する必要があります。

ソースのプライマリ割り当ては、 DxgkDdiCommitVidPn 関数で指定されます。 指定されたソース (複製モード) から複数のパスが生成された場合、ディスプレイ ミニポート ドライバーは、異なるターゲットのパス回転モードを指定して、出力が正しく回転されていることを確認する必要があります。 DxgkDdiPresent に指定されるすべてのパラメーターは、回転に依存しません。 ソースとターゲットの両方の四角形は、クライアントが認識する画面全体になります (たとえば、768 x 1024)。

メモ この状況では、回転モードの全画面表示 Direct3D アプリケーションには対応していません。
 
ディスプレイ ミニポート ドライバーが以前に示した場合、DxgkDdiQueryAdapterInfo 関数の呼び出しで、メモリ マップ I/O (MMIO) ベースのフリップ (DXGK_DRIVERCAPS構造体の FlipCaps メンバーの FlipOnVSyncMmIo ビット フィールド フラグを TRUE に設定することによって) をサポートしている場合、ドライバーの DxgkDdiPresent 関数は、その後、DXGKARG_PRESENTNULL に設定された pDmaBuffer メンバーを使用して呼び出されます。MMIO ベースのフリップでは、GPU 上で実行する DMA バッファーは必要ないためです。 代わりに、ドライバーの DxgkDdiPresent 関数は、必要に応じてソース サーフェスとプログラム フリップ ハードウェアを検証する必要があります。 DirectX グラフィックス カーネル サブシステムは、ドライバーの DxgkDdiSetVidPnSourceAddress 関数を呼び出して、この種類のフリップを実行します。

DxgkDdiPresent を ページング可能にする必要があります。

要件

要件
サポートされている最小のクライアント Windows Vista
対象プラットフォーム デスクトップ
Header d3dkmddi.h
IRQL PASSIVE_LEVEL

こちらもご覧ください

D3DDDIFORMAT

DXGKARG_CREATECONTEXT

DXGKARG_PRESENT

DXGK_DEVICEINFO

DXGK_DRIVERCAPS

DXGK_PRESENTFLAGS

DxgkDdiCommitVidPn

DxgkDdiCreateContext

DxgkDdiCreateDevice

DxgkDdiEnumVidPnCofuncModality

DxgkDdiPatch

DxgkDdiQueryAdapterInfo