From 623ce683d4cdd3696292e735608d707830f526e3 Mon Sep 17 00:00:00 2001 From: saphid <4596216+saphid@users.noreply.github.com> Date: Sun, 27 Sep 2026 16:47:57 +1000 Subject: [PATCH] Document testing VR without wearing the headset; Steam-launched WebXR verified Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/how-the-frame-works.md | 1 + docs/webxr-chromium.md | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/docs/how-the-frame-works.md b/docs/how-the-frame-works.md index 315a889..b897a18 100644 --- a/docs/how-the-frame-works.md +++ b/docs/how-the-frame-works.md @@ -33,6 +33,7 @@ Lepton (Android 11, podman container "lepton-dev") ← its own panel, app 305600 | SteamVR's `steamvr-v4l2cam.service` (`/opt/steamvr/bin/linuxarm64/v4l2cam --output=99`) copies the headset view (the `system.HeadsetView` mirror, one undistorted image) into the v4l2loopback device `/dev/video99` ("SteamVR"), 1920×1080 RGB24. `ffmpeg -f v4l2 -i /dev/video99` reads it at about 70 new frames/s; the first frame read can be black. The Frame's hardware encoder (`iris_encoder`, `/dev/video-enc0`) crashes ffmpeg's `h264_v4l2m2m`, so encode with `libx264 -preset ultrafast -tune zerolatency`: 720p30 takes about 0.7 of a core and 1080p60 about 1.7 (of 8). gamescope also publishes a PipeWire `gamescope` video source, but the Frame's GStreamer has no `pipewiresrc`. **Verified 2026-09-26.** | Frame Control's live video (`/api/stream`) | | Battery: `/sys/class/power_supply/max1720x_bat_7-36` gives µV/µA (current is positive while charging), `time_to_full_now`/`time_to_empty_now` in seconds, and `temp` in tenths of °C. The charger shows up as `tcpm-source-psy-…` (`type=USB`, `usb_type=C PD [PD_PPS]`), for example 12 V × 1.67 A. | Frame Control's battery card | | `vrcmd --stats` reports `activity_level` (3 = standby). | Telling whether the headset is being worn | +| **Testing VR apps without wearing the headset.** In standby SteamVR keeps OpenXR sessions hidden, so they render one frame and stop. `vrcmd` (in `/opt/steamvr/bin/linuxarm64`) settings use `section.key`: `vrcmd --set-settings-bool power.pauseCompositorOnStandby 0` and `vrcmd --set-settings-float power.turnOffScreensTimeout 3600`, then `vrcmd --handlewakeup`, keep the compositor running, and the scene app becomes visible. If it stays `visible-blurred`, the Steam dashboard is open: `SteamClient.OpenVR.VROverlay.HideDashboard()` in Steam's `SharedJSContext` (CDP on 8080) closes it. The headset view then captures with `ui/frame_vrshot.py`. Restore afterwards with `--set-settings-bool power.pauseCompositorOnStandby 1` and `--set-settings-float power.turnOffScreensTimeout 5`. The bool setter reads `true` as false, so use 1/0. A Steam launch that stalls in standby at `ShowInterstitials` or `CreatingProcess` (see `console_log.txt`) continues with `SteamClient.Apps.ContinueGameAction(, "", "")`. **Verified 2026-09-27.** | Proving VR output remotely, [webxr-chromium.md](webxr-chromium.md) | | The SteamVR dashboard has docking: Float in World, Move, Size, Curvature, controller docking, Theater, Multitasking View. **Inferred** from `/opt/steamvr/resources/webinterface/dashboard/` and not yet driven by hand. | [panels.md](panels.md) | | SteamVR settings live in `~/.config/openvr/config/steamvr.vrsettings`, not under `~/.local/share/Steam/config/`. `dashboard.lastAccessedExternalOverlayKey` names the last panel you used. | Settings tweaks | | The Steam client's journal (`journalctl --user`) carries SteamVR system UI lines such as `[Overlays] Created: …` and `vroverlay_uid`. It's the quickest way to see panels come and go. | Debugging | diff --git a/docs/webxr-chromium.md b/docs/webxr-chromium.md index aa66277..7e001bf 100644 --- a/docs/webxr-chromium.md +++ b/docs/webxr-chromium.md @@ -116,6 +116,18 @@ this build): [`webxr_vr_video`](https://threejs.org/examples/webxr_vr_video.html) demo, a stereo 360 video, played in 3D after pressing Enter VR. +- **Launched from the Steam library, verified remotely 2026-09-27** with + nobody wearing the headset (standby workaround in + [how-the-frame-works.md](how-the-frame-works.md)). The installer's Steam + shortcut starts Chromium, and SteamVR takes it as scene app + `steam.app.`. A minimal WebXR session that clears every frame + to red ran at about 75 frames per second, and the stereo headset capture + showed both eyes solid red. Steam preloads its overlay + (`gameoverlayrenderer.so`), which crashed Chromium's zygote about 30 s after + a Steam launch. The public repo's launcher now removes it from + `LD_PRELOAD`. With the headset outside its playspace, SteamVR shows + passthrough wherever the page leaves transparent pixels. + **Not verified yet:** - Frame rate and dropped frames during playback (nothing was measured; it