#!/data/data/com.termux/files/usr/bin/bash
case $(dpkg --print-architecture) in
	aarch64|arm64) echo "" ;;
	*) echo -e "\e[31m不支持你的架构\e[0m"
		sleep 2
		exit 0
esac
if [ $(uname -o) != Android ]; then echo -e "\e[33m仅运行于termux环境\e[0m"; sleep 1; exit 0; fi
cd

echo -e "\n\e[33m未经完全验证，请谨慎是否继续！编译之前建议先备份termux资源目录，如崩坏可进行恢复。\e[0m
1) 继续
2) 备份
3) 恢复
0) 退出"
read -r -p "请选择: " input
case $input in
1) echo "" ;;
2) tar zcPvf termux.tar.gz /data/data/com.termux/files/usr
if [ -f /data/data/com.termux/files/home/termux.tar.gz ]; then
echo -e "已备份，文件名为\e[33mtermux.tar.gz\e[0m"
read -p "继续请回车"
else
echo -e "\e[31m备份失败\e[0m"
exit 0
fi
;;
3) if [ ! -f termux.tar.gz ]; then
echo -e "未找到相关恢复包\e[33mtermux.tar.gz\e[0m，请确认"
sleep 2
else
tar zxPvf termux.tar.gz
fi
exit 0
;;
*) exit 0
esac
echo -e "\n\e[33m第一步：安裝編譯用的套件\e[0m
1) 继续
2) 跳过此步
0) 退出"
read -r -p "请选择: " input
case $input in
1)
pkg i -y x11-repo
pkg i -y clang lld binutils cmake autoconf automake libtool ndk-sysroot ndk-multilib make python git libandroid-shmem-static vulkan-loader vulkan-loader-android vulkan-headers ninja llvm bison flex libx11 xorgproto libdrm libpixman libxfixes libjpeg-turbo xtrans libxxf86vm xorg-xrandr xorg-font-util xorg-util-macros libxfont2 libxkbfile libpciaccess xcb-util-renderutil xcb-util-image xcb-util-keysyms xcb-util-wm xorg-xkbcomp xkeyboard-config libxdamage libxinerama

if [ ! -f ${HOME}/.config/pip/pip.conf ]; then
mkdir -p ${HOME}/.config/pip && echo "[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >${HOME}/.config/pip/pip.conf
fi
pip install meson mako
;;
2) echo ""
;;
*) exit 1
esac

echo -e "\e[33m第二步：複製libxshmfence、mesa、libepoxy、virglrenderer的原始碼\e[0m
1) 继续
2) 跳过此步
0) 异常，退出"
read -r -p "请选择: " input
case $input in
1)
rm -rf virglrenderer.tar.gz tmp 2>/dev/null
curl -O https://shell.xb6868.com/wine/virglrenderer.tar.gz
tar zxvf virglrenderer.tar.gz
:<<\eof
mkdir ${HOME}/tmp
cd ${HOME}/tmp
unset LD_PRELOAD
libxshmfence
git clone --depth 1 -b libxshmfence-1.3 https://gitlab.freedesktop.org/xorg/lib/libxshmfence.git
mesa
git clone --depth 1 -b mesa-22.0.5 https://gitlab.freedesktop.org/mesa/mesa.git
libepoxy
git clone --depth 1 -b 1.5.10 https://github.com/anholt/libepoxy.git
virglrenderer
git clone --shallow-since 2022-06-27 https://gitlab.freedesktop.org/virgl/virglrenderer.git
eof
;;
2) echo ""
;;
*) exit 1
esac

echo -e "\e[33m第三步：編譯libxshmfence\e[0m
1) 继续
2) 跳过此步
0) 异常，退出"
read -r -p "请选择: " input
case $input in
1)
cd ${HOME}/tmp/libxshmfence
./autogen.sh --prefix=$PREFIX --with-shared-memory-dir=$TMPDIR
sed -i s/values.h/limits.h/ ./src/xshmfence_futex.h
make -j8 install CPPFLAGS=-DMAXINT=INT_MAX
;;
2) echo ""
;;
*) exit 1
esac

