WaylandWayland简介与定制指导
Posted 林多
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WaylandWayland简介与定制指导相关的知识,希望对你有一定的参考价值。
Wayland与Weston简介
- 由于某些原因。移植并定制一套基于Wayland的Compositor。
- Wayland与Weston,是两个相辅相成的概念。这里简单总结一下:
- wayland是一套为“显示”服务的协议,基于C/S结构。它定制了一套标准的接口、基本通信方式。
- wayland提供了通信方式的实现(socket+epoll),并提供了“接口”的描述语言,以及将这套语言转换为代码的工具(scanner)
- Weston是基于Wayland协议,并实现了Compositor功能的,一套官方提供的Wayland compositor实现(可理解为基于wayland协议的compositor)
- 网上有些概念说的云里雾里的。简单说,wayland定制了一套协议,这套协议实现一套“显示服务器”。Weston就是wayland官方给出的,这套显示服务器的 参考实现。
架构图
wayland
- Wayland提供了Protocol的定义方式。Wayland的源码中在路径protocol文件夹下,定义了Wayland的核心协议。
- 如wl_display: 用于获取display全局对象。
<interface name="wl_display" version="1">
<description summary="core global object">
The core global object. This is a special singleton object. It
is used for internal Wayland protocol features.
</description>
.....
</interface>
- 基于wayland的Compositor实现,至少要实现wayland规定的核心协议。具体的核心协议,参加wayland官网(https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Interfaces)
- wayland源码中,除了协议部分。剩下的主要内容,就是实现了一个高效率的 Server+Client通信模式。
- Server端,主要是使用epoll+socket监听Client端事件,并对收到的消息反序列化。
// epoll
int
wl_os_epoll_create_cloexec(void)
int fd;
#ifdef EPOLL_CLOEXEC
fd = epoll_create1(EPOLL_CLOEXEC);
if (fd >= 0)
return fd;
if (errno != EINVAL)
return -1;
#endif
fd = epoll_create(1);
return set_cloexec_or_close(fd);
// socket
int
wl_os_socket_cloexec(int domain, int type, int protocol)
int fd;
fd = socket(domain, type | SOCK_CLOEXEC, protocol);
if (fd >= 0)
return fd;
if (errno != EINVAL)
return -1;
fd = socket(domain, type, protocol);
return set_cloexec_or_close(fd);
- Client端:wayland-client提供了已实现的序序列化接口。具体的通信、序列化实现这里不详细介绍。
WL_EXPORT void
wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...)
union wl_argument args[WL_CLOSURE_MAX_ARGS];
va_list ap;
va_start(ap, opcode);
wl_argument_from_va_list(proxy->object.interface->methods[opcode].signature,
args, WL_CLOSURE_MAX_ARGS, ap);
va_end(ap);
wl_proxy_marshal_array_constructor(proxy, opcode, args, NULL);
- 总结:官方提供的Wayland源码,主要包括协议的定义、协议到代码的生成工具,以及一套实现好的通信模型。
Weston
- Weston是基于wayland协议,实现的Compositor。
- Weston的入口在(这里以2.0.0为例): weston2.0.0./compositor/main.c
int main(int argc, char *argv[])
// 创建全局Display,并最终调用到wl_os_epoll_create_cloexec
display = wl_display_create();
// 创建Compositor
ec = weston_compositor_create(display, &user_data);
// 创建Shell
if (wet_load_shell(ec, shell, &argc, argv) < 0)
goto out;
// while循环
wl_display_run(display);
- Weston中有四个主要部分:Shell、Compositor、Render、Input。
- Shell:窗口管理器,画面层级、窗口信息、窗口生命周期、Focus窗口等等一些偏向于业务层的处理。默认的shell为desktop-shell,同时提供了其他shell实现(如ivi-shell)
- Compositor:负责画面的合成,使用DRM连接output,将画面输出到实际显示设备。
- Render:负责渲染,比如gl-render,做一些纹理贴图操作。
- Input:libinput模块,与evdev、uvdev模块交互,从底层设备节点接收touch、key等输入。
移植与定制
目前国内采用有很多系统采用Wayland作为显示服务器,移植与定制大体有以下几个方面:
- 编译移植:基于项目采用的编译器进行编译移植。
- 系统对接与原生调试:调式原生代码,其实就是把原生的Sample跑起来。
- Shell定制、协议扩展:根据业务需要,选择一种Shell,并再其基础上定制Shell,扩展原生协议。
- 优化:显示性能、Input性能、日志优化、Debug工具开发等等。
以上是关于WaylandWayland简介与定制指导的主要内容,如果未能解决你的问题,请参考以下文章