Windows 8.1 で Miracast ワイヤレス ディスプレイをサポートするための WDDM 1.3 ディスプレイ ミニポート ドライバー タスク

Note

Windows 10 (WDDM 2.0) 以降、オペレーティング システムには、任意の GPU で動作できる組み込みの Miracast スタックが付属しています。 Microsoft Miracast スタックと、Windows 10 以降の Miracast ディスプレイをサポートするためのドライバーとハードウェアの要件については、次のドキュメントを参照してください。

ドライバー開発者は、カスタム Miracast スタックを実装する必要がなくなりました。 Microsoft は、将来のバージョンの Windows でカスタム Miracast スタックのサポートを削除する可能性があります。

Windows 8.1 で Miracast ワイヤレス ディスプレイをサポートするには、カーネル モードで実行される WDDM 1.3 ディスプレイ ミニポート ドライバーが次のタスクを実行する必要があります。

Miracast インターフェイスのサポート

WDDM 8.1 ディスプレイ ミニポート ドライバーが Miracast ディスプレイをサポートする場合は、Microsoft DirectX グラフィックス カーネル サブシステムが DxgkDdiQueryInterface 関数を呼び出したときに、ドライバーに実装された Miracast 関数へのポインターを含む DXGK_MIRACAST_DISPLAY_INTERFACE 構造体を報告する必要があります。

オペレーティング システムの DirectX グラフィックス カーネル サブシステム (Dxgkrnl.sys) が DxgkDdiQueryInterface 関数を呼び出して Miracast ディスプレイ インターフェイスを照会しない場合、Miracast ワイヤレス ディスプレイはサポートされず、ディスプレイ ミニポート ドライバーは Miracast ターゲットを報告しません。

どのようなフル WDDM グラフィックス デバイスでもドライバーから複数の Miracast ターゲットを報告してはいけません。報告すると、オペレーティング システムはアダプターを起動できません。

Dxgkrnl が DxgkDdiQueryInterface を呼び出して Miracast ディスプレイ インターフェイスを照会した後、Dxgkrnl が以下の関数を呼び出すと、ドライバーはデバイスの初期化中にターゲットの種類を D3DKMDT_VOT_MIRACAST として報告します: DxgkDdiQueryChildRelations 関数。

Miracast ターゲットは、Dxgkrnl が Miracast 接続セッションを開始するまで、切断された状態を維持する必要があります。 Miracast セッションが開始され、モニターが Miracast シンクに接続されているか、新しいモニターが Miracast シンクに接続されているためにドライバーが Miracast ユーザー モード ドライバーから I/O 要求を受信したら、ディスプレイ ミニポート ドライバーは、DxgkCbIndicateChildStatus 関数を呼び出すことによって、モニター到着ホット プラグ検出 (HPD) 認識値をオペレーティング システムに報告する必要があります。 この呼び出しでは、ドライバーは、DXGK_CHILD_STATUS 構造体に次の値を設定する必要があります。

メンバー
Type StatusMiracast 定数値 (DXGK_CHILD_STATUS_TYPE 列挙型)
Miracast.Connected TRUE
Miracast.MiracastMonitorType 関数の種類を示す値です。 Miracast シンクがモニターまたはテレビに埋め込まれている場合、このメンバーは、D3DKMDT_VOT_MIRACAST 定数値に設定する必要があります (D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY 列挙型)。

次の表に、WDDM 1.3 ディスプレイ ミニポート ドライバーが実装する Miracast 関数の一覧を示します。

関数 説明
DxgkDdiMiracastCreateContext Miracast ディスプレイ デバイスのカーネルモード インスタンスを開始するコンテキストを作成します。
DxgkDdiMiracastDestroyContext Miracast ディスプレイ デバイスのカーネルモード インスタンスを開始するコンテキストを作成します。
DxgkDdiMiracastIoControl MiracastIoControl への Miracast ユーザーモード ドライバー呼び出しから発信された同期 I/O 要求を処理します。
DxgkDdiMiracastQueryCaps 現在のディスプレイ アダプターの Miracast 機能を照会します。

