D3DKMTPresent 関数 (d3dkmthk.h)

D3DKMTPresent 関数は、Microsoft DirectX グラフィックス カーネル サブシステム (Dxgkrnl.sys) に現在のコマンドを送信します。

構文

NTSTATUS D3DKMTPresent(
  [in] D3DKMT_PRESENT *unnamedParam1
);

パラメーター

[in] unnamedParam1

pData: 提示するパラメーターを記述する D3DKMT_PRESENT 構造体へのポインター。

戻り値

D3DKMTPresent は、次のいずれかの値など、NTSTATUS 値を返します。

リターン コード 説明
STATUS_SUCCESS 現在は正常に実行されました。
STATUS_DEVICE_REMOVED グラフィックス アダプターが停止したか、表示コンテキストがリセットされました。
STATUS_INVALID_PARAMETER パラメーターが検証され、正しくないと判断されました。
STATUS_NO_MEMORY メモリ不足のため、D3DKMTPresent を完了できませんでした。
STATUS_GRAPHICS_ALLOCATION_INVALID 表示モードの変更により、プライマリ サーフェス ハンドルが無効になりました。 OpenGL インストール可能クライアント ドライバー (ICD) がこのエラー コードを受け取った場合は、プライマリ ハンドルを再度開くか再作成し、コマンド バッファー内のすべての参照を新しいハンドルで古いハンドルに置き換えてから、バッファーを再送信する必要があります。
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE D3DKMT_PRESENT の hContext メンバーが指定するレンダリング デバイス コンテキストでエラー 発生しました。

注意

STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE エラー コードは、タイムアウト検出および回復 (TDR) プロセスの開始、または GPU が応答を停止したことを示していません。 たとえば、DirectX グラフィックス カーネル サブシステムは、ディスプレイ ミニポート ドライバーがこのデバイスから送信された DMA バッファーでエラーが発生したことを示した場合、または DMA バッファーを分割した後でも DMA バッファーに必要なすべての割り当てをビデオ メモリ マネージャーがページングできなかった場合に、デバイスをエラー状態にします。 デバイスがエラー状態になると、それ以上操作を実行できず、破棄して再作成する必要があります。 ICD は D3DKMTGetDeviceState 関数を呼び出して、エラーのより正確な理由を判断できます。

注釈

D3DKMTPresent 関数は、パラメーター値の組み合わせ (つまり、pData が指すD3DKMT_PRESENT構造体のメンバーの値) に応じて、STATUS_INVALID_PARAMETERを返す場合があります。 次の一覧では、 D3DKMTPresent が PARAMETER STATUS_INVALID返される可能性があるパラメーター値の最も一般的な組み合わせについて説明します。

  • hDestination メンバーは NULL 以外であり、次の条件の少なくとも 1 つが true です。

    • pSrcSubRects メンバーは NULL です
    • SubRectCnt メンバーは 0 です。
    • Flags メンバーの Blt ビット フィールド フラグが設定されていません。
    • FlagsSrcRectValid ビット フィールド フラグが設定されていません。
    • FlagsColorFill ビット フィールド フラグが設定されています。
    • FlagsFlipFlipDoNotFlipFlipDoNotWait、または FlipRestart ビット フィールド フラグが設定されています。
    • FlagsSrcColorKey または DstColorKey ビット フィールド フラグが設定されています。
    • hSource メンバーは hDestination と同じです。
    • ソースと宛先はプライマリ サーフェスではありません。
  • FlagsFlip ビット フィールド フラグが設定され、次の条件のうち少なくとも 1 つが true になります。

    • FlagsColorFill ビット フィールド フラグが設定されています。
    • FlagsBlt ビット フィールド フラグが設定されています。
    • FlagsSrcColorKey または DstColorKey ビット フィールド フラグが設定されています。
    • FlagsSrcRectValid または DstRectValid ビット フィールド フラグが設定されています。
    • Flags の [ビット フィールドの回転] フラグが設定されています。
    • Flagsの RestrictVidPnSource ビット フィールド フラグが設定されています。
    • ソースはプライマリ サーフェスではありません。
    • ディスプレイ ミニポート ドライバーは、 FlipInterval メンバーが指定する反転間隔をサポートしていません。
    • D3DKMTSetDisplayMode 関数は以前に呼び出されませんでした。
  • FlagsColorFill ビット フィールド フラグが設定され、次のいずれかの条件が満たされます。

    • pSrcSubRectsNULL です
    • SubRectCnt は 0 です。
    • FlagsBlt ビット フィールド フラグが設定されています。
    • FlagsFlipFlipDoNotFlipFlipDoNotWait、または FlipRestart ビット フィールド フラグが設定されています。
    • FlagsSrcColorKey または DstColorKey ビット フィールド フラグが設定されています。
    • FlagsSrcRectValid ビット フィールド フラグが設定されています。
  • FlagsBlt ビット フィールド フラグが設定され、次のいずれかの条件が満たされます。

    • pSrcSubRectsNULL です
    • SubRectCnt は 0 です。
    • FlagsColorFill ビット フィールド フラグが設定されています。
    • FlagsFlipFlipDoNotFlipFlipDoNotWait、または FlipRestart ビット フィールド フラグが設定されています。

Blit スタイルの D3DKMTPresent を呼び出すユーザー モードのグラフィックス ドライバーで、 Blt ビット フィールド フラグが 設定されている Flags が設定されている場合は、提示元のコンテキストに以前に送信されたすべての作業が完全にドレイン可能になるように特別な注意を払う必要があります。 これを行わないと、アプリケーション自体がデッドロックしたり、コーナーケースで現在のユーザー デスクトップがデッドロックしたりする可能性があります。 対応するシグナルが既に GPU スケジューラ データベースにキューに入れられ、そのシグナル自体が別の不可解な待機の背後にない GPU 同期オブジェクトでの待機のみが含まれている場合、コンテキストは完全にドレイン可能です。 つまり、システム内のすべてのプロセスのユーザー空間が D3DKMTPresent の呼び出しの直後に一時停止された場合、GPU スケジューラに既にキューに置かれた依存レンダリング チェーンのレンダリングが完了すると、待機は満たされます。 ドライバーは、GPU 待機に依存するコンテキストに存在する blit を呼び出す必要はありません。これは現在満たされておらず、このプロセスまたは別のプロセスから発生した後の操作によって満たされることが想定されています。

次のコード例は、OpenGL ICD で D3DKMTPresent を使用してデータを表示する方法を示しています。

HRESULT Present(D3DKMT_HANDLE hDevice, 
                HWND hWnd, 
                RECT* pSrcRect,
                 RECT* pDstRect)
{
    D3DKMT_PRESENT PresentData = {0};

    PresentData.hDevice = hDevice;
    PresentData.Flags.Blt = 
    PresentData.Flags.DstRectValid = 
    PresentData.Flags.SrcRectValid = TRUE;
    PresentData.hWindow = hWnd;
    PresentData.DstRect = *pDstRect;
    PresentData.SrcRect = *pSrcRect;
    PresentData.SubRectCnt = 1;  
    PresentData.pSrcSubRects = pSrcRect; 

    if (NT_SUCCESS((*pfnKTPresent)(&PresentData))) {
        return S_OK;
    }
    return E_FAIL;
}

要件

要件
サポートされている最小のクライアント Windows Vista
対象プラットフォーム ユニバーサル
Header d3dkmthk.h (D3dkmthk.h を含む)
Library Gdi32.lib
[DLL] Gdi32.dll

こちらもご覧ください

D3DKMTGetDeviceState

D3DKMTSetDisplayMode

D3DKMT_PRESENT