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 開發者，曾參與過和的開發。他在 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 的開源驅動上執行。

設計

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

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

使用

4.1 Arch Linux

Arch Linux 本身不具有 Wayland。但實際上，安裝 Enlightenment 或 KDE 等桌面環境時，可以選用 Wayland 安裝作為顯示伺服器。

4.2 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。

4.3 Fedora

Fedora 25 整合了 GNOME 桌面最新版本 3.22，並將 GNOME 桌面的版本的顯示後端切換至預設為 Wayland。

4.4 RHEL

RHEL 8 整合了 Wayland。

4.5 Qt

Qt 5.x 提供了 QtWayland 模組以支援 Wayland 協議，藉由 - platform 命令列選項，Qt 應用程式可以在執行時切換圖形後端，如 X 與 Wayland。2011 年 1 月，Wayland 支援進入上游 Qt 版本庫的 Lighthouse 分支。

4.6 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。

4.7 GNOME

GNOME 從 3.10 開始支援 Wayland。

4.8 Compiz

Compiz 開發者們已經把它對 X 的依賴部分變成了一個可選外掛。同時，Canonical 正在為 Compiz 新增 OpenGL ES 的支援。眾所周知，目前 Wayland 正是使用 OpenGL ES，這使將得 Compiz 能夠更容易遷移到 Wayland。

註:compiz 此專案的主要作者已經離開 Canonical，使得此專案進入停止開發的狀態，當然遷移到 wayland 的計劃也就更遙遙無期。

4.9 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 視窗管理器的直接替代品。

5.1 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 月提出。

5.2 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 已開始支援。