Wayland introduce
文章目录
1. Wayland 概念
wayland 是 X11协议的替代品,所以wayland是什么?X11是什么?
1. what is X?
-X11: Version 11 of the X protocol
-X.Org Server: X11协议的服务器端实现。
2. what is wayland?
-
wayland是一个窗口管理协议,实现display server和display client之通信的一套标准协议。作为X11 window system protocol and architecture的替代。
-
wayland也是一种Client/server的系统架构,包含window management、compositing and the display server。以weston来参考server端的实现。
-
支持C libraries ,比如libwayland-client
2. Wayland 架构
wayland 是 X11协议的替代品,了解wayland架构前,先了解X架构。
-
X11 架构
下面以 点击事件(input devices输入event到屏幕响应其变化)flow来梳理X 架构的。
- Kernel 收到Hardware的input event,linux evdev 发送(放入消息队列/dev/input/eventx中)到X server。
- X server决定哪个X client会被影响,将event转发到对应的X client。
- X client收到event,做出相应处理,将发送rendering request 给X server。
- X Server收到这个请求,会转发给driver去render。同时X server会计算rendering 边界区域,并且发送damage event 到compositor。
- damage event 告诉compositor,那块window内容发生变化。由compositor负责合成变化之后各个图层的内容,合成一张完整的图片,但合成并不是在compositor进行的,必须由X server rendering。
- X server接收到compositor的 rendering requests,然后将合成器后缓冲区复制到前缓冲区或进行页面翻转然后将合成器后缓冲区复制到前缓冲区或进行页面翻转。一般情况下,X 服务器必须执行此步骤,以便能够处理重叠窗口(可能需要裁剪)并确定是否可以进行页面翻转。但是,对于始终全屏显示的合成器来说,这是另一个不必要的上下文切换。
-
Wayland 架构
对比X 架构,其减少了X server与compositor 之间IPC通信的步骤。wayland 将 compositor和wayland server合并,并且wayland协议允许将input event转发到wayland client进行render,然后wayland client直接发送damage event给到compositor。
- Kernel 获取input event,并发送到Wayland Compositor。
- Wayland Compositor 决定发送给哪个Wayland Client。
- Wayland Client收到event,根据event来更新界面并渲染。与X 不同的是,rendering 发生在wayland client,而不是server。然后client 发送合成requests,指示已更新的区域。
- Wayland Compositor收集来自各wayland client的damage event,重新合成屏幕。 合成器可以直接发出 ioctl 来安排使用 KMS 的翻页。
-
Wayland与X之间主要的区别
- 合成方式:在X中,合成器要主动获取像素数据,而这会导致延时;在Wayland中,合成器直接接收客户端的数据。
- 渲染方式不同:尽管X Server需要根据指定显示客户端已渲染过的窗口,但X Server本身是可以执行渲染动作的;而Wayland不提供任何渲染相关接口,客户端要自行渲染窗体内容,如字体或控件等等,窗口本身的渲染可以在客户端或合成器中做。
- 安全性:Wayland隔离了每个窗口的输入输出事件,X缺少这些机制。安全性:Wayland隔离了每个窗口的输入输出事件,X缺少这些机制。
- 兼容性:X11 是一个非常成熟的协议,已经被广泛使用了几十年。许多应用程序和工具都是基于 X11 构建的,因此在 Wayland 中运行这些应用程序可能会出现兼容性问题。不过,Wayland 提供了一个 XWayland 兼容层,可以在 Wayland 中运行 X11 应用程序。
Wayland compositor 通常负责启动Xwayland。Xwayland与Wayland compositor的协作方式如下:
-
wayland 渲染
在上述概述中,我忽略了一个细节,即在 Wayland 下客户端如何实际进行渲染。通过从图像中移除 X 服务器,我们也去掉了 X 客户端通常渲染的机制。但是,我们已经在 X 下使用 DRI2 时使用了另一种机制:直接渲染。通过直接渲染,客户端和服务器共享视频内存缓冲区。客户端链接到诸如 OpenGL 之类的渲染库,该库知道如何编程硬件,并直接渲染到缓冲区中。合成器可以将缓冲区作为纹理使用,将其合成到桌面上。在初始设置之后,客户端只需要告诉合成器使用哪个缓冲区,以及何时何地渲染了新内容。
这给应用程序留下了两种更新其窗口内容的方式:
方式一:将新内容渲染到一个新的缓冲区,并告诉合成器使用新的缓冲区代替旧的缓冲区。应用程序每次需要更新窗口内容时都可以分配一个新的缓冲区,或者可以保留两个(或更多)缓冲区并在它们之间进行循环。缓冲区的管理完全由应用程序控制。
方式二:将新内容渲染到之前告诉合成器要使用的缓冲区中。尽管可以直接在与合成器共享的缓冲区中进行渲染,但这可能会与合成器竞争。可能发生的情况是,重新绘制窗口内容可能会被合成器重新绘制桌面所打断。如果应用程序在清除窗口之后但在渲染内容之前被中断,合成器将会从空白缓冲区获取纹理。结果是应用程序窗口会在空白窗口和部分渲染内容之间闪烁。避免这种情况的传统方法是将新内容渲染到后备缓冲区,然后从那里复制到合成器表面。后备缓冲区可以即时分配,并且足够大以容纳新内容,或者应用程序可以保留一个缓冲区。同样,这也在应用程序控制之下。无论哪种情况,应用程序都必须告诉合成器表面的哪个区域包含新内容。当应用程序直接渲染到共享缓冲区时,合成器需要注意到有新内容。但是当交换缓冲区时,合成器不会假设有任何变化,并且需要应用程序的请求才会重新绘制桌面。即使应用程序将新缓冲区传递给合成器,仍然可能只有一个小部分缓冲区是不同的,比如一个闪烁的光标或一个旋转的加载图标。
3. wayland compositor
上面介绍wayland是一个协议,也是一个Client/Server的架构,wayland server即compositor。那常见的wayland compositor有哪些?
Wayland compositor | Description |
---|---|
Weston | the reference implementation of a Wayland compositor; Weston implements client-side decoration |
Lipstick | mobile graphical shell framework which implements Wayland compositor. It is used in Sailfish OS and Nemo Mobile |
Enlightenment 0.20(E20) | will have full Wayland support.will have full Wayland support. |
KWin | had incomplete Wayland support in April 2013. |
Mutter | maintains a separate branch for the integration of Wayland for GNOME 3.9 (in September 2013) |
Clayland | is a simple example Wayland compositor using Clutter. |
4. 支持Wayland的工具包
- QT5: 通过qtWayland插件支持wayland。
- GTK:在GTK3及更高的版本支持wayland。
- SDL:在SDL2.0.2中添加了 对wayland 支持。默认是disable。
- EFL:EFL 移植到 Wayland 尚属实验性 - Ecore、Evas 和 Elementary 的后端都针对 Wayland 进行 SHM 和 EGL 演示。
总结
本文介绍了wayland基本概念和架构