virglrenderer(VirGL)はQEMU仮想マシン向けの表示技術で、仮想マシンに3Dハードウェアアクセラレーションを提供できます。例えばLinux PCでQEMUを使ってAndroid-x86仮想マシンを動かす場合、virglrendererで仮想マシンの3Dグラフィック性能を改善できます。
Androidスマホでは、Termuxからvirglrendererサーバーを実行することで同じような効果を得られます。TermuxのLinux環境でグラフィック性能が低い問題を解決できます。
これでTermuxのProot Linux環境でも4K60p動画を見たり、3Dゲームを遊んだりできます。proot環境とchroot環境の両方に対応しています。
文章で説明するより、まずは動画で実際の効果を見たほうが分かりやすいでしょう。
- テスト端末:Sony Xperia 5 II、システムバージョンAndroid 12、プロセッサSnapdragon 865、GPU Adreno 650、RAM 8GB。
1. TermuxとTermux X11をインストールする#
Termuxをインストールし、さらにTermux X11をインストールします。
理論上はXSDLやVNCでも使えますが、私はグラフィック環境の表示にTermux X11を使うほうが好みです。
2. Prootディストリビューションをインストールする#
Prootディストリビューションを1つインストールし、デスクトップ環境を設定します。個人的にはDebianのインストールをおすすめします。
3. virglrendererをインストールする#
どちらか一方を選びます。まずはvirglrenderer-androidを試すことをおすすめします。
方法1:virglrenderer-androidをインストールする#
virglrenderer-androidはAndroid GL/ESを使用し、ほとんどのAndroidデバイスに適しています。
構成:Android GL/ES → Termux VirGL renderer server → proot / chroot virpipe MESA gallium driver
- virglrenderer-androidをインストールする
pkg install virglrenderer-android- Virglサーバーを実行する:
virgl_test_server_android &方法2:virglrenderer-zinkをインストールする#
ZinkはVulkanを模擬するドライバーで、上のvirlglrenderer-androidより性能がよい可能性があります。Qualcommプロセッサ搭載のAndroidデバイスのみ対応します。
- Zinkを含むvirglrendererはtur-repoからインストールできます:
pkg install tur-repo
pkg update -y && pkg upgrade -y
pkg install mesa-zink virglrenderer-mesa-zink vulkan-loader-android- Virglサーバーを起動するには、以下のコマンドを実行します。下のprootで
GALLIUM_DRIVER変数を使うときは、virpipeをzinkに置き換えます。
MESA_LOADER_DRIVER_OVERRIDE=zink GALLIUM_DRIVER=zink ZINK_DESCRIPTORS=lazy virgl_test_server --use-egl-surfaceless --use-gles &4. virglrendererの使い方#
Termux本体はvirglrendererサーバーを実行するために使います。ただしTermuxにはvirglrendererを活用できるプログラムがほとんどないため、prootまたはchrootを使う必要があります。
4.1. Prootでvirglを使ってプログラムを実行する#
Termuxでvirglサーバーを起動します。
Termux X11アプリを起動します。Termuxに戻り、Termux X11を実行します。
export DISPLAY=:0
termux-x11 :0 &- 画面左側からスワイプして、New Sessionを押して2つ目のターミナルを開きます。通常ユーザー
userでproot-distroにログインし、TermuxのtmpディレクトリをProot-distroへマウントします。
proot-distro login debian --user user --shared-tmp- XFCE4デスクトップ環境を起動します。
export DISPLAY=:0
dbus-launch --exit-with-session startxfce4 &Termux X11の画面でターミナルを開きます。プログラム実行前に
GALLIUM_DRIVER=virpipeまたはGALLIUM_DRIVER=virglを付けると、virglハードウェアアクセラレーションが有効になります。付けない場合、システムはCPUレンダリングのllvmpipeに戻ります。一部のプログラムはMESA_GL_VERSION_OVERRIDE=4.0を付けると起動できないため、自分でテストしてください。例えばブロックゲームMinetestを実行する場合:
GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 minetestvirpipeでは、glxgearsのFPSがllvimpipeより少し高くなります。
llvmpipeとvirpipeを比較すると、MinetestのFPSは10FPSから最大20FPSまで伸びました。
VLCやMPVはvirpipeを有効化すると4K60p動画も再生できるようになりました。ただし基本的には全力でレンダリングしている状態なので、録画など別のプログラムが動画プレーヤーとリソースを取り合うと画面が乱れます。
レースゲームSueprTuxKartの伸びが最も明らかです。llvmpipeモードではスライドショー状態でしたが、virpipeを使うと普通に遊べるようになりました。
Firefoxでabout:configからWebGLを強制有効化すると、WebGL AquariumのFPSが倍増しました。
GALIIUM_DRIVER=virpipe startxfce4というコマンドでデスクトップ環境を起動し、全プログラムがデフォルトでvirpipeレンダリングを使うようにして、デスクトップ環境の滑らかさを上げる方法もあります。virpipeを有効化するとクラッシュするプログラムがある場合は、GALIIUM_DRIVER=llvmpipe <プログラム名>でCPUレンダリングへ戻します。
4.2. chrootでvirglを使ってプログラムを実行する#
XFCE4デスクトップのchroot Ubuntu with XFCE4を設定します。
SELinuxをPermissiveに設定します。
sudo setenforce 0- Termux X11アプリを起動し、Termuxへ戻って実行します:
XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &- Termuxのtmpをchrootのtmpへマウントします。
export CHROOT_DIR=/data/local/tmp/chrootubuntu
sudo busybox mount --bind $PREFIX/tmp $CHROOT_DIR/tmp- chrootへログインし、XFCE4を起動します。
sudo chmod -R 777 /tmp
export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4713
dbus-launch --exit-with-session startxfce4 &- virglでアプリケーションを起動する
GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 minetest4.3. Windowsゲームを実行する#
先にBox86 + Wineをインストールしてください。
Termuxでvirglサーバーを起動します。
exeを実行する前にも同じようにGALLIUM_DRIVERパラメータを付けます。例:
GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 box86 wine AIR.exevirglを使うと、Tobyfox制作の『Undertale』など、ハードウェアアクセラレーションを必要とする一部のWindowsゲームを正常に実行できます。
また、Key制作のビジュアルノベル『Air』も動作します。別途日本語フォントのインストールが必要です。


