次の方法で共有


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

DxgkDdiSetVidPnSourceAddress 関数は、特定のビデオ存在ソースに関連付けられているプライマリ サーフェスのアドレスを設定します。

構文

DXGKDDI_SETVIDPNSOURCEADDRESS DxgkddiSetvidpnsourceaddress;

NTSTATUS DxgkddiSetvidpnsourceaddress(
  IN_CONST_HANDLE hAdapter,
  IN_CONST_PDXGKARG_SETVIDPNSOURCEADDRESS pSetVidPnSourceAddress
)
{...}

パラメーター

hAdapter

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

pSetVidPnSourceAddress

関数引数を含む DXGKARG_SETVIDPNSOURCEADDRESS 構造体へのポインター。

戻り値

DxgkDdiSetVidPnSourceAddress は、成功した場合STATUS_SUCCESSを返します。それ以外の場合は、 Ntstatus.h で定義されているエラー コードのいずれかを返します。

Windows 8以降、ディスプレイ ミニポート ドライバーは、pSetVidPnSourceAddress-Flags> で SharedPrimaryTransition メンバーが設定されている場合、dxgkDdiSetVidPnSourceAddress の呼び出しに失敗し、STATUS_INVALID_PARAMETERを返す可能性があります。 ただし、ユーザー モード ドライバーによる CheckDirectFlipSupport 関数の実装または DWM でエラーが発生しない限り、このようなエラーは発生しません。 このようなエラーが発生した場合、オペレーティング システムはシームレスにコンポジション モードにフェールバックされず、プレゼンテーションが正しくなくなります。

注釈

DxgkDdiSetVidPnSourceAddress は、現在コミットされているビデオ 提示ネットワーク (VidPN) トポロジに適合するプライマリでのみ呼び出されます。 たとえば、D3DDDIFMT_A8R8G8B8形式は、D3DDDIFMT_X8R8G8B8形式にコミットされた VidPN に適合すると判断され、その逆も同様です。

DirectX グラフィックス カーネル サブシステムは DxgkDdiSetVidPnSourceAddress を呼び出して表示モードを切り替え、メモリ マップ I/O (MMIO) ベースの反転操作を実行します。 pSetVidPnSourceAddress パラメーターによって指されるDXGKARG_SETVIDPNSOURCEADDRESS構造体の Flags メンバーのビット フィールド フラグは、実行する表示操作の種類を示します。 表示モードを切り替えるために、グラフィックス カーネル サブシステムは、DXGKARG_SETVIDPNSOURCEADDRESS の ContextCount メンバーを 0 に設定します。 この場合、 DXGKARG_SETVIDPNSOURCEADDRESSの Context メンバーが指定する配列の内容は未定義です。 反転操作を実行するために、グラフィックス カーネル サブシステムは ContextCount を コンテキストの数に設定し、 Context を 反転操作に寄与するコンテキストのドライバー コンテキスト ハンドルの配列に設定します。

ディスプレイ ミニポート ドライバーが以前に示した場合、DxgkDdiQueryAdapterInfo 関数の呼び出しで、MMIO ベースのフリップをサポートします (DXGK_DRIVERCAPS構造体の FlipCaps メンバーの FlipOnVSyncMmIo ビット フィールド フラグを TRUE に設定することで)、ドライバーの DxgkDdiSetVidPnSourceAddress 関数は、その後、反転のためにデバイス割り込み要求レベル (DIRQL) で呼び出されます。 ドライバーの DxgkDdiSetVidPnSourceAddress 関数は、DAC をプログラムし、次の垂直同期で、DXGKARG_SETVIDPNSOURCEADDRESS の PrimaryAddress メンバーでアドレスが指定されているプライマリ サーフェスのスキャンを開始する必要があります。 また、ドライバーは、有効なスキャン アドレスを報告するために、DxgkCbNotifyInterrupt 関数の呼び出しで InterruptType パラメーターにDXGK_INTERRUPT_CRTC_VSYNC割り込みの種類を渡す必要があります。 ドライバーは、DxgkCbNotifyDpc 関数の呼び出しで DxgkCbNotifyInterrupt の呼び出しに従う必要があります。

DxgkDdiSetVidPnSourceAddress は、非ページ メモリに存在する必要があります。 DxgkDdiSetVidPnSourceAddress は、ページング可能メモリ内のコードを呼び出す必要があり、ページング可能メモリ内のデータを操作してはなりません。

Clone-View の状況

複製ビューの状況では、ディスプレイ ミニポート ドライバーは、このセクションで説明するように適切に反転操作を処理する必要があります。

DWM が実行されている場合、垂直方向の同期が発生すると、DirectX グラフィックス カーネル サブシステムが反転同期されます。 ただし、DirectX グラフィックス カーネル サブシステムは、1 つのグラフィックス アダプターの出力信号の垂直方向の同期が発生した場合にのみ同期できます。 DirectX グラフィックス カーネル サブシステムは、引き裂かないように、他のグラフィックス アダプターの出力信号を直ちに反転させる必要があります。

GPU スケジューラは、1 つの垂直同期を検出し、最初のモニターの反転が発生するとすぐに反転サーフェスが使用可能であると判断します。 その結果、ディスプレイ ミニポート ドライバーは、2 番目のモニターがまだ表示されているサーフェスにレンダリングされている可能性があります。

ビデオ アプリケーション (たとえば、Windows メディア プレーヤー) は、複製ビューの状況を認識できず、予測可能な垂直同期間隔が必要です。 GPU スケジューラが両方のモニターの垂直同期を検出した場合、垂直同期間隔 (したがって反転) は予測できず、時間の経過と共にドリフトするため、DWM アプリケーションとビデオ アプリケーションが正しく動作しません。

複製ビューの状況では、ディスプレイ ミニポート ドライバーはプライマリ モニターで垂直同期反転を実行し、セカンダリ モニターで MMIO ベースの即時反転を実行する必要があります。

ディスプレイ ミニポート ドライバーの DxgkDdiSetVidPnSourceAddress 関数は、グラフィックス アダプター オブジェクトでに反転されているアドレスを記録する必要があります。

ディスプレイ ミニポート ドライバーがセカンダリ モニターの次の垂直方向のトレースを待機しないように指示するには、DirectX グラフィックス カーネル サブシステムは、ドライバーの DxgkDdiSetVidPnSourceAddress 関数の呼び出しで FlipImmediate ビット フィールド フラグを TRUE に設定します。

マルチプレーン オーバーレイ VidPN プレゼンテーションのマルチプレーン オーバーレイを使用してこの関数を呼び出す場合の要件を参照してください。

要件

要件
サポートされている最小のクライアント Windows Vista
Header d3dkmddi.h
IRQL PASSIVE_LEVEL。 ドライバーが MMIO ベースの反転をサポートしている場合は、DIRQL で呼び出されます。

こちらもご覧ください

DXGK_DRIVERCAPS

DXGKARG_SETVIDPNSOURCEADDRESS

DxgkCbNotifyDpc

DxgkCbNotifyInterrupt

DxgkDdiAddDevice

DxgkDdiSetVidPnSourceVisibility

DxgkDdiQueryAdapterInfo