前置き#
メイン環境をUbuntuにした際にdrm-xe-nextの話を耳にしたので使ってみたい!となって入れてみたメイン環境で遊ぶな
大まかな流れ#
- drm-xe-nextカーネルをビルド
- Mesaドライバをビルド
- 自ビルドドライバ向けに環境変数を定義
環境#
CPU:Intel Core i5 12600k
GPU:Intel ARC A770 16GB
OS:kubuntu 22.04LTS
drm-xe-nextカーネルをビルド#
カーネルをビルドするにあたって必要な依存関係をセットアップしておきましょう。
セットアップが終わったらカーネルソースをローカルに落とします。
$ git clone https://gitlab.freedesktop.org/drm/xe/kernel/ -b drm-xe-next
カーネルソースのディレクトリを開いたらrootに切り替えてからmake menuconfig
でコンフィグを生成。
このときに、現在使っているカーネルコンフィグを引き継ぎたい場合は事前にcp /boot/config-* .config
でカーネルソースにコピーしておきましょう
また、他に必要なカーネルモジュール等がある場合は設定することを忘れずに。
そしてmenuconfigのDevice Drivers>Graphics support
から<M>Intel Xe Graphics
と[*]Enable display support
をすること。
可能であればIntel 8xx/9xx/G3x/G4x/HD Graphics
を無効にしておくこと。(カーネル適応後にXeより優先して読み込まれたりすることがあって面倒だから)
他にはKEYS関連の項目が原因でビルドが止まることがあるので随時無効にしておくこと。
↓面倒くさがり屋向けの一発ですべてが終わるコマンド
make -j$(nproc --all) && make modules_install INSTALL_MOD_STRIP=1 -j$(nproc --all) && make bindeb-pkg -j$(nproc --all) && dpkg -i ../*.deb
ビルドとインストールが終わったら次のステップに進む。
再起動はお好みでというところだが、デフォで入っているMesaがllvmpipe等のソフトウェアレンダリングに対応していなかった場合が面倒なのでしないことを推奨。
Mesaドライバをビルド#
2023/07/01現在、XeKMD対応のMesa Irisドライバはメインブランチにマージされたばかりなので自分でビルドする必要がある。
Mesaのビルドに必要な依存関係を揃えていく。
32bitアプリも使いたい場合はi386向けの依存関係も後々揃えるがまずは基本的なツールとx86_64の依存関係から。
$ sudo apt build-dep libdrm
$ sudo apt build-dep mesa
$ sudo apt install meson llvm-15
$ pip3 install mako
ついでにvulkan sdkもインストールしておくと今後が楽
したらばmesaのソースを落としてからビルドしていく。
$ git clone https://gitlab.freedesktop.org/mesa/mesa -b main
$ cd mesa
$ mkdir build
$ sudo meson setup build/ -Dintel-xe-kmd=enabled -Dvideo-codecs="vc1dec, h264dec, h264enc,h265dec,h265enc" -Dintel-clc=enabled
$ sudo meson install -C build/
これでx86_64のMesaドライバ一式がビルドできるはず。meson setup
の段階で必要なライブラリに抜けがあってエラーが出たらapt install ~~
で随時インストールしていく。
また、-Dintel-clc=enabled
はvulkanでIntel GPUのレイトレを使えるようにするよう指定する感じだが、必要に感じなければdisabledにしても問題ない。
次にi386向けのドライバをビルドする。 必要なツールチェーンをインストールする
$ sudo apt install gcc-11-i686-linux-gnu g++-11-i686-linux-gnu
また、mesaソースに以下の内容を書き込んだファイルを作っておく。
ここではi386.txtとする。
[binaries]
c = '/usr/bin/i686-linux-gnu-gcc-11'
cpp = '/usr/bin/i686-linux-gnu-g++-11'
ar = '/usr/bin/i686-linux-gnu-gcc-ar-11'
strip = '/usr/bin/i686-linux-gnu-strip'
pkgconfig = '/usr/bin/i686-linux-gnu-pkg-config'
llvm-config = '/usr/bin/llvm-config-15'
[built-in options]
c_args = ['-m32']
c_link_args = ['-m32']
cpp_args = ['-m32']
cpp_link_args = ['-m32']
[paths]
prefix = '/usr'
libdir = 'lib32'
bindir = 'bin'
[host_machine]
system = 'linux'
cpu_family = 'x86'
cpu = 'i686'
endian = 'little'
また、i386用のライブラリが必要になるのでsetup時に警告が出たら随時インストールすること。
基本的にlib(ライブラリ名)-dev:i386
のような形になる。
見つからなかったりしたらUbuntu パッケージ検索で探すと楽だと思う。
$ mkdir build32
$ sudo meson setup build32/ --cross-file i386.txt -Dintel-xe-kmd=enabled -Dgallium-drivers=iris -Dvulkan-drivers=intel
$ sudo meson install -C build32
setup時に敢えてiris(intel)と指定しているのは単に依存関係が面倒だからである(特にllvmpipeお前)
zinkとかなんとか欲しかったりする人はその都度指定されたし。
環境変数を定義#
自分がKDE環境なのでKDEのやり方だけメモります。
その他デスクトップ環境の人たちはデフォルトの環境変数の定義については各自でググってね。
KDEの場合は~/.config/plasma-workspace/env/
にシェルスクリプトを入れてそれを使って定義する感じになる。
サンプル↓
export MESA_LOADER_DRIVER_OVERRIDE=iris
export LIBGL_DRIVERS_PATH=/usr/local/lib/x86_64-linux-gnu/dri:/usr/lib32/dri
export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/intel_icd.x86_64.json:/usr/share/vulkan/icd.d/intel_icd.i686.json
export LD_LIBRARY_PATH=/usr/lib32/:/usr/local/lib/x86_64-linux-gnu/
軽く説明すると
- MESA_LOADER_DRIVER_OVERRIDE
mesaは基本的にカーネルモジュールの名前を参照してドライバを定義するがもちろんxe_dri.soなんてファイルは生成されていないので自分でirisと定義する必要がある。 - LIBGL_DRIVERS_PATH
OpenGLで使用するドライバのおいてあるパスを定義。 - VK_ICD_FILENAMES
vulkanのドライバを指定する変数。自ビルドのドライバを参照できるようにする。
場合によっては各jsonの内容を修正しないといけない場合がある(自分がそうだった) - LD_LIBRARY_PATH
steam等のアプリが自ビルドのドライバを参照できるようにする。自分は一応x86_64とi386の両方を定義している。
多分これで再起動したらカーネルモジュールがxeになっていてグラフィックプロセッサがちゃんとMesa Intelになっているはず。
ちなみにXeKMDだとIntel ARCではハードウェアエンコードが使えないらしい、うんち!w