Closed3
Waylandのまとめ

Wayland
WaylandはX11 window systemプロトコルとアーキテクチャを置き換えるもので、開発、拡張、メンテナンスを容易にすることを狙っている。
Waylandは言語(プロトコル)。ディスプレイサーバーと通信するために使う。
Waylandのサーバーはcompositorといい、アプリケーションはWaylandクライアント。
例えばChromiumにおいては、ChromiumがWaylandクライアント(として動作する環境もある)、WaylandサーバーとしてはWestonなどが使われる。
ただ、Waylandはシステムのアーキテクチャ自身のことを指すこともある。

Waylandのアーキテクチャ概要
X11のアーキテクチャ
- カーネルは入力装置からイベントを受け取りXにevdevドライバーを経由して送付する。カーネルはここでデバイスを動かしたり、高尾tなるデバイス特異なイベントプロトコルをLinux evdev入力イベント標準に変換する。
- Xサーバーはどのウィンドウにイベントが影響を与えるかを決定し、ウィンドウ上のイベントのために選択したクライアントへ送付する。Xサーバーは実際のところこの操作をどうやって実現するかは知らない。なぜなら、ウィンドウのスクリーン上の位置はコンポジターによって選択されるからだ。また、いくつかのXサーバーが感知できない方法によって変換される可能性もある(スケールダウン、回転、揺れなど)。
- クライントはイベントを見つけ、何をするべきかを決定する。よくUIはイベントに対して応答し、変わらなければいけない。チェックボックスがクリックされたり、ポインターがボタンの上にホバーしたときなどはハイライトされる場合がある。したがって、クライアントは描画リクエストをXサーバーに対して送付する。
- Xサーバーが描画リクエストを受け取ったときには描画用のドライバーにそのリクエストを送付する。Xサーバーは描画の境界領域を計算し、コンポジターにdamage eventとして送付する。
- damage eventはコンポジターにウィンドウ上の何が変わったかを伝えたり、そのウィンドウが表示されているスクリーン上のどのパーツの再合成(recomposite)が必要かを伝える。コンポジターはシーングラフ[^1]とXウィンドウの内容に基づいて画面コンテンツ全体を描画する責任を負っている。しかし、これを描画するためにはXサーバーを経由しなければいけない。
- Xサーバーはコンポジターから描画リクエストを受けとり、そして、コンポジターはbufferをfront bufferにコピーするか、ページフリップを実施する。一般的なケースでは、Xサーバーがこのステップを行うことで、クリッピングが必要なウィンドウの重なりを考慮し、ページめくりを行えるかどうかを判断することができる。 しかし、常にフルスクリーンであるコンポジターでは、これも不必要なコンテキストスイッチになる。
Xサーバーはどのウィンドウがイベントを受け取るべきかを決定するための情報を持っていない。また、スクリーン座標をwindowローカルな座標に変換することもできない。

waylandにおいては、コンポジターはディスプレイサーバーである。我々はKMSとevdevの制御をコンポジターに転送する。waylandプロトコルはコンポジターに入力イベントを直接クライアントに送付することを可能にしている。また、クライアントにdamage eventを直接コンポジターに送付することを可能にしている。
Waylandのアーキテクチャ
- カーネルはイベントを取得し、コンポジターに送付する。これはXの場合と似ている。そのためカーネルの入力ドライバーを再利用できる。
- コンポジターはシーングラフに目を通し、どのウィンドウがイベントを受け取るべきかを決定する。シーングラフは何がスクリーンにあるかに対応している。そして、コンポジターはシーングラフの要素に適用されるかもしれない変換を理解している。したがって、コンポジターは正しいウィンドウを選ぶことができ、逆変換をりようすることで、スクリーン上の座標をローカルウィンドウの座標に変換できる。ウィンドウに適用されうる変換のタイプはコンポジターができる入力デバイスに対して逆変換を計算できるもの制限される。
- Xのケースのように、クライアントはイベントを受け取ったときにUIを更新に応じます。しかし、waylandの場合には、レンダリングはクライアントで起こる、そしてクライアントはただコンポジターに更新された領域を示すリクエストを送る。
- コンポジターはクライアントからdamage requestを集め、そしてスクリーンを再合成する。コンポジターはそんとき、KMSでページフリップをスケジュールするために直接ioctlを直接発行する。
このスクラップは2024/11/30にクローズされました