4. 多Plane概念详解
在 KMS(Kernel Mode Setting)原子提交体系中,Plane 是承载像素数据的最小显示单元。一个 CRTC 可以扫描输出多个 Plane,每个 Plane 拥有独立的格式、位置、缩放与混合能力。理解 Plane 的分类与属性,是排查“画面不显示”“叠加层错位”“光标闪烁”等问题的前提。本节从 Plane 的三种典型角色出发,结合属性查询方法,建立多 Plane 的完整认知。
一、核心原理:Plane 的角色分工
DRM 框架将 Plane 抽象为可独立配置的图层,按功能定位通常分为三类:
- Primary Plane(主平面):每个 CRTC 必须绑定一个主平面,负责输出基础画面。它通常支持全屏尺寸、多种像素格式,是原子提交中
crtc->primary的默认承载者。主平面不可被禁用后仍保持 CRTC 活跃,否则屏幕会黑屏。 - Overlay Plane(叠加平面):用于视频播放、多窗口合成等场景,可叠加在主平面之上。它支持位置偏移、缩放和 Alpha 混合,数量因硬件而异。Overlay 的可用性受带宽、格式和缩放比例限制,配置失败时原子提交会返回
-EINVAL。 - Cursor Plane(光标平面):专用于硬件光标,尺寸通常固定为 64×64 或 128×128,支持 ARGB 格式。它独立于主画面更新,移动光标时无需重绘整个帧缓冲,能显著降低功耗。
关键点:Primary 决定“有没有画面”,Overlay 决定“能不能叠加”,Cursor 决定“光标是否流畅”。三者共享 CRTC 的扫描时序,但拥有独立的属性状态。
二、Plane 属性与能力查询方法
每个 Plane 在 sysfs 和 DRM 接口中暴露了丰富的属性。常用查询路径如下:
# 查看系统中所有 Plane 及其类型
ls /sys/class/drm/card0/plane-*/type
cat /sys/class/drm/card0/plane-*/type
# 查看某个 Plane 支持的格式
cat /sys/class/drm/card0/plane-51/format
# 使用 modetest 列出 Plane 能力
modetest -M rockchip -p
modetest -M rockchip -l # 列出所有 Plane 及其属性
# 通过 drm_info 查看详细属性
drm_info | grep -A 20 "Planes"
在代码层面,可通过 drmModeGetPlane() 和 drmModeGetPlaneResources() 获取 Plane 的 possible_crtcs、formats 和属性列表。原子提交前,必须用 drmModeAtomicAddProperty() 设置 FB_ID、CRTC_ID、SRC_X/Y、CRTC_X/Y、SRC_W/H、CRTC_W/H 等属性。
三、多 Plane 协作关系图解
四、案例场景:视频播放中的 Plane 分配
假设在 RK3588 平台上播放 1080p 视频,同时显示鼠标光标。典型的 Plane 分配如下:
- Primary Plane 绑定 UI 帧缓冲,格式为 XRGB8888,覆盖全屏 1920×1080。
- Overlay Plane 绑定视频帧,格式为 NV12,位置 (0,0),尺寸 1920×1080,zpos 设为 1。
- Cursor Plane 绑定 64×64 ARGB 光标,位置随鼠标移动更新。
原子提交时,内核会检查 Overlay 的缩放能力与带宽。若视频需要从 3840×2160 缩放到 1920×1080,而硬件 Overlay 不支持该比例,提交会失败并回退到 GPU 合成。此时可通过 drmModeAtomicCommit() 的返回值定位问题:
ret = drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_TEST_ONLY, NULL);
if (ret) {
fprintf(stderr, "Atomic test failed: %s\n", strerror(errno));
// 检查 plane 的 possible_crtcs 与格式支持
}
五、常见误区与复盘
| 误区 | 现象 | 正确做法 |
|---|---|---|
| 认为所有 Plane 都支持任意格式 | 设置 NV12 到 Cursor Plane 失败 | 查询 plane-*/format 确认支持列表 |
| 忽略 possible_crtcs 限制 | Plane 绑定到不兼容的 CRTC,提交返回 -EINVAL | 用 drmModeGetPlane() 检查 possible_crtcs 位掩码 |
| Overlay 缩放比例超限 | 视频画面花屏或提交失败 | 检查硬件缩放上限,必要时改用 GPU 合成 |
| Cursor 尺寸与硬件不匹配 | 光标显示为方块或偏移 | 读取 cursor_width/height 属性,按实际尺寸配置 |
排查多 Plane 问题时,优先使用 modetest -l 和 drm_info 确认每个 Plane 的 type、formats、possible_crtcs 和 zpos 范围。原子提交的 TEST_ONLY 标志可在不改变硬件状态的前提下验证配置合法性,是定位 Plane 冲突的首选手段。
掌握 Primary、Overlay、Cursor 三类 Plane 的职责边界与属性查询方法后,就能在原子提交中精准分配图层,快速定位“黑屏”“叠加失败”“光标异常”等典型故障。下一阶段将结合具体硬件平台,深入分析 Plane 带宽与原子提交的约束关系。