Wayland

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作為業餘項目，目標是讓「每一個幀都完美無瑕，也就是說應用程式要能充分地控制圖形的渲染，使我們完全無法察覺任何的撕裂、延遲、重畫及閃爍」。這一靈感浮現時他正開車經過麻薩諸塞州的韋蘭，也就由此決定了項目的名字。

2010年10月，Wayland加入了Freedesktop.org項目。在遷移過程中，郵件列表wayland-devel代替了原先的Google group郵件組，用於討論項目的開發。

Wayland是自由軟體，它的庫(libwayland-server和libwayland-client)以MIT License授權，示例程序和Compositor一開始以GPLv2授權。現在整個項目都是以MIT License授權。直到2010年11月份，Wayland還僅僅只能在Intel、Nvidia和AMD的開源驅動上運行。

## 設計

<image>

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的區別：

<image>

在X中：

- 內核捕獲滑鼠點擊事件並發送給X server。
- X server會計算該把這一事件發送給哪個窗口（事實上，窗口位置是由Compositor控制的，X server並不能夠正確的計算Compositor做過特效變化之後的按鈕的正確位置）。
- 應用程式對此事件進行處理（將引發按鈕更新動作）。但是，在此之前它得向X server發送繪製請求。
- X server接收到這條繪製請求，然後把它發給影片驅動來渲染。X還計算了更新區域，並且這條「垃圾資訊」發送給了Compositor。
- 這時，Compositor知道它必須要重新合成螢幕上的一塊區域。當然，這還是要向X server發送繪製請求的。
- 開始繪製。但是X server還會去做一些不必要的本職工作（窗口重疊計算、窗口剪裁計算等）。

<image>

在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而是一個顯示伺服器，並聲明這個新興的專案尚處於未成熟的階段。

## 使用

### 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 已開始支持。

## 基本資料

- 作者：Kristian Høgsberg
- 發行日期：2008年9月30日
- 軟體版本週期：Wayland: 1.23, Weston: 14.0.1
- 軟體版本週期：2024年5月30日
- 程式語言：C
- 作業系統：類Unix系統
- 類型：顯示服務
- 許可協議：MIT許可證