概述

Wayland 是一个用于构建显示服务器和客户端应用程序的通信协议和库。它旨在取代 X Window System(X11)作为 Linux 和其他操作系统上的图形显示系统。

相对于 X11,Wayland 设计更为简单、现代化,并具有更好的性能和安全性。它采用了一种更直接的通信模型,通过消息传递机制进行客户端和服务器之间的通信,而不是像 X11 一样使用网络协议。

Wayland 的核心思想是将图形显示系统拆分为两个主要组件:

  1. Wayland 服务器(Compositor):负责显示的合成、窗口管理和输入事件的处理。它是 Wayland 协议的服务器端实现,并与底层图形驱动和硬件交互。
  2. Wayland 客户端:应用程序通过 Wayland 协议与服务器进行通信,发送绘图指令和接收输入事件。

Wayland 协议定义了服务器和客户端之间的通信规范,包括窗口管理、输入事件、缓冲区交换等。它使用对象和接口的概念来描述不同的功能,并通过消息传递进行交互。

Wayland 的优势包括:

  1. 更低的延迟:Wayland 的设计目标之一是减少显示系统的延迟,提供更流畅的用户体验。
  2. 更高的性能:由于 Wayland 的通信模型更简单直接,可以减少不必要的复制和转换操作,从而提高图形渲染性能。
  3. 更好的安全性:Wayland 采用了精细的权限控制和隔离机制,确保客户端应用程序无法访问其他应用程序的图形缓冲区数据。
  4. 易于开发和调试:Wayland 的设计简单清晰,易于理解和实现,使开发者能够更轻松地构建和调试图形应用程序。

X11架构

在讲Wayland架构前,我们先了解X11的架构

X11架构

  1. 内核从输入设备获取事件并通过 evdev 输入驱动程序将其发送到 Xorg。内核通过驱动设备并将不同的设备特定事件协议转换为 linux evdev 输入事件标准来完成所有的工作。
  2. Xorg 服务器确定事件影响哪个窗口,并将其发送到在该窗口上绑定的客户端。X 服务器实际上并不知道如何正确执行此操作,因为屏幕上的窗口位置由合成器控制,并且可能以 Xorg 服务器无法理解的多种窗口转换方式,如(缩小、旋转、摆动、 ETC)。
  3. 客户端查看事件并决定做什么。通常,UI 必须更改以响应事件 。 也许单击了复选框或指针进入了必须突出显示的按钮。因此,客户端将渲染请求发送回 Xorg 服务器。
  4. 当Xorg 服务器收到渲染请求时,它会将其发送给驱动程序,让其对硬件进行编程来进行渲染。Xorg 服务器还计算渲染的边界区域,并将其作为damage事件发送到合成器。
  5. damage 事件告诉合成器窗口中发生了某些变化,并且它必须重新合成屏幕上该窗口可见的部分。合成器负责根据场景图和 X 窗口的内容渲染整个屏幕内容。然而,它必须通过 X 服务器来呈现它。
  6. X 服务器接收来自合成器的渲染请求,并将合成器后缓冲区复制到前缓冲区或执行翻页。

Wayland架构

在 Wayland 中,合成器就是显示服务器。我们将 KMS 和 evdev 的控制权转移给合成器。Wayland 协议允许合成器将输入事件直接发送到客户端,并让客户端将损坏事件直接发送到合成器:

Wayland架构

  1. 内核获取一个事件并将其发送到合成器。这与 X11的情况类似,因为我们可以重用内核中的所有输入驱动程序。
  2. 合成器查看其场景图以确定哪个窗口应接收事件。场景图对应于屏幕上的内容,合成器了解它可能应用于场景图中元素的转换。因此,合成器可以选择正确的窗口并通过应用逆变换将屏幕坐标转换为窗口本地坐标。可以应用于窗口的变换类型仅限于合成器可以执行的操作,只要它可以计算输入事件的逆变换即可。
  3. 与 X 情况一样,当客户端收到事件时,它会更新 UI 作为响应。但在 Wayland 的情况下,渲染发生在客户端,客户端只需向合成器发送请求以指示已更新的区域。
  4. 合成器从其客户端收集损坏请求,然后重新合成屏幕。合成器可以直接发出 ioctl 来使用 KMS 安排页面翻转。

Wayland 的必要硬件支持

通常,硬件启用包括 modesetting/display、EGL/GLES2和 EGL/GLES2。最重要的是,Wayland 客户端和服务端都需要一种在进程之间有效共享缓冲区的方法。