Microsoft计算驱动程序模型概述
在 Windows 10 版本 1903(WDDM 2.6)及更高版本中,Microsoft计算驱动程序模型(MCDM)可用于为支持仅计算功能的设备编写驱动程序。
MCDM 驱动程序或仅计算驱动程序是 Windows 显示驱动程序模型 2.0+ (WDDM)的缩减子集。 在 WDDM 术语中,驱动程序必须将自身播发为 “仅呈现”设备,而无需显示功能。 “呈现设备”的内核支持很灵活,因为设备执行的呈现命令对 WDDM 不透明。 换句话说,WDDM 可以使用不透明的命令缓冲区设计轻松支持任何类型的设备。
与 WDDM 不同,MCDM 要求设备具有内存管理单元(MMU)。 MCDM 设备的引擎不需要 物理模式。 相反,MCDM 设备必须使用虚拟地址空间保护来支持存在恶意应用程序时进行多任务处理。
如果没有 MMU,则存在支持原型 MCDM 硬件的异常。 从 Windows 10 版本 2004 开始,原型 MCDM 设备一次只能由一个进程使用。 这些设备通过缺少支持 IOMMU 或 GPU-MMU 来识别。
有关详细信息,请参阅以下文章:
- MCDM 体系结构
- MCDM KM 驱动程序实施指南
有关仅计算驱动程序可在用户模式下公开的 Direct3D 12 功能的子集的信息,请参阅 Direct3D 12 Core 1.0 功能级别。如:
创建核心设备
一般来说,要创建 Direct3D 12 设备,需要调用 D3D12CreateDevice 函数,并指定最低功能级别。
如果指定的功能级别为 9 到 12,那么返回的设备就是功能丰富的设备,如传统 GPU(支持核心设备的超集功能)。 对于该范围的功能级别,从未返回过核心设备。
另一方面,如果指定了核心功能级别(例如,D3D_FEATURE_LEVEL::D3D_FEATURE_LEVEL_1_0_CORE),那么返回的设备可能是功能丰富的设备,也可能是核心设备。
// d3dcommon.h
D3D_FEATURE_LEVEL_1_0_CORE = 0x1000
如果指定 _CORE
功能级别,运行时/调试层将验证应用程序使用的功能是否为 _CORE
功能级别所允许。 本主题稍后将对这组功能进行定义。
核心设备的着色器模型
核心设备支持着色器模型 5.0+。
运行时会将 5.x 非 DXIL 着色器模型转换为 6.0 DXIL。 因此,驱动程序只需支持 6.x。
核心设备的资源管理模型
- 支持的资源维度:仅限原始和结构化缓冲区(不支持类型化缓冲区、texture1d/2D 等)
- 不支持保留(平铺)资源
- 不支持自定义堆
- 不支持任何这些堆标志:
- D3D12_HEAP_FLAG_HARDWARE_PROTECTED
- D3D12_HEAP_FLAG_ALLOW_WRITE_WATCH
- D3D12_HEAP_FLAG_ALLOW_DISPLAY
- D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS(注意着色器原子是必需的,该标志用于另一项功能,即跨适配器原子)
核心设备的资源绑定模型
- 仅支持资源绑定第 1 层
- 例外:
- 不支持纹理采样器
- 支持 64 个 UAV,如功能等级 11.1+(而不是只有 8 个)
- 在着色器通过描述符访问资源时,不必对其实施边界检查,因为越界访问会产生未定义的行为。
- 作为副产品,不支持根签名中的描述符范围标志 D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS。
UAV/CBV 描述符只能在默认堆中的资源上创建(因此没有上传/读回堆)。 这将强迫应用程序在 CPU<->GPU 之间复制数据。
尽管这是绑定能力最低的层级,但即使在这一层级中,仍有一些必要的功能值得一提:
描述符堆可在记录命令列表后更新(请参阅资源绑定规范中的 D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE)
根描述符基本上是 GPUVA 指针
即使不支持 MMU / VA,也可以通过地址修补来模拟根描述符中使用的缓冲区 VA。
结构化缓冲区限制
结构化缓冲区的基址必须是 4 字节对齐,步幅必须是 2 或 4 的倍数。 步幅为 2 的情况适用于具有 16 位数据的应用,特别是考虑到 D3D_FEATURE_LEVEL_1_0_CORE 中不支持类型缓冲区。
描述符中指定的步幅必须与 HLSL 中指定的步幅一致。