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 等回调函数。
DRM 架构分层 用户空间接口层 (Userspace API) libdrm / dumb buffer / atomic ioctl / mode setting ioctl 核心抽象层 (DRM Core) drm_mode_config / drm_crtc / drm_encoder / drm_connector / drm_plane Atomic State / Gamma LUT / Color Management Properties 硬件驱动层 (Driver) crtc_helper_funcs / encoder_helper_funcs / plane_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 的端到端配置。
KMS 核心对象关系与显示流水线 Plane 图层合成 色彩格式转换 CRTC 显示控制器 Gamma LUT CTM Degamma LUT Encoder 信号编码 接口适配 Connector 物理接口 EDID 显示流水线数据流 Framebuffer → Plane (合成/格式转换) → CRTC (Gamma/CTM) → Encoder (编码) → Connector (输出) 色彩管理在 Plane 和 CRTC 两个阶段均可介入

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。
Atomic 接口色彩管理配置流程 1. 创建 Atomic 请求 drmModeAtomicAlloc() 2. 添加属性 drmModeAtomicAddProperty() 3. 提交事务 drmModeAtomicCommit() 可添加的色彩管理属性 • CRTC: GAMMA_LUT (blob id), DEGAMMA_LUT (blob id), CTM (blob id) • Plane: COLOR_ENCODING (enum), COLOR_RANGE (enum) • Connector: HDR_OUTPUT_METADATA (blob id) — 用于 HDR 色彩管理

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 提供输出色彩空间和目标设备特性。三者协同工作才能实现端到端的色彩管理流水线。