WDDM 2.1 功能

本文详细介绍了 Windows 显示驱动程序模型 (WDDM) 2.1 版的功能和增强特性,该版本从 Windows 10 周年版(Windows 10,版本 1607)开始提供。

WDDM 2.1 本身为可选。 如果已实现,它就是一系列强制的和可选的驱动程序功能。 支持任何 WDDM 2.1 功能的驱动程序必须支持所有强制功能。 Windows 硬件实验室工具包 (HLK) 测试可以验证支持,但 Dxgkrnl 会检查功能和 DDI 的一致性。

WDDM 2.1 要求表

功能 适用性
供应和回收改进 必需
视频内存管理 可选
硬件保护内容的可靠性改进 选择硬件
支持 Windows GameDVR 的应用程序 必需
间接显示 选择硬件
驱动程序存储和并行安装 必需
适用于摄像头/捕获场景的 DirectX 内存图面共享 必需

WDDM 2.1 支持以下 D3D 版本:D3D9、D3D10、D3D10.1、D3D11、D3D11.x、D3D12

供应和回收改进

添加了 PFND3DDDI_RECLAIMALLOCATIONS3CB 回调函数,以减少在后台模式下运行的应用程序的内存占用。 此接口可让应用程序在进入后台时提供可接受完全回收的资源。 因此,进程生存期管理器能够从使用 DirectX 的后台程序中回收更多内存,从而减少后台程序在内存压力下被终止的次数。

其他 DDI 更改:

有关供应和回收资源的详细信息,请参阅供应和回收更改

支持 Windows GameDVR 的应用程序

Windows 10 周年版改进了全屏游戏中使用 Windows 游戏栏和 GameDVR 的功能。

WDDM 2.1 驱动程序需要支持名为当前批处理的性能功能,该功能为翻转模型交换链添加了多线程支持。 此基本功能可确保带游戏栏的全屏游戏以与早期版本 Windows 相同的性能运行。

为启用此功能添加了以下 DDI:

间接显示

在 WDDM 2.1 中,“间接显示”使 USB 连接的显示器能够像其他监视器一样,参与所有相同的用户体验。 此外,间接显示驱动程序 (IDD) 是一种用户模式驱动程序,开发起来比内核模式驱动程序简单,因此有助于提高系统的整体可靠性。

在 WDDM 2.1 中,启用了以下 USB 显示功能/体验:

  • 当 USB 显示器连接到 Windows 平台或升级操作系统时,会从 Windows 更新下载并安装适当的驱动程序。

  • 将监视器连接到 USB 显示硬件时,将检测并设置正确的监视器拓扑结构、分辨率和 DPI。

  • 用户可以在监视器上更改其分辨率和缩放。

  • 用户可以断开 USB 显示器并重新连接显示器,而不会产生意想不到的副作用。

  • 通过断开连接并重新连接到同一监控器,监控器拓扑结构将得以保留。

  • USB 显示器可在睡眠和休眠等各种电源状态下正常工作。

有关间接显示的详细信息,请参阅间接显示驱动程序型号概述

驱动程序存储和并行安装

WDDM 2.1 引入了通过驱动程序存储安装图形驱动程序的功能。 这种安装图形驱动程序的机制提高了 Windows Update 驱动程序更新的复原能力。 它能消除驱动程序文件版本不匹配导致的系统不稳定和用户发起的重启。 每个后续驱动程序更新都将直接从其在驱动程序存储中的唯一位置(即 System32\DriverStore\FileRepository\[…])运行,从而避免驱动程序文件覆盖和不匹配。

驱动程序存储功能的实现需要更改图形驱动程序 INF 文件,以确保驱动程序文件被复制到唯一的驱动程序存储库。 有关 INF 更改的详细信息,请参阅 INF 要求

DXIL

WDDM 2.1 引入了 GPU 着色器编译器堆栈从 DirectX 字节代码 (DXBC) 到 DirectX 中间语言 (DXIL) 的过渡,这是一种向 GPU 传输着色器指令的较新格式。 过渡到 DXIL 可为开发人员带来以下好处:

  • 可编程性。 通过最大限度地减少 GPU 编程语法与开发人员熟悉的 CPU 语言之间的差异,提高了开发的易用性,降低了着色器创建过程对开发人员的复杂性。

  • 高性能编译器:

    • 启用运行时着色器性能可提高性能。
    • DXIL 提供了一套内在函数,可在 GPU 的 SIMD 处理器通道间共享数据。
  • 工作流灵活性 - DXIL 使开发人员能够控制自己的自定义工具和优化程序,并选择在生成时应用哪些编译步骤,而不是在运行时应用哪些编译步骤。

  • 高级语言功能 - 高级语言可提供关键功能,从而消除 GPU 代码与 CPU 代码之间的差异,使得 GPU 程序员的学习曲线更加平坦。

