WaylandWayland简介与定制指导

Posted 林多

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WaylandWayland简介与定制指导相关的知识,希望对你有一定的参考价值。

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工具开发等等。

以上是关于WaylandWayland简介与定制指导的主要内容,如果未能解决你的问题,请参考以下文章

WaylandWayland简介与定制指导

WaylandWayland协议说明

WaylandWayland协议说明

WaylandWayland协议说明

透过轨道交通应急处理系统定制方案,看企业如何正确搭建针对事故应急预案

wayland简介