ディスプレイ アダプターの子デバイスの列挙
次の一連の手順では、ディスプレイ ポート ドライバー、ディスプレイ ミニポート ドライバー、ビデオ表現ネットワーク (VidPN) マネージャーが、初期化時に連携してディスプレイ アダプターの子デバイスを列挙する方法について説明します。
ディスプレイ ポート ドライバーは、ディスプレイ ミニポート ドライバーの DxgkDdiStartDevice 関数を呼び出します。 DxgkDdiStartDevice は、(NumberOfChildren パラメーター内で) ディスプレイ アダプターの子である (または、ドッキングによって取得される可能性がある) デバイスの数を返します。 DxgkDdiStartDevice は、(NumberOfVideoPresentSources パラメーター内で) ディスプレイ アダプターでサポートされているビデオ表現ソースの数 N も返します。 これらのビデオ表現ソースは、その後、数値 0、1、... N -1 で識別されます。
ディスプレイ ポート ドライバーは、ディスプレイ ミニポート ドライバーの DxgkDdiQueryChildRelations 関数を呼び出します。この関数は、ディスプレイ アダプターの子デバイスを列挙します。 DxgkDdiQueryChildRelations は、DXGK_CHILD_DESCRIPTOR 構造体の配列 (子デバイスごとに 1 つ) を格納します。 ディスプレイ アダプターのすべての子デバイスはオンボードであり、ディスプレイ アダプターに接続するモニターやその他の外部デバイスは子デバイスとは見なされないことに注意してください。 詳細については、「ディスプレイ アダプターの子デバイス」を参照してください。 DxgkDdiQueryChildRelations は、潜在的な子デバイスと、初期化時に物理的に存在する子デバイスを列挙する必要があります。 たとえば、ラップトップ コンピューターをドッキング ステーションに接続すると新しいビデオ出力が表示される場合、DxgkDdiQueryChildRelations は、コンピューターが初期化時にドッキングされているかどうかに関係なく、そのビデオ出力を列挙する必要があります。 また、ドングルをビデオ出力コネクタに接続すると、複数のモニターがコネクタを共有できる場合、DxgkDdiQueryChildRelations は、ドングルが初期化時に接続されているかどうかに関係なく、ドングルの分岐ごとに子デバイスを列挙する必要があります。
HPD 認識値が HpdAwarenessInterruptible または HpdAwarenessPolled の各子デバイス (手順 1 で説明されているように列挙) に対して、ディスプレイ ポート ドライバーは、ディスプレイ ミニポート ドライバーの DxgkDdiQueryChildStatus 関数を呼び出して、子デバイスに外部デバイスが接続されているかどうかを判断します。
ディスプレイ ポート ドライバーは、次のいずれかの条件を満たす子デバイスごとに PDO を作成します。
- 子デバイスの HPD 認識値は、HpdAwarenessAlwaysConnected です。
- 子デバイスの HPD 認識値は HpdAwarenessPolled または HpdAwarenessInterruptible であり、オペレーティング システムは、子デバイスに外部デバイスが接続されていることを以前のクエリまたは通知から認識しています。
ディスプレイ ポート ドライバーは、次のいずれかの条件を満たす子デバイスごとに、ディスプレイ ミニポート ドライバーの DxgkDdiQueryDeviceDescriptor 関数を呼び出します。
- 子デバイスには、外部デバイスが接続されていることがわかっています。
- 子デバイスには外部デバイスが接続されていることが前提とされています。
- 子デバイスの種類は TypeOther です。
DxgkDdiQueryDeviceDescriptor は、接続されたモニター (または他のディスプレイ デバイス) が EDID 記述子をサポートしている場合、拡張表示情報データ (EDID) ブロックを返します。
注: 初期化中に、ディスプレイ ポート ドライバーは、モニターごとに DxgkDdiQueryDeviceDescriptor を呼び出して、モニターの EDID の最初の 128 バイト ブロックを取得します。 これにより、ディスプレイ ポート ドライバーは、初期化時に必要なもの (PnP ハードウェア ID、インスタンス ID、互換性 ID、デバイス テキスト) を提供します。 後で、モニター クラス関数ドライバー (Monitor.sys) は、各モニターの DxgkDdiQueryDeviceDescriptor を呼び出して、最初の 128 バイト EDID ブロックと追加の 128 バイト EDID 拡張ブロックを取得します。 したがって、ディスプレイ ミニポート ドライバーは、各モニターの EDID の最初の 128 バイト ブロックを提供するために 2 回呼び出されます。
VidPN マネージャーは、ディスプレイ アダプターでサポートされているすべてのビデオの現在のソースとビデオの現在のターゲットの識別子を取得します。 ビデオの現在のソースは、0、1、...N - 1 (N は、ディスプレイ ミニポート ドライバーの DxgkDdiStartDevice 関数によって返されるソースの数です。 ビデオ プレゼント ターゲットには、DxgkDdiQueryChildRelations 中にディスプレイ ミニポート ドライバーによって以前に作成された一意の整数識別子があります。 型 TypeVideoOutput の各子デバイスは、ビデオ プレゼント ターゲットに関連付けられ、子デバイスの DXGK_CHILD_DESCRIPTOR 構造体の ChildUid メンバーは、ビデオ プレゼント ターゲットの識別子として使用されます。
VidPN マネージャーは、次の手順を使用して初期 VidPN をビルドします。
最後に確認された正常な VidPN が、レジストリに記録されている場合は、それを最初の VidPN として使用します。
それ以外の場合は、ディスプレイ ミニポート ドライバーの DxgkDdiRecommendFunctionalVidPn 関数を呼び出して、初期 VidPN を取得します。
DxgkDdiRecommendFunctionalVidPn が許容できる機能的な VidPN を返せない場合は、1 つのビデオ プレゼント パス、したがって、1 つの (ソース、ターゲット) ペアを含む単純な VidPN を作成します。 ディスプレイ ミニポート ドライバーの DxgkDdiIsSupportedVidPn 関数を呼び出して、提案された VidPN が機能することを確認します。 DxgkDdiIsSupportedVidPnで提案された VidPN が機能しないことが報告された場合は、適切な VidPN が見つかるまで試行を続けます。
ディスプレイ ミニポート ドライバーの DxgkDdiEnumVidPnCofuncModality 関数を呼び出して、VidPN で使用できるソース モードとターゲット モードを決定します。