2. 显示基础

在进入 DRM 驱动的 HDR 支持与 VBlank 同步调试之前,必须先建立一套“显示管线语言”。驱动里出现的 DRM_FORMAT_*、color_encoding、color_range、max_luminance、eotf 等属性,本质上都在描述同一件事:一块帧缓冲中的数值,如何被解释成屏幕上真实的光。如果这一步理解错位,后续的 HDR 元数据配置、色调映射和 VBlank 时序调试都会建立在错误前提上。

一、像素格式:数值的排布方式

像素格式回答的是“每个像素在内存里怎么放”。它包含三个维度:通道构成(RGB、YUV、灰度)、每通道位深(8/10/12 bit)、以及打包方式(packed、planar、semi-planar)。例如 DRM_FORMAT_XRGB8888 是 32 位打包、忽略 Alpha 的 8bit RGB;DRM_FORMAT_NV12 是 Y 平面加交错 UV 平面的 8bit YUV 4:2:0;而 HDR 常用的 DRM_FORMAT_XRGB2101010 则是每通道 10bit、打包进 32 位字中。

位深直接决定量化精度。8bit 每通道只有 256 级,在暗部容易产生色带(banding);10bit 提升到 1024 级,是当前 HDR 内容的主流选择。需要特别注意的是,像素格式只描述存储结构,不描述数值含义——同样是 10bit 数值,按 SDR gamma 解释还是按 PQ 曲线解释,结果完全不同。

二、色彩空间与色度:颜色从哪里来

色彩空间定义了颜色的坐标系统,常见的有 BT.601、BT.709、BT.2020。它们规定了三原色坐标和白点,决定了色域三角形的大小。BT.709 是 SDR 高清时代的基准,BT.2020 覆盖了更广的色域,是 UHD HDR 的目标容器。

亮度与色度则来自 YCbCr 的分离表示:Y 表示亮度(luma),Cb/Cr 表示色度(chroma)。人眼对亮度远比对色度敏感,因此可以“色度下采样”来节省带宽,这就是 4:4:4、4:2:2、4:2:0 的由来。在驱动调试中,color_encoding(BT.709 / BT.2020)和 color_range(limited 16-235 / full 0-255)必须与信号源和接收端一致,否则会出现灰阶压缩或黑位发灰。

调试口诀:先确认像素格式(怎么存),再确认色彩空间(怎么解释),最后确认范围(limited 还是 full)。三者任一错配,画面都会“看起来不对”。

三、伽马校正与传递函数:数值到光的映射

显示器的电光转换并非线性。早期 CRT 的亮度响应近似幂函数,因此引入了伽马校正。今天我们用更通用的“传递函数”来描述:

  • EOTF(电光转换函数):把编码数值转成实际光输出,是显示端做的事。
  • OETF(光电转换函数):把场景光转成编码数值,是采集/制作端做的事。
  • SDR 使用 gamma 2.2 或 BT.1886,峰值亮度约 100 nits。
  • HDR 使用 PQ(SMPTE ST 2084)或 HLG,PQ 可表达约 10000 nits 的绝对亮度。

关键差异在于:SDR 的 gamma 是相对的,屏幕多亮就整体缩放;PQ 是绝对的,编码值直接对应目标亮度。这就是为什么 HDR 调试必须传递 max_luminance、max_avg_luminance 等元数据——显示端需要知道“这个数值应该发多亮”。

四、HDR 与 SDR 的核心差异

维度SDRHDR
传递函数Gamma 2.2 / BT.1886PQ (ST 2084) / HLG
峰值亮度约 100 nits1000~10000 nits
位深8bit 为主10bit / 12bit
色域BT.709BT.2020
元数据通常无静态 (HDR10) / 动态 (HDR10+)
亮度语义相对绝对(PQ)

在 DRM 中,这些差异体现为连接器属性:HDR_OUTPUT_METADATA、max bpc、Colorspace 等。驱动需要把用户空间的元数据正确下发到硬件,并在不支持时做色调映射(tone mapping)降级。

五、常见 HDR 标准概述

工程中最常遇到的标准有:

  • HDR10:PQ + BT.2020 + 10bit,静态元数据(MaxCLL/MaxFALL),最广泛。
  • HDR10+:在 HDR10 基础上增加逐场景/逐帧动态元数据。
  • Dolby Vision:动态元数据 + 专有处理,通常需要授权与专用硬件路径。
  • HLG:BBC/NHK 提出,兼容 SDR 显示,多用于广播。

下面这张图把从帧缓冲到屏幕的完整信号链串起来,帮助建立整体认知:

显示信号链:从帧缓冲到屏幕光输出 帧缓冲 XRGB2101010 NV12 / P010 像素格式 通道 / 位深 / 打包 DRM_FORMAT_* 色彩空间 BT.709 / BT.2020 limited / full 传递函数 Gamma 2.2 / PQ HLG / BT.1886 HDR 元数据 MaxCLL / MaxFALL / mastering display / 动态元数据 显示引擎 / 合成器 色调映射 / 混合 / 缩放 连接器 / 编码器 HDMI / DP / eDP 显示面板 EOTF 还原 → 光输出 像素格式决定“怎么存”,色彩空间与传递函数决定“怎么解释”,元数据决定“怎么显示”

六、案例与常见误区

一个典型场景:用户报告 HDR 视频播放时“画面发灰、暗部细节丢失”。排查路径如下:

# 查看连接器支持的属性
modetest -c -p

# 关键属性输出示例
HDR_OUTPUT_METADATA: blob_id=0
max bpc: 8          <-- 若为 8,HDR 10bit 被截断
Colorspace: Default <-- 应为 BT2020_RGB 或 BT2020_YCC
color_range: Limited

常见误区包括:

  • 把像素格式当成色彩空间:XRGB2101010 只说明 10bit 打包,不代表它是 HDR。
  • 忽略 color_range:limited 与 full 混用会导致黑位抬升或裁切。
  • 认为 PQ 可以自动适配亮度:PQ 是绝对亮度,必须配合正确的元数据和面板能力。
  • 在 8bit 链路上强行开 HDR:量化不足会产生严重色带,应先确认 max bpc。
调试 HDR 时,务必先确认链路每一级(应用 → DRM 属性 → 编码器 → 面板)的位深、色彩空间、传递函数和范围是否一致。任何一级降级,都会让最终画面偏离预期。