管道状态对象 (PSO) 缓存和库
管道状态对象 (PSO) 是一个接口,它将图形管道指令和资源(也称为状态)表示为一个统一的对象,以减少 D3D 和驱动程序对状态分解之间的不匹配。 运行图形要求较高的应用程序和游戏需要创建大量的 PSO。 D3D12 中引入了 PSO。
WDDM 2.1 PSO 库和缓存使游戏应用程序能够在初始运行时,在创建 PSO 后将其存储在物理存储器上。 此功能允许 D3D 运行时在未来实例中从库中检索预创建的 PSO,从而缩短 PSO 提取时间。 例如,首次运行游戏或重启电脑后,内容将以保存的 PSO 形式从物理库中加载。
管道 GPU 的启动时间戳
WDDM 2.1 引入了检索 GPU 管道中图形事件开始的时间戳的功能。 此功能与管道结束时间戳配合使用,可为开发人员提供清晰、细粒度的可视化信息,让他们了解 GPU 上的并行化、管道以及应用程序活动的时间安排。 如果开发人员能获得每个事件的执行时间,他们就能进一步优化代码,并调查效率低下和其他性能问题。
此功能有助于实现“实时、低开销”的 GPU 性能数据收集,同时为可视化和测量 GPU 上的工作负荷提供充分的信息。 此功能的目标是提供充分的信息,以重建 GPU 执行操作的确切顺序和持续时间。 有了这些信息,工具就能可视化引擎的并行性和管道化,测量 GPU 工作负荷,并识别潜在的同步问题。
查看 GPU 微代码
WDDM 2.1 可让开发人员通过查看 GPU 微代码来进一步优化着色器。 开发人员使用高级着色器语言 (HLSL) 来创建着色器,然后编译成 GPU 驱动程序的中间语言,从而对图形管道进行编程。 驱动程序会运行额外的编译和优化,将这些代码转换为 GPU 专用指令,但开发人员对这些指令并不了解。 借助此功能,开发人员就能看到可读的 GPU 特定代码,以评估其着色器的优化程度和速度。
此功能使用户模式驱动程序 (UMD) 能够对图形管道(着色器)的每个可编程阶段进行注释,并返回有关程序员使用或误用这些着色器的可执行信息。 GPU 专用的微代码会被反汇编,并以可读字符串格式与 UMD 注释一起呈现。 开发人员可以并行查看他们的 HLSL 代码与可读 GPU 代码的映射,这使得他们能够动态修改代码,并查看 GPU 代码方面的编译器优化结果。
确定 WDDM 版本
WDDM 2.1 上限
驱动程序通过 DXGK_DRIVERCAPS::WDDMVersion 和版本常量来报告 WDDM 2.1 支持情况
DXGK_WDDMVERSION::DXGKDDI_WDDMv2_1 = 0x2100
Dxgkrnl 不会使用 WDDMVersion 上限来确定支持哪些功能;这一任务留给了其他上限或 DDI 状态。 但是,如果驱动程序通过 WDDMVersion 上限报告支持 WDDM 2.1,则 Dxgkrnl 会验证是否存在 WDDM 2.1 所需的上限或 DDI,如果不存在,则无法创建适配器。 不一致的上限会导致无法创建适配器或段。
现有或较新的应用程序都无需查询驱动程序模型,即可利用通过平台改进(如此处概述的改进)而启用的任何 Windows 10 周年版功能。 任何功能更改都必须通过相应的运行时来实现。
为匹配 KMT_DRIVERVERSION_WDDM_2_1 添加了以下常量:
typedef enum _DXGIDRIVERMODELVERSION
{DXGIDMVERSION_1_0 = 1000,DXGIDMVERSION_1_1_PRERELEASE = 1102,DXGIDMVERSION_1_1 = 1105, DXGIDMVERSION_1_2 = 1200,DXGIDMVERSION_1_3 = 1300,DXGIDMVERSION_2_0 = 2000,DXGIDMVERSION_2_1 = 2100,} DXGIDRIVERMODELVERSION;
内核模式驱动程序 (KMD) 中的 DDI 接口版本如下:
#define DXGKDDI_INTERFACE_VERSION_VISTA 0x1052
#define DXGKDDI_INTERFACE_VERSION_VISTA_SP1 0x1053
#define DXGKDDI_INTERFACE_VERSION_WIN7 0x2005
#define DXGKDDI_INTERFACE_VERSION_WIN8 0x300E
#define DXGKDDI_INTERFACE_VERSION_WDDM1_3 0x4002
#define DXGKDDI_INTERFACE_VERSION_WDDM1_3_PATH_INDEPENDENT_ROTATION 0x4003
#define DXGKDDI_INTERFACE_VERSION_WDDM2_0 0x5023
#define DXGKDDI_INTERFACE_VERSION_WDDM2_1 0x6002