Files
GameRunner/gamerunner.sh
2024-07-27 19:29:38 +02:00

182 lines
3.6 KiB
Bash
Executable File

#!/bin/bash
# Gamerunner a hook for gamemode and nvidia prime render offload to avoid crashed with optimus-manager
function preload() {
export LD_PRELOAD="${LD_PRELOAD}${LD_PRELOAD:+:}$1"
}
function prefix() {
export GR_PREFIX="$(which $1) $GR_PREFIX"
}
GR_PREFIX=""
MAIN_VENDOR=$(glxinfo | grep "OpenGL vendor string")
NVK_ICD="/usr/share/vulkan/icd.d/nouveau_icd.i686.json:/usr/share/vulkan/icd.d/nouveau_icd.x86_64.json"
if [ "$MAIN_VENDOR" == "OpenGL vendor string: MESA" ]
then
MODE="nvk"
else
if [ "$MAIN_VENDOR" == "OpenGL vendor string: NVIDIA Corporation" ]
then
MODE="nvidia"
export GAMESCOPE=0
else
# idenpendent from X11 and Wayland
VULKAN_VENDOR=$(vulkaninfo --summary | grep "driverName" | grep -v llvm)
if [[ "$VULKAN_VENDOR" =~ "NVIDIA" ]]
then
MODE="hybrid"
else
# idenpendent from X11 and Wayland
NVKTEST=$(VK_ICD_FILENAMES=$NVK_ICD vulkaninfo --summary)
if [[ ! -z "$NVKTEST" ]]
then
MODE="hybridnvk"
else
MODE="integrated"
fi
fi
fi
fi
if [ ! -z "${GR_SWITCH_ONLY}" ] && (( $GR_SWITCH_ONLY == 1 ))
then
echo "Skipping env variables"
else
USE_GAMEMODE=0
MANGOHUD=0
GAMESCOPE=0
#if the config doesn't exist load /etc/gamerunner.cfg instead of ~/.config/gamerunner.cfg
if [ -f "$HOME/.config/gamerunner.cfg" ]
then
echo "Loading user config"
source ~/.config/gamerunner.cfg
else
echo "Loading system config"
if [ -f "/app/etc/gamerunner.cfg" ]
then
source /app/etc/gamerunner.cfg
else
source /etc/gamerunner.cfg
fi
fi
#Export the config
export VKD3D_CONFIG
export PROTON_ENABLE_NVAPI
export __GL_THREADED_OPTIMIZATIONS
export mesa_glthread
export RADV_PERFTEST
export __GL_MaxFramesAllowed
export PROTON_HIDE_NVIDIA_GPU
export PROTON_ENABLE_NGX_UPDATER
export MANGOHUD
export LFX
export DXVK_NVAPI_DRIVER_VERSION
export DXVK_ASYNC
if [ "$#" -eq 0 ]; then
programname=`basename "$0"`
echo "ERROR: No program supplied"
echo
echo "Usage: $programname <program>"
exit 1
fi
if [ "$GR_SAFE" == "1" ]
then
echo "Safe mode"
GAMESCOPE=0
export MANGOHUD=0
fi
if (( $USE_GAMEMODE == 1 ))
then
prefix "gamemoderun"
fi
if [ "$MODE" = "nvidia" ] || [ "$MODE" = "hybrid" ]
then
echo "Disabling gamescope"
GAMESCOPE=0
fi
if (( $MANGOHUD == 2 ))
then
prefix "mangohud"
fi
if (( $OBSCAP == 1 ))
then
echo loading obs vulkan capture
preload "/usr/\$LIB/obs_glcapture/libobs_glcapture.so"
export OBS_VKCAPTURE=1
fi
fi
if [ "$MODE" == "nvidia" ]
then
# Do nothing
echo "nvidia"
export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/nvidia_icd.json"
export __GLX_VENDOR_LIBRARY_NAME=nvidia
else
if [ "$MODE" == "hybridnvk" ]
then
export DRI_PRIME=1
#All nvk specific should by compatible with hybrid
MODE="nvk"
echo "Hybrid-nvk"
fi
if [ "$MODE" == "nvk" ]
then
echo "NVK"
export VK_DRIVER_FILES=$NVK_ICD
else
if [ "$MODE" == "hybrid" ]
then
echo "hybrid"
export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/nvidia_icd.json"
if [ "$XDG_SESSION_TYPE" == "x11" ]
then
export __NV_PRIME_RENDER_OFFLOAD=1
fi
export __VK_LAYER_NV_optimus=NVIDIA_only
export __GLX_VENDOR_LIBRARY_NAME=nvidia
else
if [ -n "$MESA_ICD" ]
then
export VK_DRIVER_FILES=$MESA_ICD
fi
echo "integrated"
fi
fi
fi
# if gamescope is not present this will return an empty string
GAMESCOPE_PATH=$(command -v gamescope)
if [ "$GAMESCOPE" == "1" ] && [ ! "GAMESCOPE_PATH" == "" ]
then
export AMD_VULKAN_ICD=RADV
echo hud $MANGOHUD
echo "Warning: this is still experimental"
echo "$GAMESCOPE_PATH" -f -b "$@"
exec "$GAMESCOPE_PATH" -f -b "$GR_PREFIX" "$@"
else
if [ -z "$GR_PREFIX" ]
then
exec sh -c "$@"
else
exec $GR_PREFIX "$@"
fi
fi