WDDM 3.0 之前的翻转队列模型
许多新式显示控制器支持对按顺序显示的多个帧排队的能力。 从 WDDM 2.1 开始,OS 支持将在下一个 VSync 中显示的多个未完成的翻转覆盖请求。 显示微型端口驱动程序 (KMD) 通过 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVSync 值来表示这种支持。 此功能对于减少高帧速率游戏方案中的延迟非常有用,在这种方案中,多个帧以间隔 0 依次呈现,目的是只显示最近的帧。
在视频播放方案中,要按顺序显示的多个未来帧的内容是预先已知的,并且可以排队到 GPU。 这种提前排队允许 CPU 在处理排队帧时进入低功率状态,从而节省大量电源。 但是,在 WDDM 3.0 之前,OS 没有机制提交需要在屏幕上保留至少一个 VSync 间隔的帧,而无需进一步的 CPU 干预。 基本硬件翻转队列一节介绍了一种解决方案,该解决方案使 CPU 能够进入低功耗状态,并将排队的帧处理卸载到 GPU。
在 WDDM 3.0 之前的游戏方案中,GPU 完成将场景呈现到交换链后缓冲区后,会有一个到 CPU 的往返,以便将请求提交以将帧内容呈现到屏幕。 对于接近 VSync 的繁重 GPU 工作负荷,此往返可能会导致帧延迟并错过预期目标时间,从而导致可观察的帧故障。 “高级硬件翻转队列”部分引入了一种机制,用于避免此 CPU 往返,并将已完成的帧呈现给屏幕且延迟较低。 高级硬件翻转队列要求同时具有基本硬件翻转队列和 GPU 硬件计划阶段 2 功能。
基本硬件翻转队列
下图演示了呈现三个帧的情况,每个帧在屏幕上停留一个 VSync 间隔
示意图中的填充图案显示了 Dxgkrnl 软件翻转队列处理和应用程序线程必须唤醒并执行 CPU 工作的时间。 在每个 VSync 上,显示控制器必须向 OS 发出完成翻转的 CPU 通知,并且 OS 必须提交下一个翻转请求。 应用程序还必须在每个 VSync 上唤醒,并查询当前统计信息,以最终了解三帧中的最后一帧何时显示。
从 WDDM 3.0 开始,提供了可以向显示控制器队列提交多个未来帧的硬件翻转队列 DDI。 如前所述,此机制允许 GPU 的 CPU 和部分在显示控制器处理多个排队帧时转换到较低电源状态。 此转换可提高支持硬件的视频播放方案的电源效率。
下图说明了建议的体系结构。
借助硬件翻转队列方法,应用程序和 Dxgkrnl CPU 组件在 v2 和 v4 时间之间的两个 VSync 间隔内处于完全空闲状态,从而使 CPU 能够进入低功耗状态。 只有当应用程序请求等待的帧 N+2 完成时,CPU 才会得到通知。
高级硬件翻转队列
在 WDDM 3.0 之前的游戏方案中,GPU 完成将场景呈现到交换链后缓冲区后,会有一个到 CPU 的往返,以便将请求提交以将帧内容呈现到屏幕。 下图显示了此方案。
如果呈现完成得离 VSync 太近,这种往返的代价可能会导致帧错过目标,如下图所示。
一些显示器控制器本身支持等待条件,允许显示在 GPU 完成呈现帧时提交翻转请求,而无需 CPU 往返。 由于硬件翻转队列可以将已完成的帧 N 提交到没有 CPU 往返的显示器,因此它可能会避免错过的帧,如下图所示: