Weston 是基于Wayland 协议的 compositor 的参考实现。其它的实现比如 GNOME 和KDE 也默认提供了基于Wayland display server 协议建立的全功能桌面环境。OpenHarmony 标准系统目前采用的是weston 的实现。
1、Weston 结构分析
下图是图形子系统 compositor server端的结构图。
compositor 上端通过 wayland 协议与client 进行通讯。
server 端除了 weston外,还加载了窗口管理服务(wmserver)模块和 vsync 模块。另外加载了一个 ivi-shell 模块,这个我们后面在分析client 端 WindowManager 时再说。
weston 下端依赖几个display hdi 层相关的库:
• libdisplay_gfx 实现图形的硬件加速接口。
• libdisplay_gralloc:负责显示模块内存的管理,包括内存的申请和释放、内存映射等操作。
drm backend 中 renderer模块通过 use_pixman 选项选择使用 pixman renderer 还是 egl。 egl 是 rendering API(如 OpenGL,OpenGL ES) 与底层原生平台窗口系统之间的接口。
pixman-render 中又通过 use_tde 变量来选择是否使用 tde 硬件加速模块。 TDE(Two Dimensional Engine)是海思的2D图形加速引擎。Rockchip 对应的叫 RGA (Raster Graphic Acceleration) 二维光栅图形加速单元,用来加速了二维图形操作。例如点/线绘制、图像缩放、旋转、位图、图像合成等。
若检测不到tde 模块,则会默认使用 pixman 来进行软件渲染。
2、关于Wayland
wayland 协议是被设计成”异步的面向对象“(asynchronous object-oriented protocol)的协议。面向对象(Object-oriented)表示 compositor 所提供的服务是以一系列贮存在同一个compositor 中的对象的方式呈现。
各个对象实现了一个接口(interface),接口有名字、若干的方法(request)及系列相关的events。接口协议可以在xml 文件中描述,编译时有脚本可将其自动生成C 代码(wayland_standard/wayland_scanner_wrapper.py)。
客户端可以给对象发送请求,如果对象的接口支持这个请求的话。
compositor 中有一些wayland 的核心接口(core interfaces) 是必须要具备的,定义在 wayland_standard/protocol/wayland.xml中。此外特定的compositor 可以实现它们自己的接口作为扩展协议。每个接口协议都有版本号,以保证版本的兼容性。
3、weston 启动流程伪代码
weston 启动流程比较长,我们只挑出感兴趣的主干部分。整理一下流程,有助于后续调试的时候迅速回忆起看过的代码。
wet_main(args)