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)必须与信号源和接收端一致,否则会出现灰阶压缩或黑位发灰。
三、伽马校正与传递函数:数值到光的映射
显示器的电光转换并非线性。早期 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 的核心差异
| 维度 | SDR | HDR |
|---|---|---|
| 传递函数 | Gamma 2.2 / BT.1886 | PQ (ST 2084) / HLG |
| 峰值亮度 | 约 100 nits | 1000~10000 nits |
| 位深 | 8bit 为主 | 10bit / 12bit |
| 色域 | BT.709 | BT.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 显示,多用于广播。
下面这张图把从帧缓冲到屏幕的完整信号链串起来,帮助建立整体认知:
六、案例与常见误区
一个典型场景:用户报告 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。