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 内容上屏,从而避免不必要的拷贝。

Linux 图形栈全景与 DRM / Wayland 定位 应用与工具层 GUI 应用 OpenGL ES / Vulkan Qt / GTK / SDL Weston 客户端 libdrm 工具 用户态图形服务层 Wayland 协议 wl_surface / wl_buffer 合成器 Compositor Weston / Mutter / KWin Mesa / EGL / GBM 渲染与缓冲分配 XWayland 兼容 X11 应用 ioctl / dma-buf fd 内核 DRM 层 KMS CRTC / Plane / Encoder GEM / TTM 缓冲区对象管理 dma-buf 跨设备共享 DRM 驱动 i915 / amdgpu / rockchip 硬件层 GPU Display Controller Panel / HDMI Connector

二、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 客户端提交一帧画面为例,梳理关键步骤。理解这条流程,有助于后续调试黑屏、撕裂、掉帧等问题。

  1. 应用通过 EGL 创建 wl_egl_window,并绑定到 wl_surface。
  2. 应用渲染到 GBM 分配的缓冲区,得到 dma-buf 文件描述符。
  3. 应用调用 wl_surface_attach 提交缓冲区,再调用 wl_surface_commit。
  4. 合成器收到提交,决定该 surface 是否需要重新合成。
  5. 合成器通过 KMS 的 atomic commit,把缓冲区绑定到某个 plane。
  6. 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 传递,理解这一点是排查“画面花屏、缓冲区被复用”问题的前提。