Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(概要編)




# 注意(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 上でハードウェアアクセラレーションによる３Dグラフィックを可能にするためのソフトウェアアーキテクチャです。具体的には、[DRI] は Linux カーネル、Xウィンドウシステム、３D グラフィックハードウェア、および OpenGL ベースのレンダリングエンジンを調整します。[DRI] に関する詳しい情報は以下の URL を参照してください。

  * Mesa 3D and Direct Rendering Infrastructure wiki  (https://dri.freedesktop.org/wiki)


## DRI コンポーネント


[DRI] は単一のソフトウェアではなく、いくつかのコンポーネントで構成されています。


![Fig.1 DRI Components](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/96bfbc7e-5d18-bce9-71c2-dd555843efc2.jpeg "Fig.1 DRI Components")

Fig.1 DRI Components

<br />


### 　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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/36d12c40-f9f0-b20c-d096-eb315e778da1.jpeg "Fig.2 DRM Lima and DRI Lima")

Fig.2 DRM Lima and DRI Lima

<br />



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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/d4b180ea-060e-b63b-312a-e207e7b023ab.jpeg "Fig.3 DRI Components for running Lima")

Fig.3 DRI Components for running Lima

<br />



つまり、Ultra96/Ultra96-V2 + Ubuntu 20.04 で [Lima] を動かすためには次の４つのコンポーネントが関わってきます。（似たような名称が並んでいて紛らわしい反面、語呂が良い）



1. DRM Lima - Linux DRM(Direct Rendering Manager) Driver for Lima 
2. DRI Lima - Mesa DRI(Direct Rendering Infrastructure) Driver for Lima
3. DRM Xlnx - Linux DRM(Direct Rendering Manager) Driver for Xlnx
4. 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 のブートイメージを提供しています。使ってみたい人は注意事項を確認のうえインストールしてみてください。



* https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96




# 参考


* 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



[概要編]: https://qiita.com/ikwzm/items/642df8c14fd3a9e782b6 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(概要編)』@Qiita"
[DRM Lima 編]: https://qiita.com/ikwzm/items/91adfcf05e767d33be70 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(DRM Lima 編)』@Qiita"
[DRI Lima 編]: https://qiita.com/ikwzm/items/ec29ae456ead67438733 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(DRI Lima 編)』@Qiita"
[共有バッファ編]: https://qiita.com/ikwzm/items/ed2ce2d8bb90391d7c65 "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(共有バッファ編)』@Qiita"
[ストライド問題編]: https://qiita.com/ikwzm/items/5c4c0114c15cfba8e95b "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(ストライド問題編)』@Qiita"
[インストール編]: https://qiita.com/ikwzm/items/4dfb8f06ddf9d59e310c "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(インストール編)』@Qiita"
[Ubuntu Desktop ビルド編]: https://qiita.com/ikwzm/items/21a59e68d30ad9faad6a "『Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(Ubuntu Desktop ビルド編)』@Qiita"
[『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(概要編)』@Qiita]: https://qiita.com/ikwzm/items/e8fa7540efdf580e902f "『ZynqMP 向け Ubuntu22.04で Lima を動かしてみた(概要編)』@Qiita"
[Lima]: https://gitlab.freedesktop.org/lima/web "Lima Website"
[DRI]: https://dri.freedesktop.org/wiki "Mesa 3D and Direct Rendering Infrastructure wiki"
[DRI(Direct Rendering Infrastructure)]: https://dri.freedesktop.org/wiki "Mesa 3D and Direct Rendering Infrastructure wiki"