Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(三)

发布于:2025-03-07 ⋅ 阅读:(93) ⋅ 点赞:(0)

本机围栏功能

更新或引入以下接口以查询本机围栏上限:

1.在 DXGK_VIDSCHCAPS 中增加了 NativeGpuFence 字段。 如果 OS 启用了 DXGK_FEATURE_NATIVE_FENCE 功能,则驱动程序可以在适配器初始化期间通过将 DXGK_VIDSCHCAPS::NativeGpuFence 位设置为 1 来声明对本机 GPU 围栏功能的支持。

2.为 DXGK_QUERYADAPTERINFOTYPE 添加了 DXGKQAITYPE_NATIVE_FENCE_CAPS。

3.Dxgkrnl 通过添加相应 D3DKMT_WDDM_3_1_CAPS::NativeGpuFenceSupported 结构/位向用户模式公开此功能。

4.为 KMTQUERYADAPTERINFOTYPE 添加了 KMTQAITYPE_WDDM_3_1_CAPS。

5.为 KMD 添加了以下实体,以指示其对本机 GPU 围栏功能的支持能力。

DXGK_NATIVE_FENCE_CAPS 结构描述 GPU 的本机围栏功能。 当 KMD 设置此结构的 MapToGpuSystemProcess 位时,它会指示 OS 保留系统进程 GPU 虚拟地址空间以供 CMP 使用,并为本地围栏CurrentValue 和 MonitoredValue 创建 GPU VA 映射到该地址空间。 这些 GPU VA 稍后作为 DXGKARG_CREATENATIVEFENCE::CurrentValueSystemProcessGpuVa 和 MonitoredValueSystemProcessGpuVa 传递给 KMD 的围栏创建回调。

当调用其 DxgkDdiQueryAdapterInfo 函数并添加 DXGKQAITYPE_NATIVE_FENCE_CAPS 查询适配器信息类型时,KMD 返回其填充的 DXGK_NATIVE_FENCE_CAPS 结构。

KMD DDI 用于创建、打开、关闭和销毁本机围栏对象

引入了以下 KMD 实现的 DDI 来创建、打开、关闭和销毁本机围栏对象。 Dxgkrnl 代表用户模式组件调用这些 DDI。 Dxgkrnl 仅在 OS 启用 DXGK_FEATURE_NATIVE_FENCE 功能时调用它们。

  • DxgkDdiCreateNativeFence/DXGKARG_CREATENATIVEFENCE
  • DxgkDdiOpenNativeFence/DXGKARG_OPENNATIVEFENCE
  • DxgkDdiCloseNativeFence/DXGKARG_CLOSENATIVEFENCE
  • DxgkDdiDestroyNativeFence/DXGKARG_DESTROYNATIVEFENCE

已更新以下 DDI 以支持本机围栏对象:

以下成员已添加到 DRIVER_INITIALIZATION_DATA。 支持本机 GPU 围栏对象的驱动程序应实现这些函数,并通过该结构为 Dxgkrnl 提供指向它们的指针。

  • PDXGKDDI_CREATENATIVEFENCE DxgkDdiCreateNativeFence(在 WDDM 3.1 中添加)
  • PDXGKDDI_DESTROYNATIVEFENCE DxgkDdiDestroyNativeFence(在 WDDM 3.1 中添加)
  • PDXGKDDI_OPENNATIVEFENCE DxgkDdiCreateNativeFence(在 WDDM 3.2 中添加)
  • PDXGKDDI_CLOSENATIVEFENCE DxgkDdiCloseNativeFence(在 WDDM 3.2 中添加)
  • PDXGKDDI_SETNATIVEFENCELOGBUFFER DxgkDdiSetNativeFenceLogBuffer(在 WDDM 3.2 中添加)
  • PDXGKDDI_UPDATENATIVEFENCELOGS DxgkDdiUpdateNativeFenceLogs(在 WDDM 3.2 中添加)

共享围栏的全局句柄和本地句柄

假设进程 A 创建共享本机围栏,然后进程 B 打开此围栏。

  • 进程 A 创建共享本机围栏时,Dxgkrnl 使用创建此围栏的适配器驱动程序句柄调用 DxgkDdiCreateNativeFence。 在 hGlobalNativeFence 中创建并返回的围栏句柄是全局围栏句柄。
  • Dxgkrnl 随后调用 DxgkDdiOpenNativeFence 以打开进程 A 的特定本地句柄(hLocalNativeFenceA)。
  • 当进程 B 打开相同的共享本机围栏时,Dxgkrnl 调用 DxgkDdiOpenNativeFence 以打开特定于进程 B 的本地句柄 (hLocalNativeFenceB)。
  • 如果进程 A 销毁其共享本机围栏实例,Dxgkrnl 会发现仍有一个挂起的对此全局围栏的引用,因此驱动程序只调用 DxgkDdiCloseNativeFence(hLocalNativeFenceA) 来清理特定于进程 A 的结构。 hGlobalNativeFence 句柄仍然存在。
  • 当进程 B 销毁其围栏实例时,Dxgkrnl 调用 DxgkDdiCloseNativeFence(hLocalNativeFenceB),然后调用 DxgkDdiDestroyNativeFence(hGlobalNativeFence),以允许 KMD 销毁其全局围栏数据。

为 CMP 使用的分页进程地址空间中的 GPU VA 映射

KMD 在要求本地围栏 GPU VA 也映射到 GPU 分页进程地址空间的硬件上设置 DXGK_NATIVE_FENCE_CAPS::MapToGpuSystemProcess 上限。 设置 MapToGpuSystemProcess 位指示 OS 在分页进程地址空间中为本机围栏的 CurrentValue 和 MonitoredValue 创建 GPU VA 映射,供 CMP 使用。 这些 GPU VA 随后被传递给 DxgkDdiCreateNativeFence 作为 DXGKARG_CREATENATIVEFENCE::CurrentValueSystemProcessGpuVa 和 MonitoredValueSystemProcessGpuVa。

 


网站公告

今日签到

点亮在社区的每一天
去签到