Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(六)

发布于:2025-03-21 ⋅ 阅读:(30) ⋅ 点赞:(0)

将 Present 请求映射到硬件翻转队列时间戳

在特定适配器上启用硬件翻转队列时,时间戳会附带所有翻转调用。 换句话说,KMD 不需要处理旧和新的 DxgkDdiSetVidPnSourceAddress 语义的组合。

OS 会自动将基于间隔的现有 Present API 请求转换为对 KMD 的基于时间戳的翻转调用。 以下各节讨论了各种情况,以及如何映射到 KMD 接收的标志、持续时间和时间戳的组合。

撕裂和非字节翻转语义

启用硬件翻转队列时,撕裂翻转的语义在概念上是相同的。 达到 TargetFlipTime 后,KMD 会提交翻转以显示,同时仍遵循 FlipImmediate、FlipImmediateNoTearing 和 FlipOnNextVSync 等标志。 换句话说,KMD 表现得好像 OS 在 TargetFlipTime 以相同的翻转标志和参数向它提交了翻转。

例如,如果将 FlipOnNextVSync 设置为 1,并且 TargetFlipTime 位于帧中间,则翻转应仅显示在下一个 VSync 上。

FlipOverwrite 支持和硬件翻转队列

硬件翻转队列是翻转覆盖功能的严格超集,由 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVSync 值控制。

因此,如果驱动程序通过将 MaxHwQueuedFlips 设置为大于 1 的值选择进入硬件翻转队列,则 OS 将忽略 MaxQueuedMultiPlaneOverlayFlipVSync 值。

TargetFlipTime 过期的多次翻转
当给定 MPO 平面有多个排队翻转且 TargetFlipTime 已过期时,硬件显示队列必须选择最近排队的过期翻转并将其提交显示。 其余过期的翻转应被视为已取消,其相应的翻转队列日志项应包含 DXGK_HWFLIPQUEUE_TIMESTAMP_CANCELLED 作为 PresentTimestamp 值。

Duration 和 TargetFlipTime 之间的交互

当屏幕上显示此结构中指定的翻转时,DXGKARG_SETVIDPNSOURCEADDRESSWITHMULTIPLANEOVERLAY3 结构中的 Duration 参数应生效。 它为 VidPnSourceId 在所有平面上指定的输出指定新的所需显示刷新率行为。 在 WDDM 3.1 和 Windows Server 2022 版本中,为了简化不支持排队自定义 持续时间 更改的硬件的驱动程序实现,OS 仅在完成以前的翻转请求后提交具有新的 Duration 参数的翻转请求。

将 Present 间隔映射到 TargetFlipTime

刷新率固定时的映射间隔

若要保留现有 Present 间隔语义,OS 必须使用 Present 间隔和刷新率计算目标翻转时间。 但是,将目标翻转时间完全设置为预期的 VSync 时间,翻转应命中屏幕会导致频繁出现故障。 这些故障是由于实际 VSync 计时偏移一点时错过的 VSync。 为了防止出现故障,OS 从计算的目标翻转时间中减去一半的 VSync 间隔。

以下是将 Present 间隔映射到目标翻转时间的简化公式:

TargetFlipTime = PreviousFlipStartVSyncTime + (PreviousFlipPresentInterval * FixedRefreshRate) - (FixedRefreshRate / 2)

存在虚拟刷新率 WDDM 2.9 功能时的映射间隔

虚拟刷新速率功能可能会暂时将显示刷新率提升到当前刷新速率的整数倍数(即 24 Hz 可以提升到 144 Hz 或 192 Hz)。 对于能够支持此提升的设备,上一节中的公式被修改为使用当前刷新率的最快倍数:

TargetFlipTime = PreviousFlipStartVSyncTime + (PreviousFlipPresentInterval * FixedRefreshRate) - (FastestRefreshRate / 2)

将刷新率更改为非ultiple 时的映射间隔

当刷新速率更改为当前刷新速率的非多余时(例如,从 24 Hz 更改为 60 Hz),OS 需要检查队列翻转以查看其计算目标时间是否仍然对新的刷新率有效。 如果需要更改目标翻转时间,OS 将取消排队翻转,并使用新计算的目标翻转时间重新排队。


网站公告

今日签到

点亮在社区的每一天
去签到