WDDM 1.3 顯示迷你埠驅動程式工作,以支援 Windows 8.1 上的Miracast無線顯示器

注意

從 Windows 10 (WDDM 2.0) 開始,操作系統隨附可在任何 GPU 上運作的內建 Miracast 堆疊。 如需 Microsoft Miracast 堆疊的相關信息,以及支援 Miracast 顯示器的驅動程式和硬體需求,請從 Windows 10 開始,請參閱下列檔:

驅動程式開發人員不應再實作自定義Miracast堆疊。 Microsoft 可能會在未來的 Windows 版本中移除自定義 Miracast 堆疊的支援。

若要在 Windows 8.1 上支援Miracast無線顯示器,WDDM 1.3 會顯示在核心模式中執行的迷你埠驅動程序必須執行下列工作。

支援Miracast介面

如果 WDDM 8.1 顯示迷你埠驅動程式支援 Miracast 顯示器,當 Microsoft DirectX 圖形核心子系統呼叫 DxgkDdiQueryInterface 函式時,它必須報告DXGK_MIRACAST_DISPLAY_INTERFACE結構,該結構具有驅動程式實作 Miracast 函式的指標。

如果操作系統的 DirectX 圖形核心子系統 (Dxgkrnl.sys) 不會呼叫 DxgkDdiQueryInterface 函式來查詢 Miracast 顯示介面,則不支援 Miracast 無線顯示器,而且顯示迷你埠驅動程式不應回報任何 Miracast 目標。

驅動程式不應在任何完整的 WDDM 圖形裝置上回報一個以上的 Miracast 目標,否則操作系統無法啟動適配卡。

Dxgkrnl 呼叫 DxgkDdiQueryInterface 以查詢 Miracast 顯示介面之後,當 Dxgkrnl 呼叫 DxgkDdiQueryChildRelations 函式時,驅動程式可以在裝置初始化期間將目標類型回報為D3DKMDT_VOT_MIRACAST

Miracast 目標應該保持中斷連線狀態,直到 Dxgkrnl 啟動 Miracast 聯機會話為止。 當 Miracast 會話啟動時,且監視器已連線到 Miracast 接收,或驅動程式收到 Miracast 使用者模式驅動程式的 I/O 要求,因為新的監視器已連線到 Miracast 接收,所以顯示迷你埠驅動程式應該透過呼叫 DxgkCbIndicateChildStatus 函式,向操作系統回報監視器抵達熱插補偵測 (HPD) 感知值。 在此呼叫中,驅動程式應該在 DXGK_CHILD_STATUS 結構中設定下列值:

成員
類型 DXGK_CHILD_STATUS_TYPE列舉的 StatusMiracast 常數值
Miracast連接 TRUE
MiracastMiracastMonitorType 指出連接類型的值。 如果Miracast接收內嵌在監視器或電視中,此成員應該設定為D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY列舉的D3DKMDT_VOT_MIRACAST常數值。

下表列出 WDDM 1.3 顯示迷你埠驅動程式所實作的 Miracast 函式:

函式 描述
DxgkDdiMiracastCreateContext 建立內容以啟動Miracast顯示裝置的核心模式實例。
DxgkDdiMiracastDestroyContext 建立內容以啟動Miracast顯示裝置的核心模式實例。
DxgkDdiMiracastIoControl 處理源自Miracast使用者模式驅動程式呼叫 MiracastIoControl的同步I/O要求。
DxgkDdiMiracastQueryCaps 查詢目前顯示配接器的Miracast功能。

啟動Miracast工作階段

當 Miracast 工作話啟動時,操作系統會呼叫 DxgkDdiQueryChildStatus 函式。 顯示迷你埠驅動程序應該設定DXGK_CHILD_STATUS輸入StatusMiracast 的值,而且應該在 DXGK_CHILD_STATUS中使用 Miracast 子結構。 如果監視器連線到Miracast接收,驅動程式應該設定 Miracast已連線D3DKMDT_VOT_MIRACAST

