GPU 抢占

从Windows 8开始,可以使用较新的 GPU 抢占模型。 在此模型中,操作系统不再允许禁用 GPU 直接内存访问 (DMA) 数据包抢占,并保证在启动 超时检测和恢复 (TDR) 进程之前将抢占请求发送到 GPU。

要求 说明
最低 Windows 显示驱动程序模型 (WDDM) 版本 1.2
最大 Windows 版本 8
驱动程序实现 - 全图形和仅呈现 必需
WHLK 要求和测试 Device.Graphics...抢占测试Device.Graphics...FlipOnVSyncMmIo

如果无法成功抢占长时间运行的数据包,可能会延迟高优先级 GPU 工作,例如桌面窗口管理器 (DWM) 所需的工作,从而导致窗口转换和动画期间出现故障。 此外,长时间运行的无法抢占的 GPU 数据包可能会导致 TDR 进程重复重置 GPU,最终可能会出现系统错误检查。

注意所有 WDDM 1.2 显示微型端口驱动程序都必须支持Windows 8抢占模型。 但是,在运行时,WDDM 1.2 驱动程序还可以拒绝Windows 8抢占模型,并保留 Microsoft DirectX 图形内核子系统计划程序提供的 Windows 7 行为。

GPU 抢占设备驱动程序接口 (DDI)

以下设备驱动程序接口 (DDI) 可用于显示微型端口驱动程序来实现Windows 8 GPU 抢占模型。

显示微型端口驱动程序实现

按照以下常规步骤在显示微型端口驱动程序中实现 Windows 8 GPU 抢占模型:

  1. 根据 具有 DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8 的标头编译驱动程序。
  2. 通过将 DXGK_VIDSCHCAPS 结构的 PreemptionAwareMultiEngineAware 成员设置为 1 来声明对 Windows 8 GPU 抢占模型的支持。 若要支持 Windows 7 抢占模型,请将 PreemptionAware 设置为零。
  3. D3DKMDT_PREEMPTION_CAPS 结构中指定支持的抢占粒度级别,这将从 D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITYD3DKMDT_COMPUTE_PREEMPTION_GRANULARITY 枚举中获取常量值。
  4. 如果硬件支持延迟上下文切换,请将零长度缓冲区提交到 DxgkDdiSubmitCommand 函数,并将 pSubmitCommand-Flags-ContextSwitch>> 成员设置为 1。 请注意DXGK_SUBMITCOMMANDFLAGS结构的 ContextSwitch 成员下的讨论。
  5. 通过调用 DxgkCbCreateContextAllocation 函数来设置 GPU 上下文分配和设备上下文分配。 请注意函数的“备注”中提供的具体说明和限制。
  6. 调用 DxgkCbDestroyContextAllocation 函数以销毁使用 DxgkCbCreateContextAllocation 创建的 GPU 上下文分配和设备上下文分配。
  7. 准备 DMA 缓冲区以响应对 DxgkDdiBuildPagingBuffer 函数的调用时,通过填充 DXGKARG_BUILDPAGINGBUFFER 结构中的 InitContextResource 内部结构来初始化上下文资源。 如果逐出或重定位上下文资源,视频内存管理器将保留上下文资源的内容。
  8. 驱动程序必须在下一次垂直同步上支持内存映射 I/O 翻转。在Windows 8中,即使翻转挂起,GPU 计划程序也会尝试抢占硬件。 因此,为了防止撕裂和呈现项目,驱动程序必须支持内存映射的 I/O 翻转模型,必须将 DXGK_FLIPCAPS 结构的 FlipOnVSyncMmIo 成员设置为 1 并支持 FlipOnVSyncMmIo 下所述的操作。

实现中的内存映射注意事项

按照以下指南创建支持Windows 8 GPU 抢占模型并提供优质用户体验的可靠驱动程序:

  • 当 DirectX 图形内核 (Dxgkrnl) 计划程序发送抢占命令时,请求 GPU 中的 DMA 缓冲区抢占。 具有更精细粒度的中间 DMA 缓冲区抢占的硬件设备应能产生更好的客户体验。
  • 允许重复使用分页命令围栏 ID:如果抢占请求导致在硬件队列中抢占分页命令,Dxgkrnl 计划程序将使用最初用于它们的相同围栏 ID 重新提交已抢占的分页命令,并且分页命令将在该引擎上的任何其他命令之前进行计划。 非分页命令将使用新分配的围栏 ID 重新提交。
  • 为拆分的 DMA 缓冲区提供修补程序位置列表,请参阅 拆分 DMA 缓冲区
  • 验证模式称为绑定泄漏检测,可用于遍历修补程序位置列表并拒绝未取消绑定或未为每个拆分数据包重新编程分配的数据包。 某些硬件支持虚拟地址,允许额外的间接级别,使此验证变得不必要。 在这种情况下,若要指示驱动程序选择退出验证模式,请将 DXGK_VIDSCHCAPS 结构的 NoDmaPatching 成员设置为 1。
  • 在 Windows 7 中,Dxgkrnl 计划程序保证按顺序执行对应于同一呈现命令的所有拆分 DMA 数据包,而无需切换到另一个呈现上下文。 在Windows 8抢占模型中,计划程序可以在对应于同一呈现命令的两个拆分数据包之间从不同的上下文执行呈现数据包。 因此,意识到抢占的驱动程序应以与常规完整数据包提交相同的方式处理拆分/部分 DMA 数据包提交。 具体而言,对于此类提交,必须在边界处保存或还原 GPU 状态。
  • 抢占感知驱动程序在链接显示适配器 (LDA) 模式下广播到多个适配器时,不得更改拆分的 DMA 缓冲区的内容,其中多个物理 GPU 链接形成单个更快的虚拟 GPU。 这是因为,在Windows 8抢占模型中,Dxgkrnl 计划程序不再保证在不切换到另一个上下文的情况下同步执行拆分数据包序列。 更改拆分 DMA 数据包内容的驱动程序会损害数据包数据的完整性,因为如果数据包在另一个引擎上执行,它将在 DMA 缓冲区数据的同一副本上运行。
  • 在 Windows 8 GPU 抢占模型中,Dxgkrnl 计划程序为具有关联的“提交时信号”同步基元的数据包启用抢占。 如果设备将“提交时信号”同步基元与基于硬件的等待状态结合使用,它必须支持在满足等待条件之前抢占等待指令的功能。

硬件认证要求

有关硬件设备在实现此功能时必须满足的要求的信息,请参阅 Device.Graphics... 上的相关 WHCK 文档。抢占测试和Device.Graphics...FlipOnVSyncMmIo

有关使用 Windows 8 添加的功能的回顾,请参阅 WDDM 1.2 功能。