echo -e "\e[33m第四步：編譯mesa\e[0m
1) 继续
2) 跳过此步
0) 异常，退出"
read -r -p "请选择: " input
case $input in
1)
cd ${HOME}/tmp/mesa
sed -i '40s+^$+#include "X11/Xlib.h"+' src/egl/main/egldisplay.h
sed -i 's/^import os$/import os, shutil\ndef link(src, dest):\n shutil.copyfile(src, dest)\ndef unlink(src):\n os.remove(src)\nos.link = link\nos.unlink = unlink/' bin/install_megadrivers.py
mkdir b && cd b
LDFLAGS='-l:libandroid-shmem.a -llog' meson setup .. -Dprefix=$PREFIX -Dplatforms=x11 -Dgbm=enabled -Ddri-drivers='' -Dgallium-drivers=zink,swrast -Dllvm=disabled -Dvulkan-drivers='' -Dcpp_rtti=false -Dc_args=-Wno-error=incompatible-function-pointer-types -Dbuildtype=release
rm $PREFIX/lib/libglapi.so* $PREFIX/lib/libGL.so* $PREFIX/lib/libGLES* $PREFIX/lib/libEGL* $PREFIX/lib/libgbm*
ninja install
;;
2) echo ""
;;
*) exit 1
esac

echo -e "\e[33m第五步：編譯libepoxy\e[0m
1) 继续
2) 跳过此步
0) 异常，退出"
read -r -p "请选择: " input
case $input in
	1)
cd ~/tmp/libepoxy
mkdir b && cd b
meson setup -Dprefix=$PREFIX -Dbuildtype=release -Dglx=yes -Degl=yes -Dtests=false -Dc_args=-U__ANDROID__ ..
rm $PREFIX/lib/libepoxy.so*
ninja install
;;
2) echo ""
;;
*) exit 1
esac

echo -e "\e[33m最后一步：編譯virglrenderer\e[0m
1) 继续
2) 跳过此步
0) 异常，退出"
read -r -p "请选择: " input
case $input in
1)
cd ${HOME}/tmp/virglrenderer
#git checkout -f dd301caf7e05ec9c09634fb7872067542aad89b7~2
sed -i 's+"/tmp+"/data/data/com.termux/files/usr/tmp+' vtest/vtest_protocol.h
mkdir b && cd b
meson setup -Dbuildtype=release -Dprefix=$PREFIX -Dplatforms=egl ..
ninja install
;;
2) echo ""
;;
*) exit 1
esac

apt-mark hold libxshmfence mesa libepoxy virglrenderer
dpkg --get-selections | grep "hold"
echo -e "\e[33m如全部执行完，需挂载termux的tmp至容器tmp，例如: -b /data/data/com.termux/files/usr/tmp:/tmp 请在进入容器前复制粘贴下面这段，\e[0m

MESA_NO_ERROR=1 MESA_GL_VERSION_OVERRIDE=4.0 GALLIUM_DRIVER=zink virgl_test_server --use-egl-surfaceless &

\e[33m如果加载成功，需确认容器已安装mesa-utils，安装命令apt install mesa-utils，然后在“桌面终端”输 GALLIUM_DRIVER=virpipe glxinfo|grep virgl 则有信息反显，反之无效。\e[0m
"
read -p "回车确认"

exit 0
#測試GPU加速成效
:<<\eof
#Termux本身用於執行virglrenderer的伺服器，但是Termux的應用程式無法直接使用virglrenderer，必須使用proot或chroot才行。
#測試Proot裡的程式使用virgl
#首先啟動virgl的伺服器
LIBGL_ALWAYS_SOFTWARE=1
MESA_NO_ERROR=1 MESA_GL_VERSION_OVERRIDE=4.0 GALLIUM_DRIVER=zink virgl_test_server --use-egl-surfaceless
#從螢幕左邊滑進來，按New Session開啟第二個終端機。啟動Termux X11
#從螢幕左邊滑進來，按New Session開啟第三個終端機。登入proot-distro，掛載Termux的tmp目錄至Proot-distro，啟動XFCE4桌面環境。
# 有virgl情況下，直接登入一般帳戶再啟動X伺服器會崩掉，也許是bug，因此先登入root再登入一般帳戶
proot-distro login debian --shared-tmp
su user
./startx.sh
在Termux X11的界面開啟終端機。在執行程式前加入GALLIUM_DRIVER啟用virgl硬體加速，如果不加系統會回復使用CPU算繪的llvmpipe。有些程式加MESA_GL_VERSION_OVERRIDE=4.0會開不起來，需要自行測試。wine不能用MESA_GL_VERSION_OVERRIDE=4.0

例如要執行方塊遊戲Minetest：

GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 minetest
virtpipe下glxgears的FPS相比llvimpip

查询是否加载成功
glxinfo|grep virgle

--no-fork Run the server single threaded
--no-loop-or-fork Run the server single threaded and exit after the client closes the connection
--use-gles Force a GLES context on the host
--use-glx Use the GLX interface on the host
--use-egl-surfaceless Use the EGL surfaceless interface on the host
eof
