121 lines
2.9 KiB
Bash
121 lines
2.9 KiB
Bash
#!/system/bin/sh
|
|
|
|
# args: driver
|
|
setup_vulkan() {
|
|
echo "setup vulkan for driver: $1"
|
|
case "$1" in
|
|
i915)
|
|
setprop ro.hardware.vulkan intel
|
|
;;
|
|
amdgpu)
|
|
setprop ro.hardware.vulkan radeon
|
|
;;
|
|
virtio_gpu)
|
|
setprop ro.hardware.vulkan virtio
|
|
;;
|
|
v3d|vc4)
|
|
setprop ro.hardware.vulkan broadcom
|
|
;;
|
|
msm_drm)
|
|
setprop ro.hardware.vulkan freedreno
|
|
;;
|
|
panfrost)
|
|
setprop ro.hardware.vulkan panfrost
|
|
;;
|
|
*)
|
|
echo "not supported driver: $1"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
setup_render_node() {
|
|
node=$(getprop ro.boot.redroid_gpu_node)
|
|
if [ -n "$node" ]; then
|
|
echo "force render node: $node"
|
|
|
|
setprop gralloc.gbm.device "$node"
|
|
chmod 666 "$node"
|
|
|
|
# setup vulkan
|
|
driver=$(cut -d' ' -f1 "/sys/kernel/debug/dri/${node#/dev/dri/renderD}/name")
|
|
setup_vulkan "$driver"
|
|
return 0
|
|
fi
|
|
|
|
cd /sys/kernel/debug/dri || exit
|
|
for d in * ; do
|
|
if [ "$d" -ge "128" ]; then
|
|
driver="$(cut -d' ' -f1 "$d/name")"
|
|
echo "DRI node exists, driver: $driver"
|
|
setup_vulkan "$driver"
|
|
case $driver in
|
|
i915|amdgpu|nouveau|virtio_gpu|v3d|vc4|msm_drm|panfrost)
|
|
node="/dev/dri/renderD$d"
|
|
echo "use render node: $node"
|
|
setprop gralloc.gbm.device "$node"
|
|
chmod 666 "$node"
|
|
return 0
|
|
;;
|
|
esac
|
|
fi
|
|
done
|
|
|
|
echo "NO qualified render node found"
|
|
return 1
|
|
}
|
|
|
|
gpu_setup_host() {
|
|
echo "use GPU host mode"
|
|
|
|
setprop ro.hardware.egl mesa
|
|
setprop ro.hardware.gralloc gbm
|
|
setprop ro.boot.redroid_fps 30
|
|
}
|
|
|
|
gpu_setup_guest() {
|
|
echo "use GPU guest mode"
|
|
|
|
VENDOR_EGL_DIR=/vendor/lib64/egl
|
|
SYSTEM_EGL_DIR=/system/lib64
|
|
EGL_ANGLE=libEGL_angle.so
|
|
EGL_SS=libEGL_swiftshader.so
|
|
egl=
|
|
|
|
if [ -f $VENDOR_EGL_DIR/$EGL_ANGLE ] || [ -f $SYSTEM_EGL_DIR/$EGL_ANGLE ]; then
|
|
egl=angle
|
|
elif [ -f $VENDOR_EGL_DIR/$EGL_SS ] || [ -f $SYSTEM_EGL_DIR/$EGL_SS ]; then
|
|
egl=swiftshader
|
|
else
|
|
echo "ERROR no SW egl found!!!"
|
|
fi
|
|
|
|
setprop ro.hardware.egl $egl
|
|
setprop ro.hardware.gralloc redroid
|
|
setprop ro.hardware.vulkan pastel
|
|
}
|
|
|
|
gpu_setup() {
|
|
## mode=(auto, host, guest)
|
|
## node=(/dev/dri/renderDxxx)
|
|
|
|
mode=$(getprop ro.boot.redroid_gpu_mode guest)
|
|
if [ "$mode" = "host" ]; then
|
|
setup_render_node
|
|
gpu_setup_host
|
|
elif [ "$mode" = "guest" ]; then
|
|
gpu_setup_guest
|
|
elif [ "$mode" = "auto" ]; then
|
|
echo "use GPU auto mode"
|
|
if setup_render_node; then
|
|
gpu_setup_host
|
|
else
|
|
gpu_setup_guest
|
|
fi
|
|
else
|
|
echo "unknown mode: $mode"
|
|
fi
|
|
}
|
|
|
|
gpu_setup
|
|
|