注意(2022年10月12日追記)
この記事は2021年4月に投稿したものであり、古い内容が含まれています。2022年10月に以下の記事を投稿しましたので参照してください。
・『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(概要編)』@Qiita
はじめに
Lima とは Mali-400/450 用のオープンソースなグラフィックドライバです。筆者は Lima を Ultra96/Ultra96-V2 向け Ubuntu 20.04 で試験的に動かしてみました。動かすのに少々苦労したので、その方法を何回かに分けて説明します。
- 概要編 (この記事)
- DRM Lima 編
- DRI Lima 編
- 共有バッファ編
- ストライド問題編
- インストール編
- Ubuntu Desktop ビルド編
この記事では、Lima を動かすための予備知識として、DRI(Direct Rendering Infrastructure) を説明した後、Lima を動かすために必要な DRI コンポーネントについて説明します。
なお、現時点(2021年4月)では、Ubuntu 20.04 の gnome-shell が動作するところまで確認していますが、すべてのアプリケーションで動作を確認したわけでは無いことに注意してください。
DRIとは
Lima の説明をする前に、まず、DRI(Direct Rendering Infrastructure) の説明をします。
DRI は Linux 上でハードウェアアクセラレーションによる3Dグラフィックを可能にするためのソフトウェアアーキテクチャです。具体的には、DRI は Linux カーネル、Xウィンドウシステム、3D グラフィックハードウェア、および OpenGL ベースのレンダリングエンジンを調整します。DRI に関する詳しい情報は以下の URL を参照してください。
- Mesa 3D and Direct Rendering Infrastructure wiki (https://dri.freedesktop.org/wiki)
DRI コンポーネント
DRI は単一のソフトウェアではなく、いくつかのコンポーネントで構成されています。
Fig.1 DRI Components
libGL
OpenGL ベースのプログラムは libGL ライブラリとリンクする必要があります。libGL は OpenGL API のエントリーポイントだけでなく、GLX インターフェースも実装しています。
ダイレクトレンダリングを使用する場合、libGL は適切な DRI ドライバをロードしてOpenGL ライブラリへの呼び出しを直接 DRI ドライバにディスパッチします。
DRI ドライバ
DRI ドライバは基本的に、OpenGL コマンドシーケンスをハードウェアコマンドに変換し、Linux カーネルのDRMドライバを使用してコマンドをハードウェアに送信します。DRI ドライバは、DRM がカーネル空間で必要なことをすべて実行する間、ユーザー空間で可能な限り多くの処理を行います。
DRM ドライバ
DRM(Direct Rendering Manager) ドライバは DRI の Linuxカーネル部分のコンポーネントです。 GPU にアクセスするためのインターフェース(DRM API) を提供します。また、KMS(Kernel Mode Setting) をサポートする場合もあります。KMS はカーネル空間側でディスプレイの解像度や色深度を設定するモジュールです。
X-Server DRI 拡張
Xorg が提供する X-Server は DRI に対応するための拡張機能(extension) を持っています。DRI 拡張機能は他の DRI コンポーネント(libGL や DRMドライバ)間の通信に使用されます。
Lima とは
Limaは ARMのMali-400/450組み込みGPUをサポートするオープンソースのグラフィックスドライバーです。Lima に関する詳しい情報は以下の URL を参照してください。
- Lima web (https://gitlab.freedesktop.org/lima/web)
Fig.2 のシェードをかけた部分が示すように、Limaは 大きくわけて DRM Lima と DRI Lima の二つで構成されています。DRM Lima は Linux カーネルのDRMドライバです。DRI Lima はMesa(オープンソースな OpenGL 実装)のDRIドライバです。
Fig.2 DRM Lima and DRI Lima
DRM Lima は linuxカーネル5.2で、DRI Lima は Mesa 19.1でそれぞれのメインラインにアップストリームされました。
Lima を動かすための DRI コンポーネント
Ultra96/Ultra96-V2 + Ubuntu 20.04 で Lima を動かすためには、前述の DRM Lima と DRI Lima を追加するだけではダメでした。DRM Xlnx と DDX armsoc-xlnx にも手を入れなければなりませんでした。
Fig.3 DRI Components for running Lima
つまり、Ultra96/Ultra96-V2 + Ubuntu 20.04 で Lima を動かすためには次の4つのコンポーネントが関わってきます。(似たような名称が並んでいて紛らわしい反面、語呂が良い)
- DRM Lima - Linux DRM(Direct Rendering Manager) Driver for Lima
- DRI Lima - Mesa DRI(Direct Rendering Infrastructure) Driver for Lima
- DRM Xlnx - Linux DRM(Direct Rendering Manager) Driver for Xlnx
- DDX Xlnx - Xorg DDX(Device Dependent X) Driver for armsoc-xlnx
Mali GPUはレンダリング専用であり、ディスプレイの制御用ではないことに注意してください。Ultra96/Ultra96-V2 に採用されている ZynqMP(Zynq Ultrascale+ MPSoC) には、ディスプレイ出力を制御するための独自のディスプレイエンジン(zynqmp_dpsub)があります。したがって、Mali GPUによってレンダリングされたコンテンツをディスプレイに表示するには、zynqmp_dpsub を制御するDRM Xlnx が必要です。
X-Server の DRI 拡張に対応するためには、DDX ドライバが DRI に対応している必要があります。具体的には、DRMドライバが提供するバッファを他の DRI コンポーネントと共有するための仕組みを提供していなければなりません。この仕組みには DRI2 と DRI3 があるのですが、Lima の場合は DRI3 でなければ動作しませんでした。ここらへんの詳細は共有バッファ編およびストライド問題編で説明します。
ブートイメージ
以下の URL にLima に対応した Ultra96/Ultra96-V2 向け Ubuntu20.04 のブートイメージを提供しています。使ってみたい人は注意事項を確認のうえインストールしてみてください。
参考
- Lima web (https://gitlab.freedesktop.org/lima/web)
- Mesa 3D and Direct Rendering Infrastructure wiki (https://dri.freedesktop.org/wiki)
- https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96