第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的渲染管线,看看它到底是怎么把画面画出来的。到时候我会分享一个我在车载项目里遇到的性能优化案例,挺有意思的。