Miracast セッションの開始

Miracast セッションが開始されると、オペレーティング システムは DxgkDdiQueryChildStatus 関数を呼び出します。 ディスプレイ ミニポート ドライバーは、DXGK_CHILD_STATUS.Type の値を StatusMiracast に設定し、Miracast 子構造体を DXGK_CHILD_STATUS 内で使用する必要があります。 モニターが Miracast シンクに接続されている場合、ドライバーは Miracast.ConnectedD3DKMDT_VOT_MIRACAST に設定する必要があります。

ドライバーは D3DKMDT_VIDEO_SIGNAL_INFO.VsyncFreqDivider の値を指定する必要があります。これは、Miracast 接続セッションを介して表示されるモニターの VSync レートと Miracast シンクの VSync レートの比率です。 たとえば、Miracast シンクの垂直リフレッシュ レートが 240 Hz で、接続されたディスプレイの VSync 割り込み周波数が 30 Hz の場合、ドライバーは VsyncFreqDivider を 8 に設定する必要があります。

完了したエンコード チャンクの割り込みの処理

ワイヤレス Miracast 接続を介して送信される 1 つのフレームのデータは、1 つ以上のエンコード チャンクに分割できます。 GPU がこれらのいずれかのチャンクのエンコードを完了するたびに、割り込みを生成する必要があります。 この割り込みに応答して、ディスプレイ ミニポート ドライバーは DxgkCbNotifyInterrupt 関数を呼び出し、MiracastEncodeChunkCompleted 子構造体を DXGKARGCB_NOTIFY_INTERRUPT_DATA 構造内で完成させる必要があります。これには、DXGK_INTERRUPT_TYPE 割り込みタイプを DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE に設定することが含まれます。

割り込み処理の一環として、ドライバーは必要に応じて MiracastEncodeChunkCompleted.pPrivateDriverData メンバーと PrivateDataDriverSize メンバーを DXGKARGCB_NOTIFY_INTERRUPT_DATA 構造体の中に指定できます。 ユーザー モード ドライバーは、MIRACAST_CHUNK_DATA.PrivateDriverData メンバー内のプライベート ドライバー データにアクセスできます。

一定期間にわたって、ディスプレイ ミニポート ドライバーが、ユーザー モード ディスプレイ ドライバーが取り込む量よりも多くのチャンク データを含むパケットを生成すると、新しいチャンクに使用できる空きメモリ領域が不足する可能性があります。この場合、ディスプレイ ミニポート ドライバーは STATUS_NO_MEMORY (MiracastEncodeChunkCompleted.Status ) を返し、DxgkCbNotifyDpc 関数を呼び出して、オペレーティング システムの GPU スケジューラーにエラー状態を通知する必要があります。 GetNextChunkData 関数を呼び出すと、STATUS_CONNECTION_RESET 状態コードが返され、後続の呼び出しはリセット操作後に送信されたチャンクの受信を開始します。 一部のチャンクが失われたため、ドライバーは新しい I フレームを生成して送信する必要があります。

ソース モードに関する制限事項

ピクセル パイプラインの制約を処理するために、WDDM 1.3 ディスプレイ ミニポート ドライバーは通常、オペレーティング システムに公開されるソース モードを制限します。 ドライバーは、ピクセル パイプラインもサポートするモニターによって公開されるモードをソース モードの一覧に設定することによって、これを行います。 たとえば、ドライバーは、ピクセル パイプラインの制約に基づいて EDID を変更しません。

同様に、Miracast ディスプレイの場合、ディスプレイ ミニポート ドライバーは、ソースとターゲット モードのセットを列挙するときにオペレーティング システムに公開されるソース モードのセットを制限します。 Miracast ディスプレイの場合、GPU エンコード機能、ネットワーク プロパティ、およびシンク デコード機能により、Miracast ピクセル パイプラインでサポートできるソース モードの数を減らすことができます。

ディスプレイ ミニポート ドライバーが DXGK_VIDPNSOURCEMODESET_INTERFACE::pfnAddMode 関数を呼び出して、Miracast ターゲットに接続されているソースに 3-D ステレオ モードを追加しようとすると、関数呼び出しは失敗します。

