DDI 支持
添加了以下 DDI 以支持硬件翻转队列功能。
检查功能可用性
硬件翻转队列需要 OS 启用/禁用协商。 支持硬件翻转队列的 KMD 必须在设备启动期间首先调用DXGKCB_QUERYFEATURESUPPORT,其中 FeatureId 为 DXGK_FEATURE_HWFLIPQUEUE,以确定 OS 是否允许启用硬件翻转队列。
仅当回调成功且启用设置为 TRUE 时,才能使用硬件翻转队列。
KMD 可以在硬件翻转队列启动和试验阶段使用以下示例代码。
DXGKARGCB_QUERYFEATURESUPPORT HwFlipQueueEnabledArgs = {};
HwFlipQueueEnabledArgs.DeviceHandle = DeviceHandle;
HwFlipQueueEnabledArgs.FeatureId = DXGK_FEATURE_HWFLIPQUEUE;
HwFlipQueueEnabledArgs.DriverSupportState = DXGK_FEATURE_SUPPORT_EXPERIMENTAL;if (!NT_SUCCESS(pDxgkInterface->DxgkCbQueryFeatureSupport(&HwFlipQueueEnabledArgs)) ||!HwFlipQueueEnabledArgs.Enabled)
{// Disable hardware flip queue because the OS didn't allow it.
}
else
{// Enable hardware flip queue because the OS allowed it.
}
在驱动程序启动期间,即使可以在不启用 GPU 硬件调度的情况下启用硬件翻转队列,这种组合也不被官方支持。 Windows 目前需要启用 GPU 硬件计划,以便在正式发布的驱动程序上启用基本硬件翻转队列。
指示硬件队列功能
MaxHwQueuedFlips 已添加到 DXGK_DRIVERCAPS,以指示硬件翻转队列支持。 如果 OS 允许的硬件翻转队列支持,则支持硬件翻转队列的 KMD 应将 MaxHwQueuedFlips 设置为大于 1 的值。 当 MaxHwQueuedFlips 大于 1 时,KMD 指示显示硬件最多支持 MaxHwQueuedFlips 个未来帧,这些帧可以在 GPU 上为给定的 VidPnSource 排队显示。 OS 遵循驱动程序提供的限制,这些翻转类型可以提前排队。
HwQueuedFlipCaps 也添加到 DXGK_DRIVERCAPS。 此成员当前保留供系统使用;驱动程序不应使用它。
翻转目标时间和目标时间戳格式
当 OS 向硬件翻转队列提交翻转请求时,它还会发送目标翻转时间。 在达到目标翻转时间后,用户可以看到翻转。
OS 使用从 KeQueryPerformanceCounter 获取的 CPU 时钟计数器单元传递目标帧时间并解释实际帧时间。
提交排队翻转
传递给 KMD 的 DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3 回调函数的 DXGKARG_SETVIDPNSOURCEADDRESSWITHMULTIPLANEOVERLAY3 结构被修改如下,以允许提交排队翻转:
- 以下三个成员被添加到 OutputFlags 的 DXGK_SETVIDPNSOURCEADDRESS_OUTPUT_FLAGS 结构中。( 有关这些成员的详细信息,请参阅DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3 重试和失败案例。)
- HwFlipQueueDrainNeeded
- HwFlipQueueDrainAllPlanes
- HwFlipQueueDrainAllSources
- 添加了 TargetFlipTime 成员。 TargetFlipTime 描述以 QPC 为单位的目标翻转时间。 当时钟达到这个值时,帧可以被发送到显示器,同时遵循 VSync 和撕裂标志。 如果存在以前排队的挂起翻转,OS 保证对于翻转请求引用的每个 MPO 平面, TargetFlipTime 大于或等于此平面的任何挂起翻转目标时间。 换言之,可以有一系列时间戳相同或不断增加的翻转,但不可能有一个时间戳倒退的序列。