2025-10-25 23:54:05 +02:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
LOGFILE="$HOME/.local/logs/steam.log"
|
|
|
|
|
export PATH="$HOME/.local/bin:$PATH"
|
|
|
|
|
|
|
|
|
|
export SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0
|
|
|
|
|
|
|
|
|
|
# There is no way to set a color space for an NV12
|
|
|
|
|
# buffer in Wayland. And the color management protocol that is
|
|
|
|
|
# meant to let this happen is missing the color range...
|
|
|
|
|
# So just workaround this with an ENV var that Remote Play Together
|
|
|
|
|
# and Gamescope will use for now.
|
|
|
|
|
export GAMESCOPE_NV12_COLORSPACE=k_EStreamColorspace_BT601
|
|
|
|
|
export STEAM_GAMESCOPE_HDR_SUPPORTED=1
|
|
|
|
|
|
|
|
|
|
# Workaround older versions of vkd3d-proton setting this
|
|
|
|
|
# too low (desc.BufferCount), resulting in symptoms that are potentially like
|
|
|
|
|
# swapchain starvation.
|
|
|
|
|
export VKD3D_SWAPCHAIN_LATENCY_FRAMES=3
|
|
|
|
|
|
|
|
|
|
# Let's try this across the board to see if it breaks anything
|
|
|
|
|
# Helps performance in HZD, Cyberpunk, at least
|
|
|
|
|
# Expose 8 physical cores, instead of 4c/8t
|
2025-12-25 16:37:05 +01:00
|
|
|
# export WINE_CPU_TOPOLOGY=8:0,1,2,3,4,5,6,7
|
2025-10-25 23:54:05 +02:00
|
|
|
|
|
|
|
|
# To expose vram info from radv's patch we're including
|
|
|
|
|
export WINEDLLOVERRIDES=dxgi=n
|
|
|
|
|
|
|
|
|
|
# Disable automatic audio device switching in steam, now handled by wireplumber
|
|
|
|
|
export STEAM_DISABLE_AUDIO_DEVICE_SWITCHING=1
|
|
|
|
|
|
|
|
|
|
# Enable support for xwayland isolation per-game in Steam
|
|
|
|
|
# export STEAM_MULTIPLE_XWAYLANDS=0
|
|
|
|
|
|
|
|
|
|
# We have NIS support
|
|
|
|
|
export STEAM_GAMESCOPE_NIS_SUPPORTED=1
|
|
|
|
|
|
|
|
|
|
# Enable tearing controls in steam
|
|
|
|
|
export STEAM_GAMESCOPE_TEARING_SUPPORTED=1
|
|
|
|
|
|
|
|
|
|
# Enable VRR controls in steam
|
|
|
|
|
export STEAM_GAMESCOPE_VRR_SUPPORTED=1
|
|
|
|
|
|
|
|
|
|
# When set to 1, a toggle will show up in the steamui to control whether dynamic refresh rate is applied to the steamui
|
|
|
|
|
export STEAM_GAMESCOPE_DYNAMIC_REFRESH_IN_STEAM_SUPPORTED=0
|
|
|
|
|
|
|
|
|
|
# Don't wait for buffers to idle on the client side before sending them to gamescope
|
|
|
|
|
export vk_xwayland_wait_ready=false
|
|
|
|
|
|
|
|
|
|
# Scaling support
|
|
|
|
|
export STEAM_GAMESCOPE_FANCY_SCALING_SUPPORT=1
|
|
|
|
|
|
|
|
|
|
# Color management support
|
|
|
|
|
export STEAM_GAMESCOPE_COLOR_MANAGED=1
|
|
|
|
|
export STEAM_GAMESCOPE_VIRTUAL_WHITE=1
|
|
|
|
|
|
|
|
|
|
# Temporary crutch until dummy plane interactions / etc are figured out
|
2025-11-16 14:31:55 +01:00
|
|
|
# export GAMESCOPE_DISABLE_ASYNC_FLIPS=1
|
2025-10-25 23:54:05 +02:00
|
|
|
|
2025-11-10 14:07:12 +01:00
|
|
|
# Use Vulkan for the Steam Overlay
|
|
|
|
|
export STEAM_OVERLAY_RENDERER=vk
|
|
|
|
|
|
|
|
|
|
# Set input method modules for Qt/GTK that will show the Steam keyboard
|
|
|
|
|
export QT_IM_MODULE=steam
|
|
|
|
|
export GTK_IM_MODULE=Steam
|
|
|
|
|
|
2025-10-25 23:54:05 +02:00
|
|
|
export XCURSOR_THEME=steam
|
|
|
|
|
export XCURSOR_SCALE=256
|
|
|
|
|
|
2025-11-16 14:31:55 +01:00
|
|
|
export GAMESCOPE_WSI=0
|
|
|
|
|
export STEAM_USE_PW_CAPTURE=0 # Deck prefers gamescope capture path
|
|
|
|
|
export STEAM_DISABLE_GAMESCOPE_LAUNCH=0 # allow gamescope handling
|
|
|
|
|
|
2025-10-25 23:54:05 +02:00
|
|
|
log() { echo "[$(date --iso-8601=seconds)] $*" | tee -a "$LOGFILE"; }
|
|
|
|
|
|
2025-10-28 00:04:17 +01:00
|
|
|
mkdir -p $XDG_RUNTIME_DIR
|
|
|
|
|
chmod 700 $XDG_RUNTIME_DIR
|
|
|
|
|
|
2025-10-25 23:54:05 +02:00
|
|
|
if [ -r /proc/sys/user/max_user_namespaces ]; then
|
|
|
|
|
max_ns="$(cat /proc/sys/user/max_user_namespaces || echo 0)"
|
|
|
|
|
if [ "${max_ns:-0}" -eq 0 ]; then
|
|
|
|
|
log "ERROR: user.max_user_namespaces is 0. Enable it with: sudo sysctl -w user.max_user_namespaces=15000"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if command -v bwrap >/dev/null 2>&1; then
|
|
|
|
|
bwrap_bin="$(command -v bwrap)"
|
|
|
|
|
if ! [ -u "$bwrap_bin" ]; then
|
|
|
|
|
# Not fatal if user namespaces are enabled, but warn for visibility
|
|
|
|
|
log "WARN: $bwrap_bin is not setuid root. If Steam still fails, run: sudo dnf reinstall bubblewrap && sudo chmod 4755 /usr/bin/bwrap"
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
log "WARN: bubblewrap (bwrap) not found. Steam may fail to start."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if findmnt -no OPTIONS / | grep -qw nosuid; then
|
|
|
|
|
log "WARN: root filesystem is mounted nosuid. Setuid helpers like bubblewrap will not work."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
STEAM_BIN="$(command -v steam || true)"
|
|
|
|
|
if [ -z "$STEAM_BIN" ]; then
|
|
|
|
|
log "ERROR: steam not found in PATH"
|
|
|
|
|
exit 127
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
log "Updating steam: /opt/steamcmd/steamcmd.sh +quit"
|
|
|
|
|
/opt/steamcmd/steamcmd.sh +quit >>"$LOGFILE" 2>&1 || {
|
|
|
|
|
log "ERROR: Steam update failed"
|
|
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-28 00:04:17 +01:00
|
|
|
log "Launching Steam"
|
2025-11-16 14:31:55 +01:00
|
|
|
STEAM_ARGS=("-steamdeck" "-steamos3" "-gamepadui")
|
2025-10-28 00:04:17 +01:00
|
|
|
systemd-run --user --scope --quiet \
|
|
|
|
|
--unit=steam.scope \
|
|
|
|
|
--slice=steam.slice \
|
|
|
|
|
"$STEAM_BIN" "${STEAM_ARGS[@]}" >>"$LOGFILE" 2>&1 &
|
|
|
|
|
steam_scope_pid=$!
|
|
|
|
|
log "Steam started with pid $steam_scope_pid"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
SUNSHINE_BIN="$(command -v sunshine || true)"
|
|
|
|
|
if [ -z "$SUNSHINE_BIN" ]; then
|
|
|
|
|
log "ERROR: sunshine not found in PATH"
|
|
|
|
|
else
|
|
|
|
|
SUNSHINE_LOG_FILE="$HOME/.local/logs/sunshine.log"
|
|
|
|
|
log "Found Sunshine: $SUNSHINE_BIN, starting after 5s delay"
|
|
|
|
|
sleep 5
|
|
|
|
|
systemd-run --user --scope --quiet \
|
|
|
|
|
--unit=sunshine.scope \
|
|
|
|
|
--slice=sunshine.slice \
|
|
|
|
|
"$SUNSHINE_BIN" "$HOME/.config/sunshine/sunshine.conf"
|
|
|
|
|
fi
|
2025-10-25 23:54:05 +02:00
|
|
|
} &
|
|
|
|
|
|
2025-10-28 00:04:17 +01:00
|
|
|
# Wait for Steam to exit
|
|
|
|
|
wait "$steam_scope_pid"
|
|
|
|
|
status=$?
|
|
|
|
|
|
|
|
|
|
# Stop Sunshine gracefully
|
|
|
|
|
if systemctl --user is-active --quiet sunshine.scope; then
|
|
|
|
|
log "Stopping Sunshine"
|
|
|
|
|
systemctl --user stop sunshine.scope
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
log "Steam session ended."
|
2025-12-01 17:25:18 +01:00
|
|
|
exit "$status"
|