#!/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 export WINE_CPU_TOPOLOGY=8:0,1,2,3,4,5,6,7 # 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 export GAMESCOPE_DISABLE_ASYNC_FLIPS=1 export XCURSOR_THEME=steam export XCURSOR_SCALE=256 log() { echo "[$(date --iso-8601=seconds)] $*" | tee -a "$LOGFILE"; } 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 } log "Updating Steam ROM Manager" srm add >> "$LOGFILE" 2>&1 || log "ERROR: Steam ROM Manager update failed" STEAM_ARGS=("-steamdeck" "-steamos3" "-steampal" "-gamepadui" "-pipewire-dmabuf") log "Launching Steam: $STEAM_BIN ${STEAM_ARGS[*]}" exec $STEAM_BIN "${STEAM_ARGS[@]}" & sleep 5 systemd-run --user --slice=sunshine.slice --scope sunshine >>"$LOGFILE" 2>&1 || { log "ERROR: Failed to start Sunshine" exit 1 } & tail -f /dev/null