驅動程式必須指定 D3DKMDT_VIDEO_SIGNAL_INFO的值。VsyncFreqDivider,這是透過Miracast聯機會話顯示之監視器的 VSync 速率與Miracast接收 VSync 速率的比例。 例如,如果Miracast接收垂直重新整理速率為240 Hz,且聯機顯示器的VSync中斷頻率為30 Hz,則驅動程式應該將 VsyncFreqDivider 設定為8。

處理已完成編碼區塊的中斷

透過無線Miracast線上傳輸之單一畫面格的數據可以分成一或多個編碼區塊。 每次 GPU 完成編碼其中一個區塊時,都必須產生中斷。 為了回應此中斷,顯示迷你埠驅動程序必須呼叫 DxgkCbNotifyInterrupt 函式,並在DXGKARGCB_NOTIFY_INTERRUPT_DATA結構中完成 MiracastEncodeChunkCompleted 子結構,包括將DXGK_INTERRUPT_TYPE插斷類型設定為 DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE

在中斷處理過程中,驅動程式可以選擇性地指定 MiracastEncodeChunkCompletedpPrivateDriverDataPrivateDataDriverSizeDXGKARGCB_NOTIFY_INTERRUPT_DATA 結構中的成員。 使用者模式驅動程式可以在 MIRACAST_CHUNK_DATA中存取此私人驅動程序數據。PrivateDriverData 成員。

如果顯示迷你埠驅動程式在一段時間後會產生比使用者模式顯示驅動程式取用的區塊數據更多的封包,則新區塊的可用可用記憶體空間可能會用盡。在此情況下,顯示迷你埠驅動程式會在MiracastEncodeChunkCompleted中傳回STATUS_NO_MEMORY狀態,而且必須呼叫 DxgkCbNotifyDpc 函式,以通知作業系統的 GPU 排程器發生錯誤狀況。 呼叫 GetNextChunkData 函式會傳回STATUS_CONNECTION_RESET狀態代碼,後續呼叫將會開始接收重設作業之後提交的區塊。 由於某些區塊遺失,因此驅動程式應該產生並傳輸新的 I 框架。

來源模式的限制

為了處理圖元管線的條件約束,WDDM 1.3 顯示迷你埠驅動程式通常會限制公開至操作系統的來源模式。 驅動程式只會在來源模式清單中填入圖元管線也支援的監視器所公開的模式,藉此執行此動作。 例如,驅動程式不會根據圖元管線條件約束來修改 EDID。

同樣地,針對Miracast,顯示迷你埠驅動程式會限制在列舉來源和目標模式集時公開給操作系統的一組來源模式。 針對 Miracast,會顯示 GPU 編碼功能、網路屬性和接收譯碼功能,可減少 Miracast 像素管線可支援的來源模式數目。

如果顯示迷你埠驅動程式呼叫 DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode 函式,嘗試將 3D 立體聲模式新增至連線到 Miracast 目標的來源,函數調用就會失敗。

呼叫作業系統提供的回呼函式

作業系統提供下列 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輸入StatusMiracast 常數值的成員,也應該設定 DXGK_CHILD_STATUSMiracast線上TRUE,以向作業系統報告監視器抵達 HPD。 驅動程式應該設定 DXGK_CHILD_STATUSMiracastMiracastMonitorType 成員為連線到接收的正確監視器類型。 如果接收是監視的一部分,則此成員應設定為 D3DKMDT_VOT_MIRACAST

如果驅動程式知道監視器的EDID,當操作系統呼叫 DxgkDdiQueryDeviceDescriptor 函式時,它應該回報此EDID。

視硬體功能、Miracast 接收模式清單和網路頻寬而定,驅動程式應該報告正確的來源模式、目標模式、旋轉模式和縮放模式。 針對目標模式,驅動程式應該報告D3DKMDT_VIDEO_SIGNAL_INFO中正確的 VSyncFreqDivider 成員值。 操作系統會比對監視模式的目標模式,並剪除監視器不支援的任何模式。