Cofunctional VidPN ソースおよびターゲット モードの列挙
このトピックでは、ビデオ プレゼント ネットワーク (VidPN) マネージャーとディスプレイ ミニポート ドライバーが連携して、ビデオ プレゼント ソースとターゲットで使用できるモードを列挙する方法について説明します。 この資料を読む前に、以下のトピックの資料を確認しておく必要があります。
時々、VidPN マネージャーは、ディスプレイ ミニポート ドライバーに、ディスプレイ アダプターのビデオ プレゼンテーション ソースとターゲットで使用できるモードを列挙するように要求します。 通常、要求には次のパターンがあります。
VidPN マネージャーは、ソースとターゲットのすべてではなく、一部にモードが固定されている VidPN を作成または取得します。
VidPN マネージャーは DxgkDdiIsSupportedVidPn を呼び出して、ディスプレイ アダプターでサポートされている機能的な VidPN を形成するために VidPN を拡張できるかどうかを判断します。 つまり、これは、既存の固定モードを変更せずに、再メイン ソースとターゲットに、モードをピン留めできるかどうかを確認します。
VidPN マネージャーは、 DxgkDdiEnumVidPnCofuncModality を呼び出して、まだ固定モードがないソースとターゲットで使用できるモードを取得します。
DxgkDdiEnumVidPnCofuncModality に渡される引数の 1 つは、制約 VidPN と呼ばれる VidPN オブジェクトへのハンドルです。
DxgkDdiEnumVidPnCofuncModality は、次のことを行う必要があります。
制約のある VidPN を検査します。
固定モードを持たない各ソースとターゲットで、モードセットを調整し、制約と共存する最大のモードセットとなるようにします。
固定スケーリング変換がないパスごとに、スケーリング サポート フラグを調整し、制約と共存するようにします。
固定されたローテーション変換を持たない各パスについて、ローテーションサポート フラグを調整して、コンストレイントと共存するようにします。
固定モードを持つソースごとに、そのソースで使用できるマルチサンプリング方法を報告します。
次の段落では、前の箇条書きの各タスクの実行方法について、詳しく説明します。
制約のある VidPN の検査
制約 VidPN の次のプロパティは、 DxgkDdiEnumVidPnCofuncModalityによって従わなければならない制約です。
トポロジー (ソースとターゲットの間のアソシエーションのセット)
固定されたモード
スケーリング、スケーリングのサポート、ローテーション、および各パスのローテーションのサポート
各パスのターゲット カラーベース
各パスのターゲット色係数ダイナミック レンジ
各パスのコンテンツ タイプ (グラフィックまたはビデオ)
各パスのガンマ ランプ
制約付き VidPN から制約を抽出するには、次の手順に従います。
まず、 pfnGetTopology 関数を呼び出して、制約する VidPN のトポロジを表す VidPN トポロジ インターフェイス へのポインターを取得します。
pfnAcquireFirstPathInfo 関数と pfnAcquireNextPathInfo 関数を呼び出して、制約 VidPN のトポロジ内の各パスに関する情報を取得します。 特定のパスに関する情報 (ソース ID、ターゲット ID、スケーリング変換、ローテーション変換、ターゲット カラー ベースなど) は、 D3DKMDT_VIDPN_PRESENT_PATH 構造体に含まれています。
パスごとに、パスのソース ID を pfnAcquireSourceModeSet 関数に渡して、パスのソースを取得します。
pfnAcquirePinnedModeInfo 関数を呼び出して、ソースのモード セットに固定されているモード (存在する場合) を決定します。 ソースのモード セットに固定モードがある場合、セット内の残りのモードを調べる必要はおそらくありません。 モード セットにピン留めモードがない場合は、 pfnAcquireFirstModeInfo と pfnAcquireNextModeInfo を呼び出して、セット内の残りのモードを調べます。
同様の手順を使用して、ターゲット・モード・セットを調べ、どのターゲット・モード・セットに固定モードがあるかを判別します。
モード セットの調整
制約 VidPN のトポロジでソースとターゲットに関連付けられているモード セットを調べるときは、どのモード セットに固定モードがあるかをメモします。 モード セットに固定モードがない場合は、調整が必要かどうかを判断します。 モード セットに制約と共存しないモードが含まれている場合、または、制約と共機能する使用可能なモードがない場合は、モード セットを調整する必要があります。
モニターが接続されているビデオ表示ターゲットの場合は、モニターでサポートされているモードのセットも考慮する必要があります。 ディスプレイ アダプター上のビデオ表示ターゲットが特定のモードをサポートしている場合でも (制約がある場合)、接続されているモニターも、そのモードをサポートしている場合は、ターゲットのモード セットにそのモードを一覧表示する必要があります。 接続されているモニタでサポートされているモードを確認するには、次の手順に従います。
-
pfnAcquireMonitorSourceModeSet を呼び出します。 モード セットの調整の必要がない場合は、そのままにしておくことができます。 モード セットを調整する必要がある場合は、新しいモード セットを作成し、既存のモード セットを新しいモード セットに置き換える必要があります。
-
新しいソース モード セットを作成して設定するには、 pfnCreateNewSourceModeSet を呼び出します。
_DXGK_VIDPNSOURCEMODESET_INTERFACE
次に、 pfnCreateNewModeInfo と pfnAddModeを呼び出します。
-
最後に、 pfnAssignSourceModeSet を呼び出して、既存のソース モード セットを新しいソース モード セットに置き換えます。
スケーリング サポート フラグの調整
制約 VidPN のトポロジ内の各パスについて、パスに固定スケーリング変換があるかどうかを判断します。 その判断を下すには、 vpnPath.ContentTransformation.Scaling、(vpnPath はパスを表す D3DKMDT_VIDPN_PRESENT_PATH 構造体) を調べます。 vpnPath.ContentTransformation.Scaling が D3DKMDT_VPPS_IDENTITY、 D3DKMDT_VPPS_CENTERED、 D3DKMDT_VPPS_STRETCHED に設定されている場合、パスのスケーリング変換が固定されます。 それ以外の場合、スケーリング変換は固定されません。
パスに固定スケーリング変換がない場合は、パスのスケーリング サポート フラグを調整する必要があるかどうかを判断します。 サポート フラグは、制約と共機能しないスケーリングの種類のサポートを示している場合、または、制約と共機能しているスケーリングの種類のサポートを示さない場合、調整する必要があります。 スケーリング サポート フラグを変更するには、フラグを保持する D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT 構造体のメンバーを設定します。
ローテーションサポートフラグの調整
パスのローテーションサポートフラグの調整は、パスのスケーリング サポート フラグの調整と似ています。 vpnPath が D3DKMDT_VIDPN_PRESENT_PATH 構造であるとします。 vpnPath.ContentTransformation.Rotation が D3DKMDT_VPPR_IDENTITY、 D3DKMDT_VPPR_ROTATE90、 D3DKMDT_VPPR_ROTATE180、 D3DKMDT_VPPR_ROTATE270 に設定されている場合、パスのローテーション変換が固定されます。 それ以外の場合、ローテーション変換は固定されません。 ローテーション サポート フラグは vpnPath.ContentTransformation.RotationSupportです。
マルチサンプリング方法の報告
ディスプレイ アダプターに、マルチサンプリングによるアンチエイリアシングが可能なビデオ出力コーデックが 1 つ以上ある場合は、使用可能なマルチサンプリング方法について、ピン留めモードを持つソースごとに報告する必要があります (制約がある場合)。 使用可能なマルチサンプリング方法をレポートするには、次の手順を実行します。
- D3DDDI_MULTISAMPLINGMETHOD 構造体の配列を作成する
- 配列を VidPNインターフェイスの関数 pfnAssignMultisamplingMethodSet 関数に渡します。
D3DDDI_MULTISAMPLINGMETHOD 構造体には、マルチサンプリング手法を特徴付ける 2 つのメンバーがあり、これらを設定する必要があります。 NumSamples メンバーは、サンプリングされるサブピクセルの数を示します。 NumQualityLevels メンバーは、メソッドが操作できる品質レベルの数を示します。 レベルを上げるたびに、表示される画像の品質が大幅に向上する限り、品質レベルはいくつでも指定できます。
列挙ピボット
前述のように、 DxgkDdiEnumVidPnCofuncModality は、 hConstrainingVidPn パラメーターで渡された VidPN と共機能するモード セットを作成する必要があります。 場合によっては、 DxgkDdiEnumVidPnCofuncModality は、 EnumPivotType および EnumPivot パラメーターで渡される追加情報 (列挙ピボット) に従って動作を強化する必要があります。
列挙ピボットは、次のいずれかになります。
特定のビデオ プレゼンテーション ソースのモード セット
特定のビデオ プレゼン ターゲットのモード セット
特定の VidPN 現在パスのスケーリング変換
特定の VidPN 現在パスのローテーション変換
列挙ピボットがモード セットの場合、 DxgkDdkEnumVidPnCofuncModality は、そのモード セットを変更しないままにする必要があります。 列挙ピボットがパスのスケーリング (ローテーション) 変換である場合、 DxgkDdiEnumVidPnCofuncModality は、そのパスのスケーリング (ローテーション) サポート フラグを変更してはなりません。