Wayland

Linux：X Server与Wayland Compositor
Wayland compositors, libwayland-client and toolkits
Wayland是一个通信协议，规定了显示伺服器与其客户机之间的通信方式，而使用这个协议的显示服务器称为Wayland Compositor。它由Kristian Høgsberg于2008年发起，目标是用更简单的现代化视窗系统取代X Window System。Wayland协议的参考实现称为Weston，由Wayland项目组使用C语言开发。
Wayland与X Window System的最大不同在于，它规定由客户机自身负责窗口边框和装饰的绘制，并且客户机能够通过EGL以及一些Wayland特定的EGL扩充元件直接在显示记忆体中算绘自己的缓冲区。窗口管理器简化成显示管理服务，专门负责算绘那些屏幕上的程序。这比X Window System中的窗口管理器要更简单、高效。
Wayland项目的源码使用MIT许可证释出。现有的Compositor例如Compiz，KWin和Mutter对Wayland都有着不同程度的支持。

**历史**
Wayland的创始人Kristian Høgsberg是X.Org Server开发者，曾参与过AIGLX和DRI2的开发。他在2008年供职于红帽时发起了Wayland作为业余项目，目标是让“每一个帧都完美无瑕，也就是说应用程序要能充分地控制图形的渲染，使我们完全无法察觉任何的撕裂、延迟、重画及闪烁”Høgsberg 2008Hillesley 2012。这一灵感浮现时他正开车经过马萨诸塞州的韦兰，也就由此决定了项目的名字Hillesley 2012。
2010年10月，Wayland加入了Freedesktop.org项目Larabel 2010 freedesktop。在迁移过程中，邮件列表wayland-devel代替了原先的Google group邮件组，用于讨论项目的开发。
Wayland是自由软件，它的库(libwayland-server和libwayland-client)以MIT License授权，示例程序和Compositor一开始以GPLv2授权。现在整个项目都是以MIT License授权。直到2010年11月份，Wayland还仅仅只能在Intel、Nvidia和AMD的开源驱动上运行。

**设计**
The Wayland display server protocol relys on EGL
Wayland运用既有的Linux核心技术，像是Direct Rendering Manager（DRM），Kernel Mode-Setting（KMS）以及Graphics Execution Manager（GEM）以提供一个最小化的显示管理服务。Wayland混合器（compositor）在2010年6月已从桌面常用的OpenGL改为OpenGL ES。这个专案也开发支援Wayland显示的Qt，而不需要X。大部分应用程式都有望获得透过函式库，无需修改程式即可支援Wayland。
近些年来，GNU/Linux桌面图形开发者将许多与渲染有关的接口从X server移动到内核中。现在，已经有许多功能被移入内核（内存管理、任务调度、模式设置（KMS）等等）或是程序库（cairo、pixman、freetype、fontconfig、pango等等），所以窗口系统需要做的事情大大减少了。但是X11协议十分巨大、庞杂，并且它包括了许多已经过时的模块。虽然开发者们为了使X server适应现代化的计算机体系结构而开发出了XRandR、XRender、Composite等一些额外扩展，但这终究是治标不治本，同时这也会增加维护的难度。
Wayland是一款协议，但与X server不同的是，Wayland只做它必须要做的事情。下面以「鼠标点击按钮引发按钮更新动作」为例来说明一下Wayland和X server的区别：
X架构
在X中：
# 内核捕获鼠标点击事件并发送给X server。
# X server会计算该把这一事件发送给哪个窗口（事实上，窗口位置是由Compositor控制的，X server并不能够正确的计算Compositor做过特效变化之后的按钮的正确位置）。
# 应用程序对此事件进行处理（将引发按钮更新动作）。但是，在此之前它得向X server发送绘制请求。
# X server接收到这条绘制请求，然后把它发给视频驱动来渲染。X还计算了更新区域，并且这条「垃圾信息」发送给了Compositor。
# 这时，Compositor知道它必须要重新合成屏幕上的一块区域。当然，这还是要向X server发送绘制请求的。
# 开始绘制。但是X server还会去做一些不必要的本职工作（窗口重叠计算、窗口剪裁计算等）。
Wayland架构
在Wayland中：
# 内核捕获鼠标点击事件并发送给Wayland Compositor。
# 由于是直接发给Wayland Compositor的，所以Wayland Compositor会正确地计算出按钮的位置。同时它会把这一事件发送给按钮所在的应用程序来处理。
# 应用程序直接渲染，无需向Wayland Compositor请求。只需在绘制完成之后向Wayland Compositor发送一条信息表明这块区域被更新了。
# Wayland Compositor收到这条信息后，立即重新合成整个桌面。
目前，Wayland使用OpenGL ES而不是传统的OpenGL。“从长远来看，我们需要完整的OpenGL支持，但问题是libGL会带来X的依赖性......”另一方面，使用OpenGL ES会使得Wayland更容易支持移动设备。Wayland目前并不支持网络透明性，但未来可能会支持。

**媒体关注**
Phoronix于2008年11月发表了一篇标题为「Wayland: A New X Server For Linux」的文章，披露Wayland这项新的项目。Kristian透过他的网志对此关注作出回应，他告示大众Wayland并非一个新的X server而是一个显示伺服器，并声明这个新兴的专案尚处于未成熟的阶段Høgsberg 2008。

