与 KMD 共享后备存储
从 Windows 11 版本 22H2 (WDDM 3.1) 开始,对 WDDM 进行了扩展,允许从内核模式驱动程序 (KMD) 访问图形分配后备存储。 后备存储是指一个已提交的内存缓冲区,当图形分配不驻留在视频内存中时,它保存图形分配的内容。
此功能允许用户模式驱动程序 (UMD) 和 KMD 访问相同的分配内存。 当 UMD 在主机上运行或在使用 GPU 半虚拟化 (GPU-PV) 的虚拟机上运行时,可以使用此功能。
此功能已向后移植到 Windows 10 版本 20H1。 DDI 适用于 WDDM 3.1 或更高版本的驱动程序。
WDDM 图形分配和后备存储
WDDM 模型中的每个图形分配都有一个后备存储。 当 UMD 调用 Dxgkrnl 的 D3DKMTCreateAllocation 函数时,会创建图形分配。 UMD 为此分配传递专用数据,Dxgkrnl 通过调用 DxgkddiCreateAllocation 将其传递给 KMD。 KMD 将所需的分配标志返回给 Dxgkrnl。
检查功能可用性
为检查后备存储共享功能是否可用,KMD 必须首先调用以下回调之一,且将 FeatureId 设置为DXGK_FEATURE_SHARE_BACKING_STORE_WITH_KMD:
- DXGKCB_QUERYFEATURESUPPORT(从 WDDM 2.9 开始提供)
- DXGKCB_ISFEATUREENABLED
只有当回调成功并且 Enable 设置为 TRUE 时,才能使用该功能。
功能流
一旦 KMD 成功确定启用了该功能,UMD 就会调用 D3DKMTCreateAllocation 来创建共享的 CPU 可见分配,并通过专用数据指示 KMD 必须与 KMD 共享该分配。 在此调用过程中,会发生以下情况:
当 OS 调用 KMD 的 DxgkddiCreateAllocation 回调时,KMD 设置 DXGK_ALLOCATIONINFOFLAGS2 的 ShareBackingStoreWithKmd 标志。 如果未启用该功能,则 KMD 不得设置 ShareBackingStoreWithKmd 标志。
Dxgkrnl 调用 DXGKDDI_SETALLOCATIONBACKINGSTORE DDI,为 KMD 提供分配后备存储的内核模式地址。
UMD 调用 D3DKMTLock2,以获取分配的用户模式地址。
分配的属性
以这种方式创建的分配必须具有以下属性:
- 只允许在系统内存段中进行分配。
- 分配必须以共享的方式创建。
- 分配不能使用现有的系统内存作为后备存储。
- UMD 可以对常规分配执行任何操作。
- UMD 调用 D3DKMTLock2,以获取指向分配的指针。
- UMD 调用 D3DKMTMakeResident,以使得 GPU 可访问该分配。