IddCx 1.10 及更高版本的更新
本文介绍 IddCx 版本 1.10 的更新。 根据 IddCx 1.10 生成的单个间接显示驱动程序 (IDD) 二进制文件可在 Windows 10(1803 及以上版本)上运行,使用运行时检查可验证 IddCx 1.10 中的 DDI 变更是否可在该系统上使用。 有关详细信息,请参阅为多个版本的 Windows 生成 WDF 驱动程序。
IddCx 1.10 的更改分为以下几类:
- 更新 IddCxGetVersion 版本(控制台和远程)。 有关 IddCx 相关版本信息的完整列表,请参阅 IddCx 版本。
- 添加对间接显示器的 HDR10(高动态范围)和 SDR(标准动态范围)宽色域 (WCG) 支持。
更新了 IddCxGetVersion 版本
IddCxGetVersion 返回的值已更新,但会因 OS 而异:
- Windows 11 版本 24H2 平台发行版会返回 0x1A80 (IDDCX_VERSION_GERMANIUM)。
- Windows 11 版本 22H2 9 月更新返回 0x1A00 (IDDCX_VERSION_SV3)。
对于 OS 行为略有不同的远程驱动程序来说,这种版本控制非常重要。
HDR 和 SDR 宽色域支持
有关 Windows 色彩(包括 SDR WCG)的一些入门信息,请参阅 DirectX 在 HDR 和 SDR 显示器上的高级色彩。
驱动程序 DDI 和 OS 支持
在可能的情况下,对现有的 DDI 进行了扩展,以允许驱动程序报告支持以下方面:
- HDR10
- SDR WCG
- 接收描述发送至 IDD 的任何 HDR 帧的数据
当现有的 DDI 无法扩展时,就会增加现有 DDI 的新变体。 在大多数情况下,这些更改既适用于控制台驱动程序,也适用于远程驱动程序,但也定义了一些专门针对远程驱动程序的详细信息。
支持 HDR 的 1.10 及更高版本驱动程序必须使用较新的 DDI 变体。 旧版驱动程序或不支持 HDR 的驱动程序可以继续使用现有函数。 本部分之后的章节将概述这些变化。
下表列出了 IddCx 1.10 中新增的由驱动程序实现的 DDI,如果以前有相应的 DDI,则会列出其名称。 如果驱动程序报告了这些函数,则 OS 可能会调用它们,即使适配器并未尝试支持 HDR。
*:远程驱动程序未调用函数。
**:远程驱动程序可能不会调用该函数,具体取决于驱动程序设置的适配器标志。
下表列出了 IddCx 1.10 中添加的 OS 实现的函数,并给出了以前的相应函数名称。 版本为 1.10 的驱动程序一旦确定这些函数在其运行的 OS 中可用,就可以调用较新的变体。
*:仅供远程驱动程序使用。
报告适配器 HDR 支持
1.10 及以上版本的驱动程序应设置 IDDCX_ADAPTER_FLAGS_CAN_PROCESS_FP16 添加到 IDDCX_ADAPTER_FLAGS 的标志,以报告对 FP16 表面的支持。 FP16 表面可用于 HDR10 或仅用于 SDR WCG。 设置该标志意味着驱动程序会执行启用 HDR10 或 SDR WCG 所需的一切操作,包括:
- 通过引入的 EVT_IDD_CX_ADAPTER_QUERY_TARGET_INFO 函数来报告目标功能
- 通过以下引入的函数来报告扩展模式信息:
- 仅通过 IddCxMonitorUpdateModes2 更新目标模式,而不再调用 IddCxMonitorUpdateModes
- 仅通过 IddCxMonitorQueryHardwareCursor3 查询游标详细信息,而不再调用 IddCxMonitorQueryHardwareCursor2 或 IddCxMonitorQueryHardwareCursor
- 处理 IddCxSwapChainReleaseAndAcquireBuffer2 提供的 FP16 桌面表面
- 使用 EVT_IDD_CX_MONITOR_SET_GAMMA_RAMP 接收到的 HDR 3x4 矩阵转换
- 向显示器发送 HDR 元数据。 此元数据在 EVT_IDD_CX_MONITOR_SET_DEFAULT_HDR_METADATA 或 IddCxSwapChainReleaseAndAcquireBuffer2 中发送
- 在适当的地方应用 SDR 白色等级;例如,鼠标光标。 SDR 白色等级包含在 IddCxSwapChainReleaseAndAcquireBuffer2 和 IddCxMonitorQueryHardwareCursor3 中
报告目标 HDR 功能
如果驱动程序希望为适配器启用 HDR,则必须通过其 EVT_IDD_CX_ADAPTER_QUERY_TARGET_INFO 函数提供有关每个目标连接器的附加信息。 需要特定于目标连接器的信息,因为只有部分可用目标可能支持 HDR 的某些方面。
HDR 元数据
当驱动程序提供包含 HDR 元数据的监视器描述符时,OS 会调用 EVT_IDD_CX_MONITOR_SET_DEFAULT_HDR_METADATA 向驱动程序提供默认的 HDR 元数据。 驱动程序必须保留此默认数据,并在向监视器发送 HDR10 信息帧 (SMPTE ST.2086) 时使用。 当驱动程序调用 IddCxSwapChainReleaseAndAcquireBuffer2 时,OS 也会提供 HDR 元数据信息。 如果此元数据显示应使用默认值,则是指已存储的默认数据。
在设置 HDR 模式后,OS 会在每一帧中发送 HDR 元数据状态。 此元数据通过引入的 IDDCX_METADATA2 结构来告诉驱动程序使用哪个 HDR 元数据。 元数据要么是一个新的元数据块,要么表示驱动程序应使用操作系统之前提供的默认元数据或与上一帧相同的元数据。
注意:HDR 元数据不会提供给远程驱动程序,因为任何 HDR10 元数据都应来自客户端的显示器子系统。
报告 HDR 模式
当显示器连接到目标时,OS 会询问驱动程序当前支持的显示器和目标模式。 为了正确播发 HDR 功能,需要为每种模式提供额外信息,因此 HDR 驱动程序必须公开以下在 v1.10 中引入的 DDI:
- EVT_IDD_CX_PARSE_MONITOR_DESCRIPTION2 返回 IDDCX_MONITOR_MODE2 结构的列表。
- EVT_IDD_CX_MONITOR_QUERY_TARGET_MODES2 返回 IDDCX_TARGET_MODE2 结构的列表。
这些扩展模式显示了可能使用的位深度和表面格式。 驱动程序还可以通过调用 IddCxMonitorUpdateModes2 来更新目标模式列表。
在报告任何模式之前,OS 会根据驱动程序 EVT_IDD_CX_ADAPTER_QUERY_TARGET_INFO 回调返回的信息,推断出 HDR 和 SDR WCG 的模式变体。
OS 会对模式进行验证,尝试检测出重复的模式,并将其合并为单一模式进行报告。 例如,如果目标支持 60 Hz 的 1080p 格式,而每个通道同时支持 8 位和 10 位,则应报告为单一模式。 但是,如果目标支持这些模式,但它们需要的带宽不同,则仍可分别报告这些模式。
添加的 gamma 类型
对现有的 EVT_IDD_CX_MONITOR_SET_GAMMA_RAMP DDI 进行了扩展,以便 OS 可以提供支持 HDR 显示器所需的 3x4 矩阵转换,以支持播发 HDR 支持的驱动程序。
SDR 白色等级
鼠标光标像素数据始终是 SDR。 当监视器设置为 HDR 模式时,SDR 白色等级必须应用于鼠标光标。 IddCx v.10 在两个地方提供了这种功能:
- 在调用 IddCxSwapChainReleaseAndAcquireBuffer2 时,它被添加到了驱动程序接收到的每帧元数据中。
- 它也是引入的 IddCxMonitorQueryHardwareCursor3 函数的一部分,因此驱动程序无需接收新的帧即可以正确的白色等级呈现光标更新。 默认 SDR 白色等级为 80 尼特。
表面颜色空间
即使驱动程序将颜色空间作为模式信息的一部分进行报告,OS 仍会在引入的 IDDCX_METADATA2 结构中报告特定帧使用的实际颜色空间。
使用远程驱动程序的 HDR
在可能的情况下,远程驱动程序的 OS 和驱动程序行为应与控制台驱动程序相同。 例外情况包括:
- HDR 元数据不提供给远程驱动程序。 客户端系统应根据物理连接的显示器提供这些元数据。 使用由服务器决定的元数据毫无意义。
- 3x4 颜色矩阵转换也不会发送。 同样,远程驱动程序也应使用客户端系统的等效数据。
- 远程驱动程序可提供色度数据和 SDR 白色等级,以供服务器使用。
- 远程驱动程序也可选择监控模式。 如果远程驱动程序设置了 IDDCX_ADAPTER_FLAGS_ALL_TARGET_MODES_MONITOR_COMPATIBLE 适配器标志,OS 就不会向其询问监视器模式,而是直接使用目标模式。 此功能允许驱动程序指定非正常模式,而无需报告等效的监视器模式;例如,基于客户端窗口大小而非监视器大小。
支持运行更低等级的 1.10 驱动程序
在旧版本 Windows 上运行的 1.10 版驱动程序需要采取几个步骤来确保兼容性。 具体而言,驱动程序必须:
- 继续导出所有现有函数,如 EVT_IDD_CX_PARSE_MONITOR_DESCRIPTION、EVT_IDD_CX_MONITOR_QUERY_TARGET_MODES 和 EVT_IDD_CX_ADAPTER_COMMIT_MODES。
- 使用 IDD_CX_CLIENT_CONFIG_INIT 宏来设置 IDD_CX_CLIENT_CONFIG 结构的大小。
- 不要尝试调用旧版本中没有的任何操作系统实现的函数。 使用 IDD_IS_FUNCTION_AVAILABLE 检查其可用性。
- v1.10 的所有函数都无法导出。 驱动程序可以使用 IDD_IS_FIELD_AVAILABLE 宏来检查是否应将 EvtIddCxXxx 回调写入 IDD_CX_CLIENT_CONFIG 结构中。
- IDD_IS_FIELD_AVAILABLE 还可以帮助驱动程序确定设置 IDDCX_ADAPTER_FLAGS_CAN_PROCESS_FP16 或 IDDCX_ADAPTER_FLAGS_ALL_TARGET_MODES_MONITOR_COMPATIBLE 是否安全。 如果 v1.10 DDI 中没有一个可用,则驱动程序就不应该设置该标志。
使用 IDD_IS_FIELD_AVAILABLE 的示例:
if (IDD_IS_FIELD_AVAILABLE(IDD_CX_CLIENT_CONFIG, EvtIddCxParseMonitorDescription2))
{
IddCxClientConfig.EvtIddCxParseMonitorDescription2 = ParseMonitorDescription2;
}
有关详细信息,请参阅生成 IddCx 1.4 驱动程序。