DXGKDDI_SETVIDPNSOURCEADDRESS コールバック関数 (d3dkmddi.h)
DxgkDdiSetVidPnSourceAddress 関数は、特定のビデオ存在ソースに関連付けられているプライマリ サーフェスのアドレスを設定します。
構文
DXGKDDI_SETVIDPNSOURCEADDRESS DxgkddiSetvidpnsourceaddress;
NTSTATUS DxgkddiSetvidpnsourceaddress(
IN_CONST_HANDLE hAdapter,
IN_CONST_PDXGKARG_SETVIDPNSOURCEADDRESS pSetVidPnSourceAddress
)
{...}
パラメーター
hAdapter
ディスプレイ アダプターに関連付けられているコンテキスト ブロックへのハンドル。 ディスプレイ ミニポート ドライバーは、DxgkDdiAddDevice 関数の出力パラメーター ミニポートDeviceContext の DirectX グラフィックス カーネル サブシステムにこのハンドルを提供しました。
pSetVidPnSourceAddress
関数の引数を含む DXGKARG_SETVIDPNSOURCEADDRESS 構造体へのポインター。
戻り値
DxgkDdiSetVidPnSourceAddress 成功した場合、STATUS_SUCCESSを返します。それ以外の場合は、Ntstatus.hで定義されているエラー コードの 1 つを返します。
Windows 8 以降、ディスプレイ ミニポート ドライバーは、SharedPrimaryTransition メンバーが pSetVidPnSourceAddress->Flagsで設定されている場合に、DxgkDdiSetVidPnSourceAddress 呼び出しを失敗させ、STATUS_INVALID_PARAMETERを返すことができます。 ただし、ユーザー モード ドライバーの CheckDirectFlipSupport 関数の実装または DWM でエラーがない限り、このようなエラーは予想されません。 このようなエラーが発生した場合、オペレーティング システムはシームレスにコンポジション モードにフェールバックされず、プレゼンテーションが正しくありません。
備考
DxgkDdiSetVidPnSourceAddress は、現在コミットされているビデオ 提示ネットワーク (VidPN) トポロジに適合するプライマリでのみ呼び出されます。 たとえば、D3DDDIFMT_A8R8G8B8形式は、D3DDDIFMT_X8R8G8B8形式にコミットされた VidPN に適合すると判断されます。その逆も同様です。
DirectX グラフィックス カーネル サブシステム DxgkDdiSetVidPnSourceAddress を呼び出して、表示モードを切り替え、メモリ マップ I/O (MMIO) ベースのフリップ操作を実行します。 Flags のビット フィールド フラグは、pSetVidPnSourceAddress パラメーターによって指される DXGKARG_SETVIDPNSOURCEADDRESS 構造体のメンバー、実行する表示操作の種類を示します。 表示モードを切り替えるために、グラフィックス カーネル サブシステムは、DXGKARG_SETVIDPNSOURCEADDRESSの ContextCount メンバーを 0 に設定します。 この状況では、DXGKARG_SETVIDPNSOURCEADDRESS の Context メンバーが指定する配列の内容は未定義です。 フリップ操作を実行するために、グラフィックス カーネル サブシステムは、contextCount をコンテキストの数に設定し、フリップ操作に寄与するコンテキストのドライバー コンテキスト ハンドルの配列にコンテキスト を します。
ディスプレイ ミニポート ドライバーが以前に示した場合は、その 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 Media Player など) は、クローン ビューの状況を認識できず、予測可能な垂直同期間隔が必要です。 GPU スケジューラが両方のモニターの垂直同期を検出した場合、垂直同期間隔 (およびフリップ) は予測不可能であり、時間の経過と共にドリフトするため、DWM アプリケーションとビデオ アプリケーションが正しく動作しません。
複製ビューの状況では、ディスプレイ ミニポート ドライバーは、プライマリ モニターで垂直同期フリップを実行し、セカンダリ モニターで MMIO ベースの即時フリップを実行する必要があります。
ディスプレイ ミニポート ドライバーの DxgkDdiSetVidPnSourceAddress 関数は、グラフィックス アダプター オブジェクトで反転されているアドレスを記録する必要があります。
ディスプレイ ミニポート ドライバーがセカンダリ モニターの次の垂直方向のトレースを待機しないように指示するには、DirectX グラフィックス カーネル サブシステムは、ドライバーの DxgkDdiSetVidPnSourceAddress 関数の呼び出しで、FlipImmediate ビット フィールド フラグを TRUE 設定します。
マルチプレーン オーバーレイ VidPN プレゼンテーション でマルチプレーン オーバーレイを使用してこの関数呼び出す場合の要件を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows Vista |
ヘッダー | d3dkmddi.h |
IRQL | PASSIVE_LEVEL。 ドライバーが MMIO ベースのフリップをサポートしている場合、DIRQL で呼び出されます。 |
関連項目
DxgkCbNotifyDpcの
DxgkCbNotifyInterruptをする
DxgkDdiAddDeviceの
DxgkDdiSetVidPnSourceVisibilityの
DxgkDdiQueryAdapterInfoの