オペレーティング システムが提供するコールバック関数の呼び出し

オペレーティング システムには、次の Miracast カーネルモード コールバック関数が用意されています。

関数 説明
DxgkCbMiracastSendMessage ユーザー モード ディスプレイ ドライバーに非同期メッセージを送信します。
DxgkCbMiracastSendMessageCallback DxgkCbMiracastSendMessage の呼び出しで使用され、完成した IRP の IO_STATUS_BLOCK 構造体を指定します。
DxgkCbReportChunkInfo
エンコード チャンクに関する情報を報告します。

カーネルモードからユーザーモードへのメッセージの非同期送信

ディスプレイ ミニポート ドライバーが DxgkCbMiracastSendMessage 呼び出しを介して関連付けられているユーザーモード ドライバーに送信するメッセージは、Miracast 接続セッションが開始されるまで配信されません。 したがって、ユーザー モード ドライバーの StartMiracastSession 関数がまだ呼び出されていない場合、送信されたメッセージは StartMiracastSession が返されるまで遅延されます。 StopMiracastSession 関数が呼び出された後にメッセージが送信されると、メッセージはオペレーティング システムによって破棄され、DxgkCbMiracastSendMessageCallback 関数が、pIoStatusBlock->Status にエラー状態を設定して呼び出されます。

Miracast ディスプレイをサポートするように既存のディスプレイ ミニポート ドライバーを変更する

DxgkDdiStartDevice 関数が呼び出されたら、ディスプレイ ミニポート ドライバーは、新しい Miracast ターゲットを追加し、オペレーティング システムがそのターゲットをポーリングしないようにターゲットのホットプラグ検出 (HPD) 認識値を HpdAwarenessInterruptible としてマークする必要があります。 また、DxgkDdiQueryChildRelations 関数が呼び出されたときには、ドライバーは接続の種類として D3DKMDT_VOT_MIRACAST を報告する必要があります。

ドライバーからフル WDDM グラフィックス デバイスの複数の Miracast ターゲットを報告してはいけません。 ドライバーが複数の Miracast ターゲットを報告した場合、オペレーティング システムはアダプターの起動に失敗します。 また、Miracast 接続セッションが開始されていない場合は、ドライバーはそのターゲットのモニターを報告してはいけません。

またドライバーは、DirectX グラフィックス カーネル サブシステムが DxgkDdiQueryInterface 関数を呼び出したら、カーネルモード アドレス空間にある関数へのポインターを使用して、正しい DXGK_MIRACAST_DISPLAY_INTERFACE 構造体を報告する必要があります。

Miracast セッションが開始され、モニターが Miracast シンクに接続されたときに、ディスプレイ ミニポート ドライバーは DXGK_CHILD_STATUS.Type メンバーを StatusMiracast 定数値に設定し、さらに DXGK_CHILD_STATUS.Miracast.ConnectedTRUE に設定して、モニター到着 HPD をオペレーティング・システムに報告する必要があります。 ドライバーは、DXGK_CHILD_STATUS.Miracast.MiracastMonitorType メンバーを、シンクに接続されている正しいモニターの種類に設定する必要があります。 シンクがモニターの一部である場合は、このメンバーを D3DKMDT_VOT_MIRACAST に設定する必要があります。

ドライバーがモニターの EDID を認識している場合は、オペレーティング システムが DxgkDdiQueryDeviceDescriptor 関数を呼び出すときに、この EDID を報告する必要があります。

ハードウェアの機能、Miracast シンク モードの一覧、およびネットワーク帯域幅に応じて、ドライバーは正しいソース モード、ターゲット モード、回転モード、スケーリング モードを報告する必要があります。 ターゲット モードの場合、ドライバーは正しい VSyncFreqDivider メンバー値を D3DKMDT_VIDEO_SIGNAL_INFO で報告する必要があります。 オペレーティング システムは、ターゲット モードをモニター モードと照合して、モニターでサポートされていないモードを除外します。