Weston概览:架构、配置、启动、代码
关键词:wayland、westom、compositor、render、shell backend等等。
weston是Wayland compositor的参考实现。整个weston解决方案包括Wayland协议实现、Wayland协议定义、weston server、weston默认client、以及一系列测试程序组成。
1 weston架构
weston是Server-Client架构,其中作为Server的weston主要包括:
- 实现Wayland协议的Wayland servier:负责和Wayland client通信。
- shell:作为窗口管理模块,负责窗口堆栈改变、focus改变等。支持desktop shell、fullscreen shell、ivi shell。
- compositor:负责合成器和渲染器。其中compositor backend支持DRM compositor、VNC compositor、headledd compositor、Nested Wayland compositor、Nested XWayland compositor等;renderbackend支持GL render、pixman render等。
- 输入管理:包括udevd输入的设备add/remove/change等事件、内核输入的input event、signal、timer等事件。
跟随weston的还包括一些Client,比如weston-desktop-shell、weston-keyboard以及一些测试程序。
1.1 weston工作模式
weston采用典型的Reactor模式。Reactor反应器模式,也叫做分发者模式或通知者模式,是一种将就绪事件派发给对应服务处理程序的事件设计模式。参考《Reactor模式》。
weston主循环通过epoll机制等待在一系列文件fd上,然后将接收到的事件分发,交给不同的进程进行处理。
- epoll监听的事件:
- udevd监听到的设备add/remove/change事件,同时会添加新设备的监听等。
- input事件监听,读取键盘、鼠标、触摸屏等参数。
- timer和signal事件。
- 其他还包括logind的dbus连接事件等。
- Server/Client间通信:
- listener fd:监听新简历的client,创建Weston和Client之间的domain socket。
- domain socket fd:Weston和Client之间通信通道。
2 weston配置
weston的配置主要包括:compositor、shell、render等配置。
Target packages Graphic libraries and applications (graphic/text) weston--主要包括compositor、shell、render以及demo client配置。 default compositor (drm)--选择默认compositor backend,支持drm、headless、wayland、X11等。compositor backend决定了compositor合成结果输出到哪里。 DRM compositor--选择DRM设备作为compositor输出设备。 VNC compositor RDP compositor headless (testing) compositor Wayland (nested) compositor--选择另一个Wayland作为输出设备,构成Wayland嵌套。 *** X11 (nested) compositor needs X.org enabled *** *** XWayland support needs libepoxy and X.org enabled *** desktop shell--窗口管理工具配置。 fullscreen shell ivi shell kiosk shell demo clients Use pixman-renderer by default--默认Render配置。
此外打开weston,还会使能依赖的wayland、wayland-protocols、libxkbcommon、pixman、libpng、udev、cairo、libinput、libdrm、seatd等。
3 weston启动
在系统启动合适时机启动weston,weston启动的时候还会启动一些作为client的子进程:
- weston-desktop-shell:负责系统全局窗口管理,比如panel, background, cursor, app launcher, lock screen等。
- weston-keyboar:软键盘面板。
- weston-screenshooter:截屏工具。
- weston-screensaver:屏保工具。
另外weston在启动过程中还分别加载几个backend:
- shell backend:负责窗口管理。
- desktop-shell
- fullscreen-shell
- ivi-shell
- render backend:用于compositor合成渲染。
- gl:GPU硬件渲染。
- pixman:软件渲染。
- noop
- compositor backend:决定了compositor合成完成后结果输出到哪里。
- DRM:linux下Direct Rendering Management。
- Wayland:此weston作为另一个Wayland compositor的Client,组成netsted Wayland。
- fbdev:直接输出到framebuffer设备。
- x11:weston作为X server的client,运行在X11上。
- headless:和noop-renderer配合使用,可以在没有窗口系统的机子(比如server上)测试逻辑。
- RDP:合成后通过RDP传输到RDP peer显示,用于远程桌面。
3.1 Buildroot下weston启动
weston启动入口在/etc/init.d/S49weston:
#!/bin/sh -e ... PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" # Load default env variables from profiles(e.g. /etc/profile.d/weston.sh) . /etc/profile--从weston.sh中获取预配置的环境变量。 start_weston() { /usr/bin/weston&--启动weston进程。 } stop_weston() { killall weston--杀死weston进程。 } case "$1" in start) echo -n "starting weston... " start_weston echo "done." ;; stop) echo -n "stoping weston... " stop_weston || true echo "done." ;; ... esac exit 0
调用/etc/profile执行/etc/profile.d/weston.sh,配置环境变量:
# The env variables below can be overridden # Comment out this for atomic related functions, e.g. sprites export WESTON_DISABLE_ATOMIC=1... # Dynamic config examples: # echo "compositor:state:sleep" > /tmp/.weston_drm.conf # off + input wakeable # echo "compositor:state:block" > /tmp/.weston_drm.conf # no input ...
启动后weston进程关系如下:
946 root 20 0 569.5m 71.3m 0.0 0.9 0:09.98 S `- /usr/bin/weston 1183 root 20 0 122.9m 23.5m 0.0 0.3 0:00.28 S `- /usr/libexec/weston-keyboard 1184 root 20 0 127.4m 28.3m 0.0 0.4 0:01.26 S `- /usr/libexec/weston-desktop-shell
3.2 weston.ini配置
weston启动初始化时读取配置文件/etc/xdg/weston/weston.ini,详细说明参考《Ubuntu Manpage: weston.ini - configuration file for Weston》。
Buildroot中weston.ini配置如下:
[core] backend=drm-backend.so--替换默认compositor backend。 # Allow running without input devices require-input=false # Disable screen idle timeout by default idle-time=0 # The repaint-window is used to calculate repaint delay(ms) after flipped. # value <= 0: delay = abs(value) # value > 0: delay = vblank_duration - value repaint-window=-1 # Allow blending with lower drm planes # gbm-format=argb8888 [shell] # top(default)|bottom|left|right|none, none to disable panel # panel-position=none # Scale panel size panel-scale=3 # none|minutes(default)|minutes-24h|seconds|seconds-24h # clock-format=minutes-24h clock-with-date=false # Disable screen locking locking=false [libinput] # Uncomment below to enable touch screen calibrator(weston-touch-calibrator) # touchscreen_calibrator=true # calibration_helper=/bin/weston-calibration-helper.sh [keyboard] # Comment this to enable vt switching vt-switching=false # Configs for auto key repeat # repeat-rate=40 # repeat-delay=400
/etc/xdg/weston/weston.ini.d/02-desktop.ini定义了weston启动后桌面图标。
3.3 weston依赖库
weston运行时主要依赖如下库文件:
weston依赖的库文件有:
weston
libexec_weston.so.0
libweston-11.so.0
libwayland-server.so.0
libffi.so.8--用于在运行时根据调用接口描述生成函数跳板并调用。
libpixman-1.so.0--用于像素操作的库,包括region, box等计算。用了许多平台相关的优化。
librga.so.2
libdrm.so.2--DRM compositor backend相关库文件。
libxkbcommon.so.0--主要用于键盘处理。
libmali_hook.so.1--GPU相关库文件。
libmali.so.1
libdl.so.2
libpthread.so.0
libdrm.so.2
libwayland-client.so.0
libffi.so.8
libwayland-server.so.0
libstdc++.so.6
libgcc_s.so.1
libdrm.so.2
libmali.so.1
libwayland-client.so.0
libwayland-server.so.0
libinput.so.10--InputManager相关,负责各种Input事件处理。输入处理,依赖于mtdev, libudev, libevdev等库。
libmtdev.so.1
libudev.so.1
libevdev.so.2
libevdev.so.2
ld-linux-aarch64.so.1
libc.so.6
根据配置动态加载的库有:
/usr/lib/weston/desktop-shell.so
/usr/lib/libweston-11/gl-renderer.so
/usr/lib/libseat.so.1
/usr/lib/libweston-11/drm-backend.so
weston-desktop-shell和weston-keyboard依赖如下库文件:
libwayland-client.so.0 libcairo.so.2 libpng16.so.16 libpixman-1.so.0 libm.so.6 libpango-1.0.so.0 libgobject-2.0.so.0 libpangocairo-1.0.so.0 libfontconfig.so.1 libjpeg.so.62 libwebp.so.7 libxkbcommon.so.0 libwayland-cursor.so.0 libc.so.6 ld-linux-aarch64.so.1
3.1 Buildroot下weston依赖关系
下图是weston在Buildroot下对其他模块的依赖关系:
4 weston多Launcher
/etc/init.d/S50launcher:
#!/bin/sh -e ... PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" # Load default env variables from profiles(e.g. /etc/profile.d/qlauncher.sh) . /etc/profile start_qlauncher() { # Wait for weston ready if [ "${QT_QPA_PLATFORM}" == wayland ]; then for i in `seq 50`;do [ -e ${XDG_RUNTIME_DIR}/wayland-0 ] || continue sleep .1 done fi /usr/bin/QLauncher } stop_qlauncher() { killall QLauncher } case "$1" in start) echo "starting qlauncher... " start_qlauncher& ;; stop) echo -n "stoping qlauncher... " stop_qlauncher echo "done." ;; ... esac exit 0
5 weston、wayland相关代码
weston代码位于freedesktop.org git,其中还包括wayland、wayland-protocols、libinput等。
5.1 wayland代码
wayland是Wayland协议的core,wayland-protocols是Wayland core的补充。
Wayland的协议定义在protocol目录,通信协议实现在src目录。它主要编译出三个库,libwayland-client,libwayland-server和libwayland-cursor。
第一个为协议的client端实现,第二个为协议的server端实现。第三个是协议中鼠标相关处理实现。
编译时会首先编译出wayland-scanner这个可执行文件,它利用expat这个库来解析xml文件,将wayland.xml生成相应的wayland-protocol.c,wayland-client-protocol.h和wayland-server-protocol.h。它们会被Wayland的client和server在编译时用到。同时wayland-scanner也需要在生成Weston中的Wayland扩展协议中起同样作用。
Wayland主要依赖于两个库,一个上面提到的expat协议,另一个libffi用于在跨进程过程调用中根据函数描述生成相应calling convention的跳板代码。
├── cursor--libwayland-cursor.so.0.20.0。 ├── egl ├── protocol--Wayland协议xml文件。 ├── src--主要源码,输出libwayland-client.so.0.20.0、libwayland-server.so.0.20.0、wayland-scanner。 ├── tests--测试程序。 └── wayland-scanner.mk
5.2 weston代码
与Wayland类似,protocol目录下放着Wayland协议定义。
weston输出Wayland协议之外的各种实现:shell backend、compositor backend、render backend、默认client、以及Wayland协议定义等。
├── clients--包含weston-desktop-shell、weston-keyboard、weston-screenshooter,以及一些client示例。 ├── compositor--输出weston主程序,以及libexec_weston.so.0.0.0、screen-share.so等库文件。 ├── data ├── desktop-shell--desktop-shell.so ├── doc ├── fullscreen-shell--fullscreen-shell.so ├── include ├── ivi-shell--ivi-shell.so ├── kiosk-shell--kiosk-shell.so ├── libweston--输出libweston-11.so.0.0.0库文件,以及一系列compositor backend:drm-backend.so;render backend:gl-renderer.so。 ├── pam ├── pipewire ├── protocol--Wayland协议xml文件。 ├── README.md ├── releasing.md ├── remoting ├── shared ├── shell-utils ├── tests--测试程序。 └── xwayland--使用X11作为compositor backend的XWayland。
参考文档《Wayland与Weston简介》。
5.3 libinput代码
libinput负责input设备管理和multi touch、evdev、udev事件处理。