这些功能的重点是为开发人员带来好处,而最终用户得到的好处是,即使在现有硬件上运行,新游戏或更新游戏的性能也会有所提高。

适用于摄像头/捕获场景的 DirectX 内存图面共享

在 WDDM 2.1 中,引入了帧服务器组件,以便在多个进程中同时共享摄像头或捕获设备。 捕获的帧可以保存到一个内存位置,多个应用程序都可以从中读取,而无需在进程和协处理器之间多次复制图像数据。 此功能可为符合 WDDM 2.1 标准的硬件和驱动程序提供跨多个进程的高效捕获图片管理、节能、更低的带宽和减少延迟。 最终结果是提高应用程序和用户的性能。

帧服务器将捕获的图像分配为跨进程可共享内存,并将该内存共享给请求访问的进程。 由于帧服务器会将纹理广播给多个客户端进程,因此纹理必须支持并发读取。 为此,目前支持 NV12 纹理。

管道状态对象 (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

图形 INF 要求

与 WDDM 2.0 或以前的驱动程序相比,WDDM 2.1 图形驱动程序对 INF 的要求不尽相同:

  1. WDDM 2.1 必须具有与 WDDM 2.0 图形驱动程序 (D1) 相同的功能分数。

  2. WDDM 2.1 图形驱动程序必须使用不同的 OS INF 安装部分。

  3. WDDM 2.1 图形驱动程序 INF 更改用于“驱动程序存储”安装。

有关详细信息,请参阅 INF 文件部分和指令

32 位和 64 位驱动程序文件都将保留在驱动程序存储中,并从驱动程序存储中加载。 WoW64 文件系统重定向不适用于驱动程序存储。 如果需要,IHV 可以使用标准 INF 语法指定子文件夹,例如在唯一的驱动程序存储文件夹下创建 WoW64 文件夹。

以下示例显示了从驱动程序存储运行的 INF 支持与以前的行为有何不同。

WINDOWS 10 ANNIVERSARY EDITION APPROACH: RUNNING DRIVERS FROM THE DRIVER STORE
[DestinationDirs]
KMDCopyFiles = 13
UMDCopyFiles = 13
UMDWoW64CopyFiles = 13

[DDInstall]
CopyFiles=KMDCopyFiles
CopyFiles=UMDCopyFiles
CopyFiles=UMDWoW64CopyFile

[KMDCopyFiles]
myKMD.sys

[UMDCopyFiles]
myUMD64.dll
myOpenCL64.dll
myOpenGL64.dll

[UMDWow64CopyFiles]
myUMD32.dll
myOpenCL32.dll
myOpenGL32.dll

[DDInstall.Services]
AddService = serviceName, 0x00000002, serviceName_Service_Inst

[serviceName_Service_Inst]
ServiceBinary = %13%\serviceName.sys

[regAdd]
HKR,,UserModeDriverName,%REG_MULTI_SZ%,%13%\myUMD64.dll, %13%\myUMD64.dll, %13%\myUMD64.dll, %13%\myUMD64.dll
HKR,,UserModeDriverNameWoW,%REG_MULTI_SZ%, %13%\myUMD32.dll, %13%\myUMD32.dll, %13%\myUMD32.dll, %13%\myUMD32.dll
HKLM,"Software\Khronos\OpenCL\Vendors",%13%\myOpenCL64.dll,%REG_DWORD%,0x00000000
HKLM,"Software\Wow6432Node\Khronos\OpenCL\Vendors",%13%\ myOpenCL32.dll,%REG_DWORD%,0x00000000
HKR,,OpenGLDriverName,%REG_MULTI_SZ%,%13%\myOpenGL64.dll
HKR,,OpenGLDriverNameWoW,%REG_MULTI_SZ%,%13%\myOpenGL32.dll

要指定子文件夹,驱动程序可以使用如下示例所示的语法:

...
[DestinationDirs]
...
UMDWoW64CopyFiles = 13,WoW64
...
[regAdd]
...
HRK,, UserModeDriverNameWoW,%REG_MULTI_SZ%, %13%\WoW64\myUMD.dll, %13%\WoW64\myUMD.dll, %13%\

The manufacturer install section decoration for Windows 10 Anniversary edition WDDM 2.1 drivers is as follows: 
...
[Manufacturer]
%Grfx_Manf% =  IHVGfx, NTamd64.10.0…14310
...
[IHVGfx.NTamd64.10.0…14310]
; HW ID list
[list of HW IDs]

驱动程序版本控制

图形适配器或芯片集的驱动程序 DLL 和 SYS 文件必须具有正确格式的文件版本。

驱动程序信息文件 (.inf)、内核模式驱动程序 (.sys) 和用户模式驱动程序 (.dll) 文件的版本信息必须一致。 此外,.inf 的 [SignatureAttributes] 部分中标识为 PETrust 二进制文件的任何文件的版本信息必须与 .inf 一致。 建议驱动程序包中其他二进制文件的文件版本信息与 .inf 一致。

为了与旧版操作系统的当前文件版本要求保持一致,文件版本格式必须遵循 AA.BB.CCCCC.DDDDD 模式,其中:

  • AA 表示 .inf 中列出的功能最强大设备的驱动程序型号版本。

  • BB(适用于 WDDM 1.2 及更高版本的驱动程序)表示 .inf 中列出的功能最强设备的最高可用 D3D 功能级别

  • BB(适用于 WDDM 1.1 及更低版本的驱动程序)表示 .inf 中列出的功能最强大的设备所支持的最高可用 DDI 版本

  • CCCCC 是供应商选择的最多五位数的数字,从 0 到 65535 不等

  • DDDDD 是供应商选择的最多五位数的数字,从 0 到 65535 不等

AA 字段的值:

驱动程序模型 AA 值
WDDM v2.1 21
WDDM v2.0 20
WDDM v1.3 10
WDDM v1.2 9
WDDM v1.1 8
WDDM v1.0 7
XDDM 6

BB 字段的值(WDDM 1.2 及更高版本):

DirectX 功能级别 BB 值
12_x 21
12_1 20
12_0 19
11_1 18
11_0 17
10_1 16
10_0 15
9_3 14
9_2 14
9_1 14

BB 字段的值(WDDM 1.1 及更早版本):

DDI 版本 BB 值
功能级别 11_0 上的 D3D11-DDI 17
功能级别 10 上的 D3D11-DDI 16
D3D10-DDI 15
D3D9 DDI 14

示例

注意

不要求用前导零填充数字,即 123 不需要在 CCCCC 或 DDDDD 字段中表示为 00123。 在以前版本的 Windows OS 中,最后两个字段为 4 位数,即 CCCC.DDDD。 因此,Windows 10 和 WDDM 2.0 之前版本的驱动程序的示例只有 4 位数字。

  • Windows Vista WDDM 1.0:

    • D3D9 DDI 驱动程序可使用 7.14.0000.0000 至 7.14.9999.9999
    • D3D10 DDI 驱动程序可使用 7.15.0000.0000 至 7.15.9999.9999
  • Windows 7 WDDM 1.1:

    • D3D9 DDI 驱动程序可使用 8.14.0000.0000 至 8.14.9999.9999
    • D3D10 DDI 驱动程序可使用 8.15.0000.0000 至 8.15.9999.9999
    • 使用 FL_10_0 驱动程序的 D3D11 DDI 可使用 8.16.0000.0000 至 8.16.9999.9999
    • 使用 FL_11_0 驱动程序的 D3D11 DDI 可使用 8.17.0000.0000 至 8.17.9999.9999
  • Windows 8 WDDM 1.2:

    • FL_10_0 HW 可使用 9.15.0000.0000 到 9.15.9999.9999
    • FL_10_1 HW 可使用 9.16.0000.0000 到 9.16.9999.9999
    • FL_11_0 HW 可使用 9.17.0000.0000 到 9.17.9999.9999
    • FL_11_1 HW 可使用 9.18.0000.0000 到 9.18.9999.9999
  • Windows 8.1 WDDM 1.3:

    • FL_10_0 HW 可使用 10.15.0000.0000 到 10.15.9999.9999
    • FL_10_1 HW 可使用 10.16.0000.0000 到 10.16.9999.9999
    • FL_11_0 HW 可使用 10.17.0000.0000 到 10.17.9999.9999
    • FL_11_1 HW 可使用 10.18.0000.0000 到 10.18.9999.9999
  • Windows 10 WDDM 2.0:

    • FL_11_1 HW 可使用 20.18.0000.0000 到 20.18.65535.65535
    • FL_12_0 HW 可使用 20.19.0000.0000 到 20.19.65535.65535
    • FL_12_1 HW 可使用 20.20.0000.0000 到 20.20.65535.65535
  • Windows 10 WDDM 2.1:

    • FL_11_1 HW 可使用 20.18.0000.0000 到 21.18.65535.65535
    • FL_12_0 HW 可使用 20.19.0000.0000 到 21.19.65535.65535
    • FL_12_1 HW 可使用 20.20.0000.0000 到 21.20.65535.65535

强制

Windows 10 版本高于 10586 的 HLK 认证播放列表中的强制测试会执行本文规定的规则。 对于旧版本的 OS,测试为可选。 对于 10586 之后的 Windows 10 内部版本,WDDM 版本已更新为 2.1。 另一种查看方法是,强制要求只适用于为 WDDM 2.1 或更高版本生成的驱动程序。