第4章:Weston合成器入门

好,咱们今天来聊聊Weston。说实话,我第一次接触Wayland的时候,也是从Weston入手的。它是Wayland的参考合成器,说白了就是官方给的“样板间”。你把它搞明白了,后面再接触其他合成器就轻松多了。

4.1 Weston架构解析

Weston的架构,我习惯把它分成三层来看:

  • 核心库(libweston):这是心脏。所有合成、渲染、输入处理的核心逻辑都在这里。
  • 后端(Backend):负责跟硬件打交道。比如DRM后端直接操作显卡,X11后端跑在X Window上,还有Wayland后端(嵌套运行)。
  • 前端(Shell/Desktop):就是用户看到的界面。桌面、任务栏、窗口管理这些。

我记得刚接触时有个误区——以为Weston就是一个整体。其实不是。libweston可以被其他程序调用,你完全可以基于它写自己的合成器。嗯,这个设计很巧妙。

核心要点:Weston = libweston + 后端 + Shell。这三者通过插件机制组合。

4.2 Weston配置文件详解

Weston的配置文件,默认路径是 /etc/xdg/weston/weston.ini。你也可以用 --config 参数指定别的路径。

我挑几个关键配置项说说:

配置段 参数 说明
[core] backend 指定后端,比如 drm-backend.so
[core] shell 指定Shell,比如 desktop-shell.so
[shell] background-color 背景色,十六进制格式
[output] name 输出名称,比如 LVDS-1
[output] mode 分辨率,比如 1920x1080
[input] touchscreen 触摸屏校准参数

来看一个实际的车载场景配置:

[core]
backend=drm-backend.so
shell=desktop-shell.so
xwayland=true

[shell]
background-color=0x002244
locking=false
animation=zoom

[output]
name=LVDS-1
mode=1280x800
transform=normal

[output]
name=HDMI-A-1
mode=1920x1080
transform=90

[input]
touchscreen=true
calibration=0.5 0.0 0.0 0.5 0.0 0.0

这个配置里,我设置了两个输出:一个给车载主屏(LVDS),一个给副驾娱乐屏(HDMI)。副屏旋转了90度,因为它是竖屏安装的。嗯,这里要注意——transform 参数的值是角度,不是弧度。

我的经验:车载场景下,xwayland=true 建议开启。很多老应用还依赖X11,没有它跑不起来。

4.3 启动Weston与调试

启动Weston,最简单的命令:

weston --tty=1

这会自动切换到tty1,启动Weston。如果你想在X11里测试(比如开发机上):

weston --backend=x11-backend.so

我个人习惯用 --debug 参数:

weston --tty=1 --debug --log=/tmp/weston.log

这样所有日志都会输出到文件,方便排查问题。

4.3.1 常见调试技巧

  • 查看FPS:按 Ctrl+Alt+Space 打开调试界面,能看到帧率。
  • 截图weston-screenshooter 命令直接截屏。
  • 查看窗口信息weston-info 列出所有Wayland窗口。

避坑指南:我曾经在调试时发现Weston启动后黑屏。查了半天,原来是 --tty 参数指定的tty已经被其他进程占用了。解决办法:先 chvt 1 切换到空闲tty,再启动。

4.3.2 调试日志怎么看

Weston的日志级别分为:

  • LOG_ERROR:红色,致命错误
  • LOG_WARNING:黄色,警告
  • LOG_INFO:白色,普通信息
  • LOG_DEBUG:灰色,调试信息

你想想看,如果日志里出现 failed to create output,多半是DRM后端没找到显卡。这时候检查一下 /dev/dri/ 目录下有没有设备文件。

4.4 实战:在QEMU中运行Weston

如果你没有实体硬件,可以用QEMU模拟。我常用的命令:

qemu-system-x86_64 \
  -kernel bzImage \
  -initrd initrd.img \
  -append "console=ttyS0" \
  -device virtio-gpu \
  -display gtk,gl=on

启动后,在虚拟机里运行:

weston --tty=1 --backend=drm-backend.so

这里有个坑——QEMU的virtio-gpu驱动可能不完整。如果Weston报 EGL not available,试试加上 --use-pixman 参数,用软件渲染。

一句话总结:Weston是Wayland的“Hello World”。搞懂它,你就掌握了Wayland合成器的基本套路。

下一章,我们会深入Weston的渲染管线,看看它到底是怎么把画面画出来的。到时候我会分享一个我在车载项目里遇到的性能优化案例,挺有意思的。