LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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,还会使能依赖的waylandwayland-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事件处理。

 

posted on 2024-03-23 23:59  ArnoldLu  阅读(6012)  评论(0编辑  收藏  举报

导航