4. DRM/KMS 框架概述:架构分层与色彩管理数据结构
DRM (Direct Rendering Manager) 是 Linux 内核中负责图形显示和渲染的子系统。KMS (Kernel Mode Setting) 是 DRM 的核心部分,负责显示模式设置、平面合成、Gamma 校正和色彩管理。理解 DRM/KMS 的架构分层和核心对象角色,是配置 CRTC Gamma 校正和色彩管理的基础。
4.1 DRM 架构分层
DRM 框架从上到下分为三层:用户空间接口层、核心抽象层和硬件驱动层。每一层都有明确的职责边界。
架构要点: 用户空间通过 ioctl 或 dumb buffer 与内核交互;核心层提供通用对象模型和状态管理;驱动层实现具体的硬件寄存器操作。
关键概念: DRM 核心层维护所有 KMS 对象的
drm_mode_config 全局状态,驱动层只需实现 struct drm_crtc_helper_funcs 等回调函数。
4.2 核心 KMS 对象角色
KMS 框架定义了四个核心对象:CRTC、Encoder、Connector 和 Plane。它们共同构成显示流水线。
| 对象 | 角色 | 色彩管理职责 |
|---|---|---|
| CRTC | 显示控制器,负责扫描输出、时序生成、Gamma 校正 | Gamma LUT、CTM (Color Transformation Matrix)、Degamma LUT |
| Encoder | 编码器,将 CRTC 输出的像素数据编码为特定接口信号 | 通常不直接参与色彩管理,但可能影响输出色彩空间 |
| Connector | 物理连接器,代表显示接口(HDMI、DP、VGA 等) | EDID 色彩特性、色彩空间信息、HDR 静态元数据 |
| Plane | 硬件平面,负责图层合成、缩放、色彩格式转换 | 每个 Plane 可独立设置色彩属性(如 color_encoding、color_range) |
常见误区: 初学者常误认为色彩管理只由 CRTC 完成。实际上,Plane 层的色彩格式转换和 Connector 的 EDID 色彩空间信息同样关键。完整的色彩管理需要从 Plane 到 CRTC 再到 Connector 的端到端配置。
4.3 色彩管理相关数据结构
DRM 核心层定义了一系列与色彩管理相关的数据结构,它们通过 property 机制暴露给用户空间。以下是关键结构体及其字段说明。
4.3.1 struct drm_crtc 中的色彩管理字段
struct drm_crtc {
struct drm_device *dev;
struct drm_mode_object base;
/* Gamma LUT 相关 */
struct drm_property_blob *gamma_lut; // Gamma 校正查找表
struct drm_property_blob *degamma_lut; // Degamma 查找表(可选)
struct drm_property_blob *ctm; // 色彩变换矩阵
/* 色彩管理属性 */
struct drm_property *gamma_lut_property;
struct drm_property *degamma_lut_property;
struct drm_property *ctm_property;
/* 其他字段省略 */
};
4.3.2 struct drm_color_lut 查找表结构
struct drm_color_lut {
__u16 red; // 红色通道值 (0-65535)
__u16 green; // 绿色通道值 (0-65535)
__u16 blue; // 蓝色通道值 (0-65535)
__u16 reserved; // 保留位
};
重要说明: Gamma LUT 的大小由硬件决定,通常为 256 或 1024 个条目。用户空间通过
drmModeCreatePropertyBlob 创建 blob,然后通过 atomic ioctl 设置到 CRTC 的 GAMMA_LUT 属性。
4.3.3 struct drm_color_ctm 色彩变换矩阵
struct drm_color_ctm {
/*
* 3x3 矩阵,以 S31.32 定点格式存储
* 矩阵排列顺序:row-major
* matrix[0] = c00, matrix[1] = c01, matrix[2] = c02
* matrix[3] = c10, matrix[4] = c11, matrix[5] = c12
* matrix[6] = c20, matrix[7] = c21, matrix[8] = c22
*/
__s64 matrix[9];
};
4.3.4 Plane 层色彩属性
| 属性名 | 类型 | 说明 |
|---|---|---|
COLOR_ENCODING |
enum | 色彩编码标准:ITU-R BT.601、BT.709、BT.2020 等 |
COLOR_RANGE |
enum | 色彩范围:limited (16-235) 或 full (0-255) |
COLOR_SPACE |
enum | 色彩空间:sRGB、AdobeRGB、DCI-P3 等(部分驱动支持) |
4.4 色彩管理属性与 Atomic 接口
现代 DRM 驱动推荐使用 Atomic API 进行色彩管理配置。Atomic 接口允许在一次事务中同时设置多个属性,保证状态切换的原子性。
实践建议: 使用
drm_atomic_state 和 drm_atomic_commit 进行色彩管理配置。避免直接操作 legacy 的 drmModeCrtcSetGamma 接口,因为 legacy 接口不支持 Degamma 和 CTM。
4.5 数据结构关系总结
下表总结了色彩管理相关数据结构与 KMS 对象的对应关系:
| 数据结构 | 所属对象 | 属性名 | 作用阶段 |
|---|---|---|---|
drm_color_lut |
CRTC | GAMMA_LUT | 输出前 Gamma 校正 |
drm_color_lut |
CRTC | DEGAMMA_LUT | 输入 Degamma 校正 |
drm_color_ctm |
CRTC | CTM | 色彩空间变换 |
enum |
Plane | COLOR_ENCODING | 色彩编码标准 |
enum |
Plane | COLOR_RANGE | 色彩量化范围 |
drm_hdr_metadata |
Connector | HDR_OUTPUT_METADATA | HDR 静态元数据 |
核心要点: CRTC 是 Gamma 校正和色彩变换的主战场,Plane 负责输入色彩格式的标准化,Connector 提供输出色彩空间和目标设备特性。三者协同工作才能实现端到端的色彩管理流水线。