Wayland是Unix類系統(tǒng)的下一代顯示服務(wù)器,由可敬的Xorg-Server的校友設(shè)計(jì)和建造,是將您的應(yīng)用程序窗口放到用戶屏幕上的最佳方式。過去使用過X11的讀者將會(huì)對Wayland的改進(jìn)感到驚喜,而那些在Unix上進(jìn)行圖形處理的新手將會(huì)發(fā)現(xiàn)它是一個(gè)構(gòu)建圖形應(yīng)用程序和桌面的靈活且強(qiáng)大的系統(tǒng)。
這本書將幫助您對Wayland的概念、設(shè)計(jì)和實(shí)現(xiàn)有一個(gè)堅(jiān)實(shí)的基礎(chǔ),并為您提供構(gòu)建自己的Wayland客戶端和服務(wù)端應(yīng)用程序的工具。在您的閱讀過程中,我們將建立一個(gè)對Wayland的心理模型,并建立其設(shè)計(jì)的理由。在書中的這些頁面中,當(dāng)您清楚地了解Wayland的直觀設(shè)計(jì)選擇時(shí),您應(yīng)該會(huì)發(fā)現(xiàn)許多“啊哈!”的時(shí)刻,這應(yīng)該會(huì)幫助您繼續(xù)閱讀。歡迎來到開源圖形的未來!
注意:這是一個(gè)草稿。第1-10章或多或少已經(jīng)完成了,但可能會(huì)稍后更新。第11章及以后的部分大部分還有待編寫。
待辦事項(xiàng):
- 在第2.4章中擴(kuò)展資源生命周期并避免競爭條件
- 將linux-dmabuf的詳細(xì)信息移至附錄,添加有關(guān)wl_drm和Mesa的說明
- 重寫引言文本
- 添加交互式移動(dòng)的示例代碼,以演示使用serials
- 準(zhǔn)備PDF和EPUB格式的文件
關(guān)于本書
本作品采用知識(shí)共享署名-相同方式共享4.0國際許可協(xié)議進(jìn)行許可。源代碼可在此處獲取。
https://creativecommons.org/licenses/by-sa/4.0/
關(guān)于作者
用Drew親密合作者Preston Carpenter的話說:Drew DeVault通過構(gòu)建sway進(jìn)入了Wayland世界,這是流行的平鋪窗口管理器i3的克隆。 如今,無論從任何方面衡量,它都是最受歡迎的平鋪Wayland合成器:用戶、提交次數(shù)、影響力。 在取得成功之后,Drew通過啟動(dòng)wlroots回報(bào)了Wayland社區(qū):它是構(gòu)建Wayland合成器的開放的、可組合的模塊。 如今,它是數(shù)十個(gè)獨(dú)立合成器的基礎(chǔ),Drew是Wayland最重要的專家之一。
1.1 高層設(shè)計(jì)
您的計(jì)算機(jī)具有輸入和輸出設(shè)備,它們各自負(fù)責(zé)從您接收信息并向您顯示信息。 這些輸入設(shè)備的形式如下:
- 鍵盤
- 鼠標(biāo)
- 觸摸板
- 觸摸屏
- 繪圖板
您的輸出設(shè)備通常采用顯示器形式,不管是在桌面、筆記本電腦或移動(dòng)設(shè)備上。 這些資源在您的所有應(yīng)用程序之間共享,Wayland合成器的作用是將輸入事件分派到適當(dāng)?shù)腤ayland客戶端,并在您的輸出設(shè)備上適當(dāng)?shù)奈恢蔑@示它們的窗口。 將您的所有應(yīng)用程序窗口組合起來以便在輸出設(shè)備上顯示的過程稱為合成 - 因此,我們將其稱為合成器。
實(shí)操
桌面生態(tài)系統(tǒng)中有很多不同的軟件組件。 有像Mesa這樣的渲染工具(及其每個(gè)驅(qū)動(dòng)程序),Linux KMS / DRM子系統(tǒng),使用GBM進(jìn)行緩沖區(qū)分配,用戶空間的libdrm庫,libinput和evdev等等。 不要擔(dān)心-對于理解Wayland來說,大多數(shù)這些系統(tǒng)的專業(yè)知識(shí)都不是必需的,而且在任何情況下都超出了本書的范圍。 事實(shí)上,Wayland協(xié)議非常保守和抽象,基于Wayland的桌面可以輕松構(gòu)建和運(yùn)行大多數(shù)應(yīng)用程序,而不涉及任何這些軟件。 話雖如此,對這些組件以及它們?nèi)绾喂ぷ饔幸粋€(gè)表面的理解是有用的。 讓我們從底層開始并逐步向上。
硬件
一臺(tái)典型的計(jì)算機(jī)配備了一些重要的硬件。在箱子外面,我們有你的顯示器、鍵盤、鼠標(biāo),也許還有一些揚(yáng)聲器和一個(gè)可愛的USB杯加熱器。箱子里面有幾個(gè)組件用于與這些設(shè)備接口。例如,你的鍵盤和鼠標(biāo)可能插入U(xiǎn)SB端口,你的系統(tǒng)為此配備了專門的USB控制器。你的顯示器插入到你的GPU。
這些系統(tǒng)有自己的工作和狀態(tài)。例如,你的GPU以存儲(chǔ)像素緩沖區(qū)的內(nèi)存的形式存在狀態(tài),以及將這些緩沖區(qū)掃描到你的顯示器等工作。你的GPU還提供了一個(gè)處理器,該處理器經(jīng)過專門調(diào)整,非常擅長高度并行的工作(例如為1080p顯示器上的2,073,600個(gè)像素計(jì)算正確的顏色),但在其他方面則表現(xiàn)不佳。USB控制器的任務(wù)是實(shí)現(xiàn)傳奇般干燥的USB規(guī)范,以便從你的鍵盤接收輸入事件,或者指示你的杯架溫度經(jīng)過仔細(xì)選擇,以避免同時(shí)起訴和用冷咖啡讓你感到沮喪。
在這個(gè)層面上,你的硬件對在你的系統(tǒng)上運(yùn)行的應(yīng)用程序幾乎沒有概念。硬件提供了一個(gè)接口,可以通過該接口命令它執(zhí)行工作,并按照指示進(jìn)行操作-無論誰告訴它這樣做。因此,只允許一個(gè)組件與它通信。
內(nèi)核
這一責(zé)任落到內(nèi)核身上。 內(nèi)核是一個(gè)復(fù)雜的野獸,因此我們將只關(guān)注與Wayland相關(guān)的部分。 Linux的工作是提供對硬件的抽象,以便可以由用戶空間安全地訪問 - Wayland合成器在其中運(yùn)行。 對于圖形,這被稱為DRM或直接渲染管理器,它有效地將GPU與來自用戶空間的工作任務(wù)分派。 DRM的一個(gè)重要子系統(tǒng)是KMS或內(nèi)核模式設(shè)置,用于枚舉您的顯示器并設(shè)置屬性,例如選擇的分辨率(也稱為它們的“模式”)。 輸入設(shè)備通過稱為evdev的接口進(jìn)行抽象化。
大多數(shù)內(nèi)核接口都通過/dev中的特殊文件提供給用戶空間。 在DRM的情況下,這些文件位于/dev/dri/中,通常是主節(jié)點(diǎn)(例如card0)的形式,用于特權(quán)操作,如模式設(shè)置,以及渲染節(jié)點(diǎn)(例如renderD128),用于無特權(quán)操作,如渲染或視頻解碼。 對于evdev,這些“設(shè)備節(jié)點(diǎn)”是/dev/input/event*。
用戶空間
現(xiàn)在,我們進(jìn)入用戶空間。在這里,應(yīng)用程序與硬件隔離,必須通過內(nèi)核提供的設(shè)備節(jié)點(diǎn)進(jìn)行操作。
libdrm
大多數(shù)Linux接口都有一個(gè)用戶空間的對應(yīng)部分,為這些設(shè)備節(jié)點(diǎn)提供了一個(gè)舒適(的)C API。其中一個(gè)這樣的庫是libdrm,它是DRM子系統(tǒng)的用戶空間部分。Wayland合成器使用libdrm進(jìn)行模式設(shè)置和其他DRM操作,但通常不被Wayland客戶端直接使用。
Mesa
Mesa是Linux圖形堆棧最重要的部分之一。除了其他事物外,它還為Linux提供了供應(yīng)商優(yōu)化的OpenGL(和Vulkan)實(shí)現(xiàn),以及GBM(通用緩沖區(qū)管理)庫-這是libdrm上的一個(gè)抽象,用于在GPU上分配緩沖區(qū)。大多數(shù)Wayland合成器將通過Mesa使用GBM和OpenGL,而大多數(shù)Wayland客戶端將使用至少其OpenGL或Vulkan實(shí)現(xiàn)。
libinput
與libdrm抽象DRM子系統(tǒng)一樣,libinput提供了evdev的用戶空間端。它負(fù)責(zé)從內(nèi)核接收到來自您的各種輸入設(shè)備的輸入事件,解碼它們?yōu)榭捎玫男问剑⑵鋫鬟f給Wayland合成器。Wayland合成器需要特殊權(quán)限才能使用evdev文件,迫使Wayland客戶端通過合成器接收輸入事件-例如,這可以防止鍵盤記錄。
(e)udev
處理來自內(nèi)核的新設(shè)備的出現(xiàn),配置/dev中相應(yīng)設(shè)備節(jié)點(diǎn)的權(quán)限,并向系統(tǒng)上運(yùn)行的應(yīng)用程序發(fā)送這些更改的消息,這是落入用戶空間的職責(zé)。大多數(shù)系統(tǒng)為此使用udev(或稱為eudev,它是udev的一個(gè)分支)。您的Wayland合成器使用udev來枚舉輸入設(shè)備和GPU,并接收新設(shè)備出現(xiàn)或舊設(shè)備拔出時(shí)的通知。
xkbcommon
XKB代表X鍵盤,是Xorg服務(wù)器的原始鍵盤處理子系統(tǒng)。幾年前,它從Xorg樹中提取出來,并成為獨(dú)立的鍵盤處理庫,與X沒有任何實(shí)際關(guān)系。Libinput(與Wayland合成器一起)以掃描碼的形式傳遞鍵盤事件,其確切含義因鍵盤而異。xkbcommon的責(zé)任將這些掃描碼翻譯成有意義和通用的鍵“符號(hào)”-例如,將65轉(zhuǎn)換為XKB_KEY_Space。它還包含一個(gè)狀態(tài)機(jī),知道按住Shift鍵時(shí)按下“1”會(huì)發(fā)出“!”。
Pixman
一個(gè)簡單的庫,供客戶端和合成器使用,以有效地操縱像素緩沖區(qū),進(jìn)行與相交矩形的數(shù)學(xué)運(yùn)算,并執(zhí)行其他類似的像素操作任務(wù)。
libwayland
libwayland是Wayland協(xié)議最常用的實(shí)現(xiàn),用C語言編寫,處理低層次電纜協(xié)議的大部分內(nèi)容。它還提供了一個(gè)工具,可以從Wayland協(xié)議定義(XML文件)生成高級(jí)代碼。我們將在第1.3章和本書中詳細(xì)討論libwayland。
其他
到目前為止提到的每個(gè)部分在Linux桌面生態(tài)系統(tǒng)始終存在。除此之外,還有更多的組件。許多圖形應(yīng)用程序根本不知道Wayland,而是選擇讓GTK +、Qt、SDL和GLFW等庫來處理它。許多合成器選擇像wlroots這樣的軟件來抽象更多的職責(zé),而其他合成器則自行實(shí)現(xiàn)所有功能。
1.2 目標(biāo)與目標(biāo)受眾
我們的目標(biāo)是讓您通過閱讀本書,了解Wayland協(xié)議及其高級(jí)用法。您應(yīng)該對核心Wayland協(xié)議中的所有內(nèi)容有充分了解,并具備評(píng)估和實(shí)施各種生產(chǎn)用途所需的協(xié)議擴(kuò)展所需的知識(shí)。本書主要使用Wayland客戶端的關(guān)注點(diǎn)來構(gòu)建對Wayland的介紹。但是,它也應(yīng)該為那些從事Wayland合成器工作的人提供一些實(shí)用性。
免費(fèi)的桌面生態(tài)系統(tǒng)是復(fù)雜的,并且由許多獨(dú)立的組件構(gòu)成。我們在此討論的這些組件非常少,您在此不會(huì)找到有關(guān)在Wayland合成器中利用libdrm的信息,也不會(huì)找到有關(guān)使用libinput處理evdev事件的信息。因此,本書不是構(gòu)建Wayland合成器的全面指南。我們也不會(huì)討論對Wayland客戶端有用的繪圖技術(shù),例如Cairo、Pango、GTK+等等,因此本書也不是一個(gè)用于實(shí)際Wayland客戶端實(shí)現(xiàn)的可靠指南。相反,我們只關(guān)注Wayland的特定部分。
本書只涵蓋協(xié)議和libwayland。如果您正在編寫客戶端并且已經(jīng)熟悉您最喜歡的用戶界面渲染庫,請帶上您自己的像素,我們將幫助您在Wayland上顯示它們。如果您已經(jīng)了解操作顯示和輸入設(shè)備所需的技術(shù),那么這本書將幫助您學(xué)習(xí)如何與客戶端通信。
1.3 Wayland軟件包中有什么
當(dāng)你在Linux發(fā)行版中安裝“wayland”時(shí),你很有可能會(huì)安裝libwayland-client、libwayland-server、wayland-scanner和wayland.xml的http://freedesktop.org發(fā)行版。它們分別位于/usr/lib & /usr/include、/usr/bin和/usr/share/wayland/。這個(gè)軟件包代表了Wayland協(xié)議的最流行實(shí)現(xiàn),但并不是唯一的實(shí)現(xiàn)。第3章詳細(xì)介紹了這個(gè)Wayland實(shí)現(xiàn);本書的其余部分同樣適用于任何實(shí)現(xiàn)。
wayland.xml
Wayland協(xié)議由XML文件定義。如果你在你的最喜歡的文本編輯器中找到并打開“wayland.xml”,你會(huì)找到“核心”Wayland協(xié)議的XML規(guī)范。這是一個(gè)高級(jí)協(xié)議——建立在我們將在下一章討論的線路協(xié)議之上。這本書的大部分內(nèi)容都用來解釋這個(gè)文件。
wayland-scanner
“wayland-scanner”工具用于處理這些XML文件并生成代碼。最常見的實(shí)現(xiàn)是你現(xiàn)在正在查看的這個(gè),它可以用于從像wayland.xml這樣的XML文件生成C頭和粘合代碼。其他編程語言的掃描儀包括wayland-rs(Rust)和waymonad-scanner(Haskell)等等。
libwayland
libwayland-client和libwayland-server這兩個(gè)庫包括連接每個(gè)端口的線路協(xié)議的實(shí)現(xiàn)。提供了一些用于處理Wayland數(shù)據(jù)結(jié)構(gòu)的常用工具,一個(gè)簡單的事件循環(huán)等等。此外,這些庫還包含由wayland-scanner生成的core Wayland協(xié)議的預(yù)編譯副本。