Linux システムソフトウェア - グラフィックスシステムの概要
本記事では、Linuxのグラフィックスシステムについて分かり易くまとめています。※随時更新しています。
Linux グラフィックススタック
最初にLinuxのグラフィックスのざっくりとした全体図を以下に示します。
UIツールキット
ユーザがUIを作成する場合、通常は簡単にUIを作れるようにツールキットを利用することが一般的です。実際、UIツールキットはオープンソース、商用のものなど多種多様なものが存在します。上記の図で記載しているものは比較的メジャーな物の一部を記載しているに過ぎません。
通常、UIツールキットはどれも後述のWindow ManagerのX11とWaylandの両方をサポートしているはずです。ただし、Waylandはまだ技術的に枯れていないため、Wayland上で動かすとX11では発生しないような不具合が発生する可能性がまだあります。
flutter-elinuxの宣伝
FlutterをRaspberry Pi4などのArm64 CPUの組み込みデバイスで簡単かつ軽量に利用できるようにflutter-elinuxをソニーで開発しました。良かったら使って下さい。
Window Manager
デスクトップでは通常Window Managerという複数のウインドウを管理するミドルウェアが利用されます。Linuxの世界では、X11とWaylandの2種類があります(正確にいうと、X11もWaylandもウインドウシステム用のプロトコル仕様であり、実際のソフトウェアではない)。
Window Managerは以下のような機能を持っていることが一般的です。
- ディスプレイサーバ (コンポジット機能)
- 複数ウインドウの重ね合わせ
- 複数ウインドウのレイヤ制御(どのウインドウを最前面に出すか、裏に隠れているウインドウは描画しないなど)
- ウインドウのアニメーション制御(最大、最小化時などのアニメーション演出)
- マルチディスプレイ制御
- グラフィックスシェル(System UI)
- アプリケーションランチャー
- メニューバー
- コンテキストメニュー
- ウインドウ装飾(max/min/closeボタン等のウインドウ枠)
- 画面ロック
- ユーザからのマウスやキーボード等の入力管理
X11 (X Window System)
通常、XとかX11とか呼びます。現在最も利用されているウインドウシステムですが、Ubuntu22からはWaylandがデフォルトになるなど、古くからあるため複雑化しており今後はWaylandに置き換わっていくことになります。
Wayland
WaylandはX11に変わるウインドウシステムを目指した軽量プロトコルです。クライアントとサーバのプロトコルだけ定義し、libwayland
として提供されており、実際のサーバのソフトウェアはwestonやSwayなど多くのWaylandコンポジッタが存在します。
代表的なコンポジッタ
シンプルなWaylandコンポジッタのサンプル
自作したWaylandのコンポジッタです。未完成かつ不具合もありますが、何となくどういうものかを把握するにはサンプルとして役立つかもしれません。
グラフィックスライブラリ (API)
Window Managerの下のレイヤには、OpenGLなどのグラフィックス向けライブラリが存在します。基本的にこのレイヤのソフトウェアはAPIと振る舞いだけを規格として定め、後は各種SoCなどベンダー依存の実装になります。
Mesa
Mesa
は、OpenGL, OpenGL ES, Vulkan, OpenCLなどのプロプライエタリな実装ではなく汎用で使えるオープンなグラフィックスライブラリの実装です。
OpenGL, OpenGL ES
OpenGL
は知っている方が多いと思いますが、2Dおよび3Dベクターグラフィックスのライブラリです。OpenGL ES (OpenGL for Embedded Systems) は組込み機器向けに特化して軽量化したもので、OpenGLとは使えるAPIやパラメータが少し異なっていますが、基本的には同じものです。組込み機器ではOpenGL ES, それ以外のデスクトップではOpenGLを使うという感じになります。
EGL
OpenGL, OpenGL ESはプラットフォームに依存しないAPIの仕様です。しかし、実際には異なるウインドウシステムやOSなど、プラットフォームやハードウェアによって実装の違いが出てくる部分があります。その部分を抽象化して吸収する部分がEGL
です。そのため、EGLはベンダー依存の実装になります。
GBM (Generic Buffer Management)
通常、グラフィックスを扱う場合には描画用のフレームバッファが用意されます。このフレームバッファは通常、カーネルモジュールのDRM/KMS (後述) が機能を提供します。このフレームバッファ操作を抽象化してユーザが操作するようにライブラリ化したものがGBMです。
EGLStream
位置付け的には、GBMと同じ機能を提供するものです。本来はEGLとセットになる仕様ですが、GBMの方が先に普及して利用される状況になってしまっており、EGLStreamはあまり普及していないという状況で、GBMとEGLStreamどちらを使うかは好みや利用するプラットフォーム次第となります。
Libdrm
カーネルモジュールのDRM/KMS (後述) がフレームバッファやディスプレイ出力に関する設定などの機能を提供しますが、通常ユーザランドではこのカーネルモジュールのAPIを直接触るのではなく、ベンダーが提供するLibDRMと呼ばれるライブラリを利用します。
LibDRMのAPIは共通化されていますが、ハードウェア依存や拡張機能などの部分はLibdrm-*(ほにゃらら)として別ライブラリが提供されます。
Vulkan
OpenGLはCPUのオーバヘッドが高く、それを改善してより高速で効率的な2D/3Dグラフィックス仕様を設計し直したものがVulkan
です。OpenGLの後継と思ってもらっていいと思いますが、APIや仕様は全くの別物で、より低レイヤな仕様になっています。
DRM / KMS
フレームバッファやディスプレイ出力に関する設定などの機能を提供するカーネルモジュールが、DRM
およびKMS
です。
具体的な仕様は以下のドキュメントを見て下さい。
DRM (Direct Rendering Manager)
GPUを利用してグラフィックスを描画するためのAPIを提供します。
KMS (Kernel Mode Setting)
画面出力のためのディスプレイコントローラの設定に関するAPIを提供します。
Discussion
はじめまして。私、このあたりの分野が完全に未知なのですが、Linuxのグラフィックススタックについてある程度体系的に学べる書籍等ご存知でしたら、教えていただけますでしょうか。
はじめまして。残念ながら日本語の本でそのようなものは見つけたことがありません。
ただ、英語の資料になりますが、多分これが一番まとまっていると思います。
あとはこれもそこそこ情報があります。
英語の方の資料、よくまとまっており参考になりました。ありがとうございました。