1.Wayland介紹

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ù)編譯副本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 嵌入式Linux的Qt 在嵌入式Linux系統(tǒng)上,可以使用多個(gè)平臺(tái)插件:EGLFS,LinuxFB,DirectF...
    YottaYuan閱讀 18,463評(píng)論 0 9
  • https://github.com/dvdhrm/docs/blob/master/drm-howto/mode...
    seuwt閱讀 2,896評(píng)論 0 50
  • 窗口管理器有好幾種,stacking 、tiling 和 compositing 其中 瓦片式(tiling wi...
    LinuxDE閱讀 8,295評(píng)論 0 4
  • 如何擴(kuò)展 wayland 協(xié)議 為了能夠擴(kuò)展 wayland 協(xié)議,首先需要理解 wayland 協(xié)議,并且知道怎...
    LinuxDE閱讀 6,479評(píng)論 6 8
  • 這是一個(gè)肌球蛋白,拖著一個(gè)內(nèi)啡肽,走在一個(gè)單纖維上,然后大搖大擺的走過你的大腦皮層,這是讓你產(chǎn)生快樂的物質(zhì),它為了...
    Cheungvia閱讀 3,681評(píng)論 1 15

友情鏈接更多精彩內(nèi)容