Coelacanth's Dream

Radeon向けMesaビルド方法 ―― RadeonSI, RADV

https://dri.freedesktop.org/wiki/Building/ を元に、なんやかんやである程度確立させたMesaのビルド方法をまとめてみた。
自環境がDebianなため、基本Debian/Ubuntu向けとなる。

インデックス

libdrm

RadeonSIでOpenGL 4.6がサポートでも書いたが、最新版のMesaをビルドするにはバージョン2.4.99以上のlibdrmが必要となる。
厳密には、mesa-19.2.6では2.4.99、git、mesa-19.3.0-rc5では2.4.100だが、どうせなら最新版の2.4.100をビルド、インストールしてしまった方がいい。
リリースページからダウンロードしてもいいが、アップデートに追従することを考えると gitレポジトリをクローンした方がいい。

Debian/Ubuntu では以下のコマンドで libdrm のビルドに必要なパッケージをインストールできる。

# apt build-dep libdrm

そしてビルドツールだが、Meson、Ninja が推奨となっている。これはMesaも同じであるため、どちらも同じビルドツールを使った方が楽。
Mesonの使い方は簡単で、

$ meson [適当なディレクトリ名]

とやるだけで準備は済む。
ビルド時間短縮やインストールサイズの削減のため一部オプションを変更する、[適当なディレクトリ名]の後に -D を付けてからオプション名、= をやりオプションに応じた文字列/真偽値を入力する。
今後、ここで生成したディレクトリを[ディレクトリ名]と記述する。

オプションの一覧は、一度準備を済ませた後、

$ meson configure [ディレクトリ名]

とすれば、オプションの状態と共に出力される。
そのままでは見にくいため、

$ meson configure [ディレクトリ名] > meson-configure.txt

のようにして一度テキストファイルに出力し、エディタ等で開くと見やすくなる。

オプションの変更例:
$ meson reconfigure [ディレクトリ名] -Damdgpu=true -Dnouveau=false

libdrm はそこまで規模は大きくないため、わざわざ削る必要はあまりない。
コンパイラの最適化設定は、 -Dc_args="[最適化フラグ]" 。
ビルドの実行は以下のコマンドで。

$ ninja -C [ディレクトリ名] -j [並列数]

ビルドが完了したら、

# ninja -C [ディレクトリ名] install

でインストールされる。

Mesa

Mesa も libdrm 同様ビルドに必要なパッケージを事前にインストールする。

# apt build-dep mesa

ただ、これでインストールされるのは、Debian/Ubuntuの公式レポジトリにて配布しているバージョンのMesaをビルドするのに必要なパッケージなため、最新版をビルドするには追加で必要なものもある。

$ meson [適当なディレクトリ名]

で準備はされるが、そのままだといろいろと問題が出てくる。
コンパイラに gcc が使われたり、llvm-config が /usr/bin下のものになってたり、デバッグ機能が有効で性能が落ちたり、ビルドに必要以上に時間が掛かる。

コンパイラにclang-Xを使うには(Xにはclangのバージョンを表す数字が入る)、meson コマンドの前に以下を入力することで環境変数に設定する。

$ CC="clang-X" CXX="clang++-X"

llvm-configをclangのバージョンと合わせるには、custom-llvm.ini といった適当ファイルを作成し、そこに以下のようにして使いたい llvm-config のパスを記述する。

[binaries]
llvm-config = '/usr/local/bin/llvm/llvm-config'

そして meson 実行時に以下のオプションを加える。

--native-file custom-llvm.ini

デバッグ機能は、オプションで buildtype=plain、b_ndebug=trueを追加することで無効化できる。

ビルドされるものを減らすには、

$ meson configure [ディレクトリ名] > meson-configure.txt

を見ながら、取捨選択することになる。Radeon向けの設定を最低限書くと以下のようになる。

-Ddri-drivers="r100,r200" -Dgallium-drivers="radeonsi,r300,r600" -Dvulkan-drivers="amd"

GCN以上の世代のRadeonを使っているのならradeonsiだけで良いかもしれない。
あとはgallium-openclなんかも基本削る。
現在は OpenCLを使う場合、Mesa とは 別に ROCm か AMDGPU-PROドライバーをインストールして方がいい。

以上を踏まえると、meson の実行時オプションは以下のようになる。

CC="clang-X" CXX="clang++-X" meson [ディレクトリ名] -Dbackend=ninja -Dbuildtype=plain -Ddri-drivers="r100,r200" -Dgallium-drivers="radeonsi,r300,r600" -Dvulkan-drivers="amd" -Dgallium-opencl=disabled --native-file custom-llvm.ini

インストール場所(prefix)だが、https://dri.freedesktop.org/wiki/Building/ にあるように、ホームディレクトリ下に適当なディレクトリを作成、 そしてそこにインストールし、各種環境変数を設定する。
この方がトラブルを回避しやすく、気軽に最新バージョンの Mesaドライバー試せる。
ただ、glxinfo や vainfo の結果を見るだけならスクリプトを書いたり、.bashrc の編集でいいのだが、それではデスクトップ上のメニューからアプリケーションを起動した際に反映されない。
その場合 .xsessionrc に記述することで環境変数をデスクトップアプリケーションにも反映させることができる。

PROJECT="[ホーム]/gfx/11-29-0351_20.0.0-devel"
PROJECT_LIB=$PROJECT/lib/x86_64-linux-gnu
export LD_LIBRARY_PATH=$PROJECT_LIB:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$PROJECT_LIB/pkgconfig:$PKG_CONFIG_PATH
export LIBGL_DRIVERS_PATH=$PROJECT_LIB/dri:$LIBGL_DRIVERS_PATH
export EGL_DRIVERS_PATH=$PROJECT_LIB:$EGL_DRIVERS_PATH
export LIBVA_DRIVERS_PATH=$PROJECT_LIB/dri:$LIBVA_DRIVERS_PATH
export VK_ICD_FILENAMES=$PROJECT/share/vulkan/icd.d/radeon_icd.x86_64.json:$VK_ICD_FILENAMES
export PATH=$PROJECT/bin:$PATH
LIBVDPAU_DRIVERS_PATH=$PROJECT_LIB/vdpau:$LIBVDPAU_DRIVERS_PATH

記述するだけでは不十分であり、すぐに反映させたい場合は Xorg を再起動する必要がある。
システムごと再起動させてもいいが、以下のようにディスプレイマネージャー (e.g. lightdm) を再起動させても、再ログインの必要が出るが反映させることはできる。

# systemctl restart [ディスプレイマネージャー]