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 合成器架构与数据通路 Wayland 客户端 Qt / GTK 应用 SDL / 游戏 weston-terminal 自定义客户端 Wayland 协议层:wl_surface / wl_buffer / wl_seat / wl_output Compositor 核心 场景图 Scene Graph surface 层级 / 变换 Damage 区域 脏矩形合并 事件循环 epoll / timer Shell 策略 desktop / kiosk 渲染器 Renderer GL / GLES2 Pixman Vulkan(实验) 后端 Backend DRM/KMS Wayland/X11 Headless 输入子系统 libinput → evdev → wl_seat → 焦点 surface 输出管理 output → head → mode → framebuffer 提交

二、后端类型:决定“画面输出到哪里”

后端是 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
后端与渲染器是正交的:DRM 后端既可以搭配 GLES2 渲染器,也可以搭配 Pixman 软件渲染器。排查问题时先确认后端是否成功初始化,再确认渲染器是否可用。

三、渲染器:决定“画面怎么画”

渲染器负责把场景图中的 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、裁剪启动参数、优化帧率时就能做到心中有图、下手有据。