次の方法で共有


DXGKDDI_SYSTEM_DISPLAY_ENABLEコールバック関数 (dispmprt.h)

OS は、カーネル モード ディスプレイ ドライバー (KMD) DxgkddiSystemDisplayEnable 関数を呼び出して、KMD が現在のディスプレイ デバイスを指定された状態にリセットするように要求します。

構文

DXGKDDI_SYSTEM_DISPLAY_ENABLE DxgkddiSystemDisplayEnable;

NTSTATUS DxgkddiSystemDisplayEnable(
  [in]  PVOID MiniportDeviceContext,
  [in]  D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
  [in]  PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS Flags,
  [out] UINT *Width,
  [out] UINT *Height,
  [out] D3DDDIFORMAT *ColorFormat
)
{...}

パラメーター

[in] MiniportDeviceContext

ディスプレイ アダプターに関連付けられているコンテキスト ブロックへのハンドル。 KMD の DxgkDdiAddDevice 関数は、以前に Dxgkrnlを するためにこのハンドルを提供しました。

[in] TargetId

ディスプレイ デバイスが接続されているディスプレイ アダプター上のビデオ存在ターゲットの識別子を指定する D3DDDI_VIDEO_PRESENT_TARGET_ID 値。 この識別子は、DxgkDdiCommitVidPnへの前回の呼び出し中に現在のビデオ 現在のネットワーク (VidPn) 状態に残されたターゲットを対象にすることができます。

[in] Flags

フラグのビットごとの OR を含む DXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS 値へのポインター。 このメンバーは OS によって予約されています。

[out] Width

指定したデバイスの表示モードの幅 (ピクセル単位)。

[out] Height

指定したデバイスの表示モードの高さ (ピクセル単位)。

[out] ColorFormat

表示デバイスの色形式を指定する D3DDDIFORMAT 値へのポインター。

戻り値

DxgkDdiSystemDisplayEnable 成功した場合、STATUS_SUCCESSを返します。 TargetId パラメーターで指定されたターゲットがディスプレイ デバイスに接続されていない場合、関数はSTATUS_NOT_SUPPORTEDを返します。 それ以外の場合は、Ntstatus.hで定義されているエラー コードのいずれかを返します。

備考

OS は、システム停止エラーの後のバグチェック操作中 DxgkddiSystemDisplayEnable を呼び出します。

KMD で必要な手順

KMD は、DxgkDdiSystemDisplayEnable 関数が呼び出されたときに、次の手順に従う必要があります。

  1. すべての GPU 操作をキャンセルするか、GPU をアイドル状態にリセットします。
  2. OS は、TargetId パラメーターを使用して、ビデオの現在のターゲットを示します。 ドライバーは、このターゲットに関連付けられているディスプレイの電源をオンにし、表示したままにする必要があります。 ドライバーがディスプレイの電源をオンにできない場合は、この関数の呼び出しに失敗する必要があります。 このようなエラーが発生した場合、OS は DxgkDdiResetDevice 呼び出し、システムのバグチェックが発生する可能性があります。
  3. このターゲットに関連付けられているディスプレイの接続を確認します。 ターゲットにディスプレイが接続されていない場合、ドライバーはこの関数の呼び出しを完了し、STATUS_NOT_SUPPORTEDエラー コードを返す必要があります。
  4. ディスプレイ アダプターに接続されている他のすべてのディスプレイへの信号を無効にします。 これが不可能な場合、ドライバーは他のすべてのディスプレイに空白の画像を配置する必要があります。 これが不可能な場合、ドライバーは画面の最後の画像を変更せずに残す必要があります。
  5. 指定されたターゲットで現在の表示モードを維持し、このモードをこの関数呼び出しの一部として OS に戻します。
  6. ドライバーが現在の表示モードを維持できない場合、またはターゲットがアクティブ トポロジの一部でない場合、ドライバーは、1 ピクセルあたり 24 ビットの形式で 640 x 480 ピクセル以上の表示解像度が可能な別のターゲットにフレーム バッファーを設定する必要があります。 これが不可能な場合、ドライバーはこの関数呼び出しに失敗する可能性があります。これにより、システムのバグチェックと黒い画面の表示が発生します。

KMD では、線形フレーム バッファー モードを使用する必要はありません。 ただし、KMD では、D3DDDIFORMAT 列挙型の D3DDDIFMT_A8R8G8B8 形式のソースからこのフレーム バッファーへの書き込み操作をサポートする必要があります。

ソース イメージの制限

KMD によって表示機能が OS によって制御されると、OS は DxgkDdiSystemDisplayWrite 関数を呼び出して画面イメージを更新し、指定されたソースから、DxgkDdiSystemDisplayEnable 関数によってリセットされた画面にイメージのブロックを書き込むことができます。

DxgkDdiSystemDisplayWrite 、ソース イメージの開始アドレスとストライド、幅、高さをドライバーに提供します。 ソース イメージの色形式は常に D3DDDIFMT_X8R8G8B8。 OS では、ソース イメージが非ページ メモリ内にあることを保証します。

KMD は、DxgkDdiSystemDisplayWrite 関数の PositionX および PositionY パラメーターで指定された位置から現在の画面にこのソース イメージを書き込む必要があります。

CPU を使用してソースからフレーム バッファーにイメージを書き込むには、GPU が不明な状態になるインスタンス タイムアウトの検出と回復 (TDR) が繰り返し発生する可能性があるため、ドライバーがイメージをフレーム バッファーに書き込むことをお勧めします。

ページ以外のメモリを使用する

この関数が呼び出されている間は、Windows カーネル モード関数を使用できない場合があります。

DxgkDdiSystemDisplayEnable は任意の IRQL で呼び出すことができるため、非ページ メモリ内に存在する必要があります。 DxgkDdiSystemDisplayEnable 、ページング可能メモリ内のコードを呼び出す必要はありません。また、ページング可能メモリ内のデータを操作してはなりません。

ディスプレイの自動切り替え

自動ディスプレイ スイッチ ドライバーの DxgkDdiSystemDisplayEnable DDI は、その呼び出しの終了時にパネル自己更新 (PSR) が無効になっていることを確認する必要があります。 詳細については、「自動表示スイッチの」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows 8 (WDDM 1.2)
サポートされる最小サーバー Windows Server 2012
ターゲット プラットフォーム の デスクトップ
ヘッダー dispmprt.h
IRQL 任意のレベル (「解説」セクションを参照)

関連項目

D3DDDIFORMAT

DxgkCbAcquirePostDisplayOwnership の

DxgkDdiAddDevice の

DxgkDdiCommitVidPn を する

DxgkDdiResetDevice の

DxgkDdiStopDeviceAndReleasePostDisplayOwnership

DxgkDdiSystemDisplayWrite の