Wayland


Wayland 是 Linux 上的一款顯示協議,其致力於成為古老的 X 協議的一個更簡潔的替代品。目前 KDE 和 Gnome 桌面系統都有計划遷移到 Wayland。

Wayland 即代表了一款協議,也代表了一個實現了該協議的 C 庫。

開始前如果你可能有必要了解一下渲染(rendering) 和合成(compositing) 的區別,一個桌面上可能有許多窗口,渲染是相對窗口而言,根據應用程序來決定窗口應該呈現什么樣的內容,但是不同窗口可能互相存在堆疊,因此需要將多個窗口的渲染圖像合成來組成整的屏幕的圖像。

Wayland 架構

傳統的 X 協議的架構:

  1. 內核從輸入設備中斷中獲得一個事件並將其通過 evdev 輸入設備驅動發送給 X 服務器。內核需要負責驅動設備並將各種不同輸入設備的事件轉換成符合 evdev 驅動標准的事件。
  2. X 服務器決定該事件影響哪個窗口,並將其發送給該窗口上的相關事件選擇的客戶端。X 服務器並不知道如何將事件發送給正確的窗口,因為窗口的位置由渲染合成器(Compositer)掌控。
  3. 客戶端查看事件並決定如何處理,通常處理包括圖形界面的變化,比如用戶點擊一個按鈕,客戶端則需要將圖形界面變化的渲染需求返回給 X 服務器。
  4. X 服務器接收到渲染需求之后,其將其發送給相應的顯示驅動讓其計算渲染緩沖。X 服務器同時還要計算渲染的邊界區域並將其以 毀滅事件(damage event) 的形式發送給合成器。
  5. 毀滅事件意味着窗口發生了改變,合成器需要重新合成該窗口可見部分的屏幕區域。合成器負責渲染整個屏幕區域,包括屏保和各個窗口的內容。但是其必須向 X 服務器請求來在顯示器上渲染這些。因此合成器可以看作一個特殊的客戶端。
  6. X服務器接收來自排字器的渲染請求,或者將排字器的后端緩沖區復制到前端緩沖區,或者進行翻頁。在一般情況下,X服務器必須執行這一步,以便考慮重疊的窗口,這可能需要剪切並確定是否可以翻頁。然而,對於始終是全屏的排字器,這是另一個不必要的上下文切換。

顯然對於 X 協議的顯示方法有幾點問題。X 服務器既不掌控各個窗口的位置信息,也無法將屏幕坐標轉換為窗口內的相對坐標。總的來說,X 服務器只是一個介於程序與合成器,合成器與硬件之間的中間人,它的存在使得雙方的交流多了一步。

而在 Wayland 中,只存在一個合成器作為中間人:

  1. 內核接收到事件之后直接發送給合成器,這一步與 X 協議相同,同時也是必要的,因為所有驅動都工作在內核態。
  2. 合成器掃描其屏幕信息來決定哪個窗口應該接收事件,並且合成器可以直接將屏幕坐標轉換為窗口坐標。
  3. 在 X 協議中,客戶端接收到事件之后,其根據事件更新自己的UI。在 Wayland 中,渲染部分發生在客戶端中,再由客戶端給合成器發送請求哪部分需要更新。
  4. 合成器從客戶端中接收 damage requests 並重新合成屏幕圖像

Wayland 客戶端渲染

上面沒有提到的一點是 Wayland 客戶端的渲染方式。

Wayland 客戶端采用直接渲染(direct rendering),直接渲染下,客戶端和服務端共用一段 video memory buffer, 客戶端通過相應的庫對這段緩沖進行渲染然后通知合成器應該使用那個緩沖以及其渲染的時間和區域。

通常客戶端在渲染時可以保持兩個及以上的buffer用於渲染,因為如果實際如果客戶端和合成器真的只共用一段buffer 的話,可能的結果就是合成器還未來得及合成數據就被修改,導致窗口屏幕只渲染了一半。

因此使用兩個buffer 是比較常用的做法。

Wayland 的硬件支持

涉及到更加復雜的計算機圖形顯示方面的知識,略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM