DxgkDdiQueryAdapterInfo 更新
DXGKARG_QUERYADAPTERINFO 結構已更新,以包括以下字段以支持半虛擬化:
- 添加了 Flags 成員,允許 Dxgkrnl 指示以下內容:
- 它將 VirtualMachineData 設置為指示調用來自 VM。
- 它將 SecureVirtualMachine 設置為表示 VM 在安全模式下運行。
- 添加了 hKmdProcessHandle,這允許驅動程序在處理源自來賓 VM 的查詢時識別和使用主機端的正確進程上下文。
DxgkDdiEscape 更新
hKmdProcessHandle 成員被添加到 DXGKARG_ESCAPE 結構中,以允許驅動程序在處理來自來賓虛擬機的轉義時,識別并使用主機端的正確進程上下文。
VirtualMachineData 標志被添加到 D3DDDI_ESCAPEFLAGS 結構中,以指示 DxgkDdiEscape 是從虛擬機調用的。
物理訪問 GPU 分配
目前,驅動程序不會實現對分配的物理訪問。 驅動程序必須支持 GpuMmu。
WDDM 2.5 DDI 更新
對于 WDDM 2.5,為了支持半虛擬化,還需要進行以下 DDI 更改。
?由 KMD 主機發出來賓事件信號
當 KMD 需要對 UMD 創建的事件發出信號時,會出現一些沒有虛擬化的情況。 若要在使用半虛擬化時處理此類情況,主機上的 KMD 需要向客戶機中創建的事件發送信號。 為此添加了 DxgkCbSignalEvent 回調。 KMD 還可以使用此回調來發出主機進程的事件信號。
支持虛擬機中 UMD 提供的句柄
某些驅動程序回調接受 UMD 傳遞的 Dxgkrnl 分配或資源句柄,例如:
- DxgkCbAcquireHandleData
- DxgkCbReleaseHandleData
- DxgkCbGetHandleData
- DxgkCbGetHandleParent
主機上的調用必須在調用 DxgkDdiXxx 函數的同一線程上下文中進行。
例如,假設在沒有虛擬化的情況下,KMD 在調用 D3DKMTEscape 的用戶模式線程的上下文中調用 DxgkCbAcquireHandleData,該線程調用 DxgkDdiEscape。
UMD 在虛擬機中運行時,它只知道來賓分配句柄,并且無法將此類句柄傳遞給 KMD,因為 KMD 在主機中運行。 來賓中的 UMD 會調用 D3DKMTEscape,而主機中的 KMD 會接收相應的 DxgkDdiEscape 調用。 KMD 需要在此線程的上下文中調用 DxgkCbAcquireHandleData。
為了能將來賓分配/資源句柄轉換為相應的主機句柄,添加了 D3DDDI_ESCAPEFLAGS::DriverKnownEscape 驅動程序轉義標志。
在調用 D3DKMTEscape 并設置 DriverKnownEscape 標記時:
- 將 D3DKMT_ESCAPE::Type 設置為 D3DKMT_ESCAPE_DRIVERPRIVATE。
- 將 D3DKMT_ESCAPE::pPrivateDriverData 設置為指向已知的驅動程序轉義結構,該結構在下一節中定義。 每個結構都以 D3DDDI_DRIVERESCAPETYPE 值開頭。
如果未使用虛擬化,則轉換后的句柄與輸入句柄相同。
定義了以下已知的驅動程序轉義字符。
- D3DDDI_DRIVERESCAPE_TRANSLATEALLOCATIONEHANDLE
- D3DDDI_DRIVERESCAPE_TRANSLATERESOURCEHANDLE
以下代碼片段演示如何使用 DriverKnownEscape 標志。
D3DDDI_DRIVERESCAPE_TRANSLATEALLOCATIONEHANDLE Command = {};Command.EscapeType = D3DDDI_DRIVERESCAPETYPE_TRANSLATEALLOCATIONHANDLE;Command.hAllocation = hAlloc;D3DKMT_ESCAPE Args = {};Args.hAdapter = hAdapter;Args.Flags.DriverKnownEscape = TRUE;Args.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;Args.pPrivateDriverData = &Command;Args.PrivateDriverDataSize = sizeof(Command);Status = D3DKMTEscape(&Args);
WDDM 2.6 DDI 更新
從 WDDM 2.6(Windows 10 版本 1903 開始),為半虛擬化支持進行了以下更新:
- 驅動程序可以在虛擬機中使用 DXGK_ALLOCATIONINFOFLAGS::ACCESSEDPHYSICALLY 標志。 在 WDDM 2.6 之前,驅動程序無法在虛擬機中使用此標志,并且此標志的分配創建失敗。
- UMD 可以在虛擬機中使用 Pfnd3dkmtUpdateallocationproperty。 在 WDDM 2.6 之前,此調用將失敗。