4. Weston架构解析
Weston 是 Wayland 协议在嵌入式与桌面环境中的参考合成器实现。理解 Weston 的架构,核心不是记住某个函数名,而是建立一张“从输入设备到屏幕像素”的完整数据通路图:谁负责接收事件、谁负责合成画面、谁负责把画面送到显示控制器。本节围绕合成器组成、后端类型、渲染器、输入处理与输出管理五个维度展开,帮助你在调试黑屏、触摸失灵、帧率异常时快速定位问题层级。
一、Weston 合成器的整体组成
Weston 进程内部可以划分为若干协作模块。最上层是 Wayland 协议层,负责与客户端(如 Qt、GTK、SDL 应用)交换 surface、buffer、input 等对象;中间是 compositor 核心,维护场景图(scene graph)、管理 surface 生命周期与 damage 区域;下层是 后端(backend) 与 渲染器(renderer),分别解决“输出到哪里”和“怎么画”的问题。此外还有 输入子系统(libinput/evdev)和 输出管理(output、head、mode)。
这些模块通过事件循环(weston_event_loop)串联:输入事件触发场景更新,场景更新产生 damage,damage 驱动渲染器重绘,渲染结果由后端提交给显示设备。理解这条链路,就能理解为什么“改了配置却不生效”——往往是因为改动落在了错误的层级。
二、后端类型:决定“画面输出到哪里”
后端是 Weston 与底层显示环境之间的适配层。嵌入式产品最常用的是 DRM/KMS 后端,它直接操作 /dev/dri/card0,通过原子提交(atomic commit)把 framebuffer 送到显示控制器,能获得最低延迟和最高效率。开发调试阶段常用 Wayland 后端(weston 嵌套在另一个合成器里)和 X11 后端,便于在桌面环境快速验证。无显示设备的 CI 或单元测试场景使用 Headless 后端,只做离屏渲染。
选择后端由启动参数或 weston.ini 决定。例如在目标板上运行:
# 直接使用 DRM/KMS 后端
weston --backend=drm-backend.so --tty=1
# 嵌套在已有 Wayland 会话中调试
weston --backend=wayland-backend.so --width=1280 --height=720
# 无显示环境做渲染验证
weston --backend=headless-backend.so --width=1920 --height=1080
三、渲染器:决定“画面怎么画”
渲染器负责把场景图中的 surface 合成为最终帧。Weston 支持三类渲染器:GL 渲染器基于 OpenGL ES 2.0,利用 GPU 做纹理合成,适合高分辨率、多图层、有动画的场景;Pixman 渲染器是纯 CPU 软件渲染,不依赖 GPU,适合资源受限或 GPU 驱动不稳定的嵌入式设备;Vulkan 渲染器仍在演进,用于验证新图形 API 路径。
渲染器的选择直接影响 CPU 占用与功耗。在 i.MX6ULL 这类无 GPU 或 GPU 驱动薄弱的平台上,强制使用 GL 渲染器会导致启动失败或花屏,此时应显式指定 Pixman:
[core]
renderer=pixman
[output]
name=HDMI-A-1
mode=1024x600
四、输入处理与输出管理
输入处理链路为:内核 evdev 设备 → libinput → weston_seat → 焦点 surface。Weston 通过 udev 监听输入设备热插拔,触摸屏需要正确的 ABS_MT 坐标范围与校准矩阵,否则会出现“点不准”。键盘布局由 xkb 配置决定,嵌入式设备常需在 weston.ini 中指定 keymap。
输出管理围绕 output、head、mode 三个概念:output 是逻辑显示对象,head 是物理连接器(如 HDMI-A-1、DSI-1),mode 是分辨率与刷新率。多屏场景下,Weston 为每个 output 维护独立的场景裁剪与 damage 区域。常见配置如下:
| 配置项 | 作用 | 典型值 |
|---|---|---|
| backend | 选择后端类型 | drm-backend.so |
| renderer | 选择渲染器 | gl / pixman |
| output name | 指定物理连接器 | HDMI-A-1 |
| mode | 分辨率与刷新率 | 1920x1080@60 |
| transform | 旋转与翻转 | rotate-90 |
| scale | 输出缩放 | 2 |
五、案例与排障复盘
某嵌入式项目出现“系统启动后黑屏,但串口日志正常”。排查顺序应为:先看 Weston 日志中后端是否成功打开 DRM 设备,再确认渲染器是否初始化成功,最后检查 output 是否被正确 enable。若日志出现 failed to initialize DRM backend,通常是权限或 tty 占用问题;若出现 no outputs found,则检查连接器状态与内核显示驱动。
掌握 Weston 架构的价值在于建立分层定位能力:输入问题查 libinput 与 seat,画面问题查渲染器与 damage,显示问题查后端与 output。把这条数据通路记牢,后续配置 weston.ini、裁剪启动参数、优化帧率时就能做到心中有图、下手有据。