支援視訊擷取和其他子裝置
顯示迷你埠驅動程式和視訊擷取裝置的驅動程式或其他子裝置可以相互定義私人介面,讓子驅動程式可用來透過父迷你埠驅動程式與其裝置通訊。 子視訊擷取驅動程式必須與父顯示器迷你埠驅動程式緊密結合。 事實上,視訊擷取可能會實作為顯示器迷你埠驅動程式的一部分。 視訊擷取驅動程式可以使用私人介面搭配顯示器迷你埠驅動程式來存取 I2C 匯流排,以及其他用途。
若要初始化私人介面,視訊擷取驅動程式會將 IRP_MN_QUERY_INTERFACE 要求傳送至顯示器迷你埠 (驅動程式 Dxgkrnl.sys) 的 一部分。 在顯示埠驅動程式收到這類要求之後,它會呼叫迷你埠驅動程式的 DxgkDdiQueryInterface 函式,並將指標傳遞至包含初始化私用介面之資訊的 QUERY_INTERFACE 結構。
注意 如果視訊擷取實作為顯示迷你埠驅動程式的一部分,影片擷取可能會直接呼叫 DxgkDdiQueryInterface 。
子裝置的每個驅動程式 (包括視訊擷取裝置) 必須傳回介面卡 GUID,指出裝置相關聯的硬體。 介面卡 GUID 會提供給配接器初始化時所傳送之DxgkDdiStartDevice函式之 DxgkStartInfo參數所指向之 DXGK_START_INFO結構的AdapterGuid成員中的 display miniport 驅動程式。 使用者模式擷取元件隨後可以將此介面卡 GUID 對應至顯示配接器。
在 Microsoft Windows 2000 顯示驅動程式模型中,影片擷取應用程式會將系統記憶體擷取緩衝區傳送至核心模式。 然後,核心模式會使用 記憶體描述項清單 (MDL) 結構來描述系統記憶體緩衝區,並將 MDL 傳送至視訊擷取驅動程式。 除了支援擷取至系統記憶體之外,Windows Vista 顯示器驅動程式模型還支援擷取至視訊記憶體。 Direct3D 執行時間會呼叫 DirectX Video Acceleration 2.0 類型函式,以指示 GPU 對擷取資料執行後續處理。 使用者模式顯示驅動程式不會傳送 MDL 來描述視訊記憶體緩衝區,而是傳送D3DKMT_HANDLE類型值,這些值會處理以擷取緩衝區配置。 因此,視訊擷取驅動程式和顯示迷你埠驅動程式組合可以使用 DxgkCbGetHandleData 等現有回呼函式來參考描述擷取緩衝區的私人資料。 驅動程式組合也可以使用 DxgkCbGetCaptureAddress 回呼函式來傳回擷取緩衝區的實體位址。
影片擷取應用程式呼叫 Direct3D 執行時間以建立擷取緩衝區;執行時間接著會呼叫使用者模式顯示驅動程式。 執行時間會呼叫使用者模式顯示驅動程式的CreateResource函式,並在D3DDDIARG_CREATERESOURCE結構的Flags成員中設定CaptureBuffer位欄位旗標,以建立擷取緩衝區。 當記憶體管理員呼叫 display miniport 驅動程式的DxgkDdiCreateAllocation函式來建立擷取緩衝區的配置時,顯示迷你埠驅動程式也必須指定視訊記憶體管理員的擷取位欄位旗標。 建立擷取緩衝區時,它們會立即釘選在記憶體中,而且在釋放之前不會取消釘選。 由於擷取堆疊必須將擷取緩衝區的核心模式配置控制碼傳送至擷取驅動程式,因此執行時間會呼叫使用者模式顯示驅動程式的 GetCaptureAllocationHandle 函式,以將每個資源控制碼對應至該資源的核心模式配置控制碼。
擷取驅動程式可以報告它是否支援直接擷取至系統記憶體。 如果擷取驅動程式支援直接擷取至系統記憶體,MDL 會針對此目的傳送至擷取驅動程式。 如果擷取驅動程式不支援直接擷取至系統記憶體,執行時間會建立視訊記憶體擷取緩衝區,而且擷取驅動程式必須填滿它們。 系統會呼叫使用者模式顯示驅動程式的 CaptureToSysMem 函式,將擷取緩衝區的內容複寫到系統記憶體表面。 執行時間可以使用 CaptureToSysMem 而非 Blt 函式,利用 bit-block 傳輸的特殊硬體, (bitblt) 不需要使用者模式顯示驅動程式呼叫 pfnRenderCb 函式。
因為 AVStream 會控制視訊擷取,所以 DirectX 圖形核心子系統在影片擷取發生時不會察覺。 不過,圖形核心子系統知道用來作為擷取緩衝區的配置。 當擷取緩衝區即將終結時,圖形核心子系統會呼叫 display miniport 驅動程式的 DxgkDdiStopCapture 函式,以指出擷取作業必須立即停止使用配置作為擷取緩衝區。 如果擷取作業已經透過擷取堆疊停止,驅動程式就可以安全地忽略呼叫。