1. 课程导入
在嵌入式设备、桌面发行版、车载座舱与云终端中,Linux 图形栈承担着从应用画面到屏幕像素的完整通路。很多开发者第一次接触时会感到名词密集:DRM、KMS、GEM、GBM、EGL、Wayland、X11、Mesa、compositor……它们并不是彼此替代的关系,而是分层协作的组件。理解这套栈的关键,是先建立一张“从应用到显示控制器”的全景地图,再明确 DRM 与 Wayland 各自所处的位置和职责边界。
一、核心原理:一条画面从产生到点亮的路径
一个典型图形应用的画面要经过若干阶段才能出现在屏幕上。应用通过 OpenGL ES、Vulkan 或 CPU 绘制,把结果写入图形缓冲区(buffer);缓冲区需要被显存管理机制分配和跟踪;随后合成器(compositor)决定这些缓冲区如何叠加、缩放、裁剪;最终由显示控制器(Display Controller)按扫描时序把像素送到面板。Linux 内核中的 DRM 子系统正是负责“缓冲区管理 + 显示控制”的内核层框架,而 Wayland 则是用户态中负责“窗口、输入与合成协议”的显示服务器协议。
可以把整条链路概括为四层:应用与工具层、用户态图形服务层、内核 DRM 层、硬件层。Wayland 位于用户态图形服务层,DRM 位于内核层,二者通过 ioctl、dma-buf 文件描述符和 KMS 属性进行协作。Wayland 合成器通常借助 EGL/GBM 打开 DRM 设备节点,把客户端提交的缓冲区直接作为 KMS 的 plane 内容上屏,从而避免不必要的拷贝。
二、DRM 与 Wayland 的职责边界
DRM(Direct Rendering Manager)是内核中的显示与渲染管理框架,它向上提供统一的设备节点 /dev/dri/card0、/dev/dri/renderD128,向下屏蔽不同 GPU 与显示控制器的差异。DRM 的核心能力包括:KMS 负责显示模式设置与页面翻转,GEM/TTM 负责缓冲区对象生命周期,dma-buf 负责跨驱动、跨进程的缓冲区共享。它不关心“窗口”概念,只关心“哪块缓冲区在哪个时刻显示在哪个 plane 上”。
Wayland 则是用户态的显示服务器协议,它定义了客户端与合成器之间的接口:客户端创建 wl_surface,提交 wl_buffer,合成器负责布局、输入分发与最终上屏。Wayland 本身不直接操作硬件,它依赖合成器通过 EGL/GBM 与 DRM 交互。因此,Wayland 解决的是“窗口与合成”的问题,DRM 解决的是“缓冲区与显示控制”的问题,两者是上下游协作关系,而非竞争关系。
一句话定位:Wayland 是用户态的“显示协议与合成框架”,DRM 是内核态的“显示与缓冲区管理框架”。Wayland 合成器是二者之间的桥梁。
三、方法流程:从应用提交到屏幕点亮
下面以 Wayland 客户端提交一帧画面为例,梳理关键步骤。理解这条流程,有助于后续调试黑屏、撕裂、掉帧等问题。
- 应用通过 EGL 创建
wl_egl_window,并绑定到wl_surface。 - 应用渲染到 GBM 分配的缓冲区,得到 dma-buf 文件描述符。
- 应用调用
wl_surface_attach提交缓冲区,再调用wl_surface_commit。 - 合成器收到提交,决定该 surface 是否需要重新合成。
- 合成器通过 KMS 的 atomic commit,把缓冲区绑定到某个 plane。
- DRM 驱动在垂直消隐期执行 page flip,新画面显示到屏幕。
# 查看 DRM 设备与能力
ls -l /dev/dri/
# card0:显示控制节点;renderD128:渲染节点
# 查看当前 KMS 状态
modetest -M rockchip -c
modetest -M rockchip -p
# 查看 Wayland 合成器使用的 DRM 节点
weston --drm-device=/dev/dri/card0
四、案例与场景:三种典型集成形态
在不同产品中,DRM 与 Wayland 的集成方式差异明显。下表列出三种常见形态及其关键特征,便于建立选型直觉。
| 集成形态 | 典型场景 | 合成器 | DRM 使用方式 | 关键关注点 |
|---|---|---|---|---|
| 桌面 Wayland | Ubuntu / Fedora 桌面 | Mutter / KWin | atomic KMS + GBM | 多屏、缩放、VRR |
| 嵌入式 Weston | 车载、工业 HMI | Weston | 直接 DRM 后端 | 启动速度、内存占用 |
| 无合成器直显 | Kiosk、视频播放 | 无 / 轻量 | libdrm 直接 modeset | 零拷贝、低延迟 |
五、常见误区与复盘
误区一:把 Wayland 当成 DRM 的替代品。Wayland 是协议与合成框架,DRM 是内核显示框架,二者层级不同,不能互相替代。
误区二:认为所有 Wayland 合成器都必须用 DRM。Weston 也支持 headless、X11、RDP 等后端,DRM 只是其中一种常用后端。
误区三:忽略 dma-buf 的跨进程语义。Wayland 客户端与合成器往往属于不同进程,缓冲区共享依赖 dma-buf fd 传递,理解这一点是排查“画面花屏、缓冲区被复用”问题的前提。