mirror of
https://github.com/saphid/chromium-webxr-steam-frame.git
synced 2026-10-06 01:00:17 +02:00
Launched from the Steam library, Steam preloads gameoverlayrenderer.so, which segfaults Chromium's zygote; the GPU process can't start and Chromium quits after about 30 seconds. Found testing on a Steam Frame; reviewed by GPT-6 Astra. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
45 lines
1.9 KiB
Bash
Executable File
45 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Start the WebXR Chromium build. frame/install.sh copies this to
|
|
# ~/.local/bin/chromium-xr; the Steam library shortcut and the desktop entry
|
|
# both run it. Arguments go to Chromium, so `chromium-xr URL` opens a page.
|
|
set -euo pipefail
|
|
|
|
CHROME="${CHROMIUM_XR_HOME:-$HOME/chromium-xr}/chrome"
|
|
[[ -x "$CHROME" ]] || { echo "chromium-xr: no build at $CHROME (run frame/install.sh)" >&2; exit 1; }
|
|
|
|
# Steam preloads its in-game overlay (gameoverlayrenderer.so) into anything it
|
|
# launches. It segfaults in Chromium's zygote, the GPU process then can't
|
|
# start, and Chromium quits with "GPU process isn't usable". Drop it and keep
|
|
# anything else that was preloaded.
|
|
if [[ -n "${LD_PRELOAD:-}" ]]; then
|
|
keep=()
|
|
# Split on spaces and colons only, like ld.so, with no glob expansion.
|
|
# read -d '' takes the whole value, newlines included (it returns 1 at EOF).
|
|
IFS=' :' read -r -d '' -a libs < <(printf '%s' "$LD_PRELOAD") || true
|
|
for lib in ${libs[@]+"${libs[@]}"}; do
|
|
[[ -z "$lib" || "$lib" == *gameoverlayrenderer.so ]] || keep+=("$lib")
|
|
done
|
|
if (( ${#keep[@]} )); then
|
|
LD_PRELOAD=${keep[0]}
|
|
for lib in "${keep[@]:1}"; do LD_PRELOAD+=":$lib"; done
|
|
export LD_PRELOAD
|
|
else
|
|
unset LD_PRELOAD
|
|
fi
|
|
fi
|
|
|
|
# --enable-features=OpenXR: the Linux OpenXR device is off by default.
|
|
# --ozone-platform=x11: gamescope's X display, where each app is a panel.
|
|
# --no-first-run and --password-store=basic: otherwise startup can stop at a
|
|
# first-run or keyring prompt you can't see.
|
|
# --disable-seccomp-filter-sandbox: with the XR process's seccomp policy on,
|
|
# SteamVR sees the wrong process ID and refuses the session (see
|
|
# docs/technical-notes.md). The namespace sandbox stays on.
|
|
exec "$CHROME" \
|
|
--user-data-dir="$HOME/.config/chromium-xr" \
|
|
--enable-features=OpenXR \
|
|
--ozone-platform=x11 \
|
|
--no-first-run --no-default-browser-check --password-store=basic \
|
|
--disable-seccomp-filter-sandbox \
|
|
"$@"
|