**使用**

**Arch Linux**
Arch Linux本身不具有Wayland。但实际上，安装 Enlightenment 或 KDE 等桌面环境时，可以选用Wayland安装作为显示服务器。

**Ubuntu**
马克·沙特尔沃思于2010年11月4日宣布Wayland将作为Ubuntu未来某一未定版本Unity介面的显示伺服器。但是2013年3月份，Canonical确认他们将开发一个新的显示服务Mir而不是使用Wayland来替代X。2017年4月份，Canonical宣布放弃Unity与Mir，并于Ubuntu 17.10开始使用Wayland。但在18.04LTS版本中因为Wayland无法支持屏幕共享，远程桌面服务以及GNOME Shell崩溃的可恢复性更换为X.Org Server。

**Fedora**
Fedora 25整合了GNOME桌面最新版本 3.22，并将GNOME桌面的版本的显示后端切换至预设为Wayland。

**RHEL**
RHEL 8整合了Wayland。

**Qt**
Qt 5.x提供了QtWayland模块以支持Wayland协议，借由-platform命令列选项，Qt应用程式可以在运行时切换图形后端，如X与Wayland。2011年1月，Wayland支持进入上游Qt版本库的Lighthouse分支。

**KDE**
KWin，KDE的视窗管理器加入支持OpenGL ES输出，已在KDE SC 4.7发布。目前，KWin已经完成Wayland的初步移植。在2012年1月发布的KDE SC 4.8，KDE将支援X下执行Wayland。在2012年夏天发布的KDE SC 4.9，将可以直接执行Wayland，主要用于支援行动设备，也就是Plasma Active。

**GNOME**
GNOME从3.10开始支持Wayland。

**Compiz**
Compiz开发者们已经把它对X的依赖部分变成了一个可选插件。同时，Canonical正在为Compiz添加OpenGL ES的支持。众所周知，目前Wayland正是使用OpenGL ES，这使将得Compiz能够更容易迁移到Wayland。
注:compiz此项目的主要作者已经离开Canonical，使得此项目进入停止开发的状态，当然迁移到wayland的计划也就更遥遥无期。

**Sailfish OS**
Jolla的第一款装置搭载的Sailfish OS使用Wayland。

**Wayland 合成器**
实作 Wayland 显示伺服器协定的显示伺服器也称为 Wayland 合成器，因为它们也执行合成视窗管理器的任务。
*Hyprland – 一个用C++ 编写的基于wlroots 的平铺Wayland 合成器，Hyprland 值得注意的功能包括动态平铺、选项卡式视窗、干净且可读的C++ 程式码库以及提供视窗动画、圆角和Dual-Kawase模糊的自订渲染器。
*Weston – Wayland 合成器的参考实现，实现客户端装饰。
*Enlightenment - 声称自 0.20 版本以来完全支援 Wayland ，但目前正在进行工作以实现完整的 Wayland 合成器 。
*KWin - 截至 2021 年，KWin 几乎拥有完整的 Wayland 支援。
*Mutter - Mutter 为 GNOME 3.9 的 Wayland 整合维护了一个单独的分支（2013 年 9 月）；54 在 2014 年的 3.13.1 版本中，Wayland 分支被合并到主储存库中。
*Clayland – 使用 Clutter 的 Wayland 合成器的简单范例。
*Sway – 平铺 Wayland 合成器和 X11 i3 视窗管理器的直接替代品。

**Weston**
Weston 是Wayland 合成器的参考实作，它也是由Wayland 专案开发的，使用C 语言编写，并在MIT 许可证下发布，由于Weston 依赖Linux 作业系统的某些功能，因此Weston只提供对Linux 作业系统的官方支援。其处理依赖evdev，虽然缓冲区的处理依赖于通用缓冲区管理 (GBM)，但是，2013 年宣布了 Weston 到 FreeBSD 的原型移植。
Weston 支援高频宽数位内容保护 (HDCP)。
Weston 依靠 GEM 在合成器和应用程式之间共用应用程式缓冲区。对于渲染，Weston 可以使用OpenGL ES 或pixman 函式库进行软体渲染。支援库作为依赖项。
Weston 的远端存取介面由 RealVNC 员工于 2013 年 10 月提出。

**Maynard**
Maynard 是一个图形 shell，被写为 Weston 的插件，就像 GNOME Shell 被写为 Mutter 的插件一样。
Raspberry Pi 基金会与 Collabora 合作发布了 Maynard，致力于提高效能和降低记忆体消耗。

**工具包**
 Clutter 对 Wayland 已经有完整的支持。- EFL 对 Wayland 通常情况下有完整支持。- Enlightenment Foundation Libraries 对Wayland已经有完整的支持。- QT 5 除了对 client 有一些改动之外，对Wayland已经有完整的支持。- GTK+3.4.0，发布于2012年3月26日，对 Wayland 的支持有一些缺陷。不过过随着3.4.1更新版本的发布，这个问题得到了缓解。- SDL自 2.0.2 发布以来开始支持 Wayland，自 2.0.4 开始默认启用。- GLFW 自 3.2 开始支持。- FreeGLUT 已开始支持。

**参见**
 X Window系统- Mir- Cairo

**参考资料**

**外部连结**
  官方网站 date=20101122134313