【Wayland】Wayland简介与定制指导

Wayland与Weston简介

  • 由于某些原因。移植并定制一套基于Wayland的Compositor。
  • Wayland与Weston,是两个相辅相成的概念。这里简单总结一下:
  1. wayland是一套为“显示”服务的协议,基于C/S结构。它定制了一套标准的接口、基本通信方式。
  2. wayland提供了通信方式的实现(socket+epoll),并提供了“接口”的描述语言,以及将这套语言转换为代码的工具(scanner)
  3. 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。
  1. Shell:窗口管理器,画面层级、窗口信息、窗口生命周期、Focus窗口等等一些偏向于业务层的处理。默认的shell为desktop-shell,同时提供了其他shell实现(如ivi-shell)
  2. Compositor:负责画面的合成,使用DRM连接output,将画面输出到实际显示设备。
  3. Render:负责渲染,比如gl-render,做一些纹理贴图操作。
  4. Input:libinput模块,与evdev、uvdev模块交互,从底层设备节点接收touch、key等输入。
移植与定制

目前国内很多系统采用Wayland/weston作为系统的Display Server,移植与定制大体有以下几个方面:

  1. 编译移植:基于项目采用的编译器进行编译移植。
  2. 系统对接与原生调试:调式原生代码,其实就是把原生的Sample跑起来。
  3. Shell定制、协议扩展:根据业务需要,选择一种Shell,并再其基础上定制Shell,扩展原生协议。
  4. 优化:显示性能、Input性能、日志优化、Debug工具开发等等。
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值