Commit Graph
439 Commits
Author SHA1 Message Date
spoopyghosty0 922f7f31d4 MR: scan the room in the headset - RoomView 3D capture with headset prompts, wall labels, agent 92
The agent records Valve's passthrough depth mesh (IVRBlockQueue + IVRPaths, Background/Overlay OpenVR app), converts
poses with the final raw->standing transform, shows pre-rendered prompts as a SteamVR overlay, then builds the room
with fp_roomscan (room_capture / room_capture_status). PC: rooms.scan, Frame page progress, frameport frame room scan.
FrameBridge reads the optional wall label (INVISIBLE_WALL_FACE). ROOM_FORMAT: outline orientation stated exactly.
2026-10-18 19:56:12 -04:00
spoopyghosty0 efe0ed9df8 Finish room launcher integration and document device validation 2026-10-18 19:56:11 -04:00
spoopyghosty0 5e087a7d6a Diagnose missing MR rooms and unsupported scene discovery 2026-10-18 19:56:11 -04:00
spoopyghosty0 427a2d79af Enable scene emulation for scene and spatial anchor games 2026-10-18 19:56:10 -04:00
spoopyghosty0 7cf06e0332 Show room readiness and floor plans in the Frame UI 2026-10-18 19:56:10 -04:00
spoopyghosty0 3c4c705253 Add room CLI and reuse host helper synchronization 2026-10-18 19:49:01 -04:00
spoopyghosty0 c89c5aefae Store rooms on the Frame and synchronize Quest launchers 2026-10-18 19:48:50 -04:00
spoopyghosty0 2fd2672237 Add portable room format validation and floor plan previews 2026-10-18 19:48:27 -04:00
spoopyghosty0 81beaf9806 Verify shim routing and protect erased or stale scene handles 2026-10-18 19:48:17 -04:00
spoopyghosty0 fa0669a952 Test room geometry discovery persistence and malformed data on the host 2026-10-18 19:48:16 -04:00
spoopyghosty0 4b513e195f Gamepad for 2D apps: own button layout (swap sticks, swap A/B, own .kl lines) and Steam's controller log in diagnostics (#162); fix main's CI
Steam Input's per-game remapping doesn't reach a 2D app; device.steam_gamepad's options now change the buttons
inside the app: the launcher exports FRAMEPORT_GAMEPAD_LAYOUT/_KEYS, the agent's Podman wrapper mounts a per-game
key layout (agent v103). Diagnostics of such games carry gamepad.log and Steam's controller activation lines. The
game page shows a patch's on/off options under it while it's on.
CI: locales template refreshed; frame.main_process counts as a patch that works on the 32-bit bridge.
2026-10-18 12:57:04 -04:00
spoopyghosty0 206a2448b3 Triage scene-missing: extension listings don't count (OVRPlugin Name=, OVRPort's list, Unity's Extensions=) (#404) 2026-10-18 12:40:10 -04:00
spoopyghosty0 104c003c44 frame.main_process: run a game activity that has its own process in the main one (#178)
Halo CE VR's HaloActivity runs in :halo_game; Lepton starts it directly and watches only the main process, which
never exists, so it closed the game about a minute in ('Target app ... did not start'). Analysis field
separate_process (ANALYSIS_VERSION 23), default-on patch, triage app-separate-process, PLAYBOOK row.
2026-10-18 12:35:48 -04:00
spoopyghosty0 4fec0656ff OpenGL ES shader dump/fix offered for Unity games whose boot.config mentions Vulkan; either setting brings in the shader-fix layer (#382)
SynthRiders is analysed as 'Vulkan (Unity boot.config)' but renders with GLES on Zink, so the dump was hidden in
Game settings and session triage's suggestion was dropped; the dump setting alone also never added the layer.
2026-10-18 12:14:42 -04:00
spoopyghosty0 4e8486418f Install links: Check for updates on the game page; links without a version are checked too
Games installed from an install link get a row on the game page (where it came from, the installed version) with Check for updates, and the same entry in the page's menu: it asks the link now instead of waiting for the 6-hourly check. Manifests that named no version (e.g. an app's first release) were never checked; the installed APK's own versionName (from the analysis) is now the version to compare with, in the automatic check, the button and frameport link-updates.
2026-10-18 09:47:02 -04:00
spoopyghosty0 c67f79ebc6 Install-link update: take the new download instead of failing ('couldn't be read as an Android app')
Updating a game from its install link downloads the new APK into its own folder; the scan then finds it as another version of a library game (#351 relinking), switches the entry to it and returns nothing, and add_from_link reported that as an unreadable APK, so the update stopped before the link version was recorded. add_from_link now takes the entry from the scan report; if the scan left the library's copy (still on disk), the link switches the game to the download like Update with a newer APK.
2026-10-18 08:54:23 -04:00
spoopyghosty0 c469327590 Monitor: idle Frame no longer shows 100 % GPU (agent v102)
msm reported SteamVR's compositor engine time near 2^64, rising ~1000x faster than real time, so the summed GPU busy
was pinned at 100 % on an idle Frame. Each render fd is now tracked on its own; a delta longer than the interval
falls back to drm-cycles-gpu / GPU clock. Checked on the dev Frame: installed agent 100 %, this one 0.0 % at 231 MHz.
2026-10-18 08:51:02 -04:00
spoopyghosty0 b00abe3ce1 Install-link update toast gets an Update button
It said a newer version was available but offered no way to get it from there (the Library bar and the game page
had the button).
2026-10-18 08:46:30 -04:00
spoopyghosty0 05f221b216 pop_dialog() closes the pop-up, never a toast (install-link question stayed open)
Flet 1.0 keeps toasts in the same stack as dialogs and pop_dialog() closes the topmost open entry. An install link's
job shows a "waiting for your answer" toast just as its question appears; when the toast came second, "Download
and install" closed the toast, the download ran, and the question stayed on screen. pop_dialog now skips toasts
(reproduced and checked with real clicks in the web build). Also a too-long test docstring line.
2026-10-17 22:25:11 -04:00
spoopyghosty0 472c607efd Restart after a source/wheel update keeps a hidden console on Windows
DETACHED_PROCESS left the restarted FramePort without a console, so every console program it started (ssh, git) opened
its own visible terminal, and the Frame connection's ssh kept one open. CREATE_NO_WINDOW gives it a hidden console,
as the dev shortcut does.
2026-10-17 22:15:32 -04:00
spoopyghosty0 33bb14e034 FrameBridge: cube-only frames as quads (#385); CI: lint, foveation test
HardBullet's loading frames submit only a cube layer, which the Frame's runtime doesn't composite, so the loading
screen stayed black. Adapter setting cube_quads (default on) draws a cube-only frame's six faces as quad layers
around the viewer; frames with a projection layer are unchanged. Adapter rebuilt on current main.

Also: the foveation test expected a numeric FOVE_LEVEL to pass through (Valve's layer ignores numbers since #394),
a long description line and an import order in adapter_dialog.py failed lint.
2026-10-17 21:52:39 -04:00
spoopyghosty0 0c06e1142f Install links: GitHub file pages become raw.githubusercontent.com; release manifests named via the API
The install page shows a manifest's name, description and icon only when the manifest's host allows CORS. GitHub file pages (github.com/<o>/<r>/blob|raw/<ref>/<path>) are now turned into their raw.githubusercontent.com address by the page (preview and the frameport:// link it hands over) and by deeplink.parse (a /blob/ page is HTML, so FramePort couldn't install from it). Release downloads can't be read by any web page: the page shows the release's name and the repo's description from GitHub's API instead of 'A game or app'. INSTALL_BUTTON.md says where to host a manifest.
2026-10-17 21:48:26 -04:00
spoopyghosty0 1b43c1c544 quest_buttons on main: rebuild the adapter with main's Batman changes, harness stub for mx_batman_geometry_initialize 2026-10-17 21:37:39 -04:00
spoopyghosty0 b42d85d7c4 Fix Frame binding ownership and accepted Touch translation 2026-10-17 21:36:41 -04:00
spoopyghosty0 bc728bb121 Report controller installs that need Update on Frame 2026-10-17 21:36:39 -04:00
spoopyghosty0 838952b4f5 Test: input_diag reports created actions through session_fixes' hook since #323 2026-10-17 21:36:38 -04:00
spoopyghosty0 1f64d089e1 quest_buttons: bare trigger/squeeze/button paths map too (OpenXR resolves them to value/click) 2026-10-17 21:36:37 -04:00
spoopyghosty0 54a2d84755 Keep inherited controller settings current after live updates 2026-10-17 21:36:23 -04:00
spoopyghosty0 31b4c684fe Add inherited Quest controller button preferences and mapping diagrams 2026-10-17 21:36:19 -04:00
spoopyghosty0 1f27cd47a3 Rebuild adapters and cover binding suggestion failures 2026-10-17 21:36:18 -04:00
spoopyghosty0 ff592e41e8 Add opt-in Quest controller bindings for Frame 2026-10-17 21:36:17 -04:00
spoopyghosty0 d02ff3c9aa Vulkan shim: leave out Lepton's Fossilize layer, blank shaders for refused pipelines (#349)
Transformers Beyond Reality: Redux ended its first frames with Unreal's "Shader compilation failures are
Fatal." With Lepton's Fossilize layer loaded every graphics pipeline failed with
VK_ERROR_OUT_OF_HOST_MEMORY, even a constant-colour one; the pipeline cache, the app's CPU allocator and
Valve's FDM/RPO layers were ruled out on the device. Without Fossilize a few multiview vertex shaders
still fail in Turnip.

- adapter.vk_no_fossilize: the shim removes VK_LAYER_fossilize from GraphicsEnv's debug layer list when
  the engine loads it (library constructor, same GraphicsEnv calls as zinkfix)
- adapter.vk_pipeline_fallback: a refused graphics pipeline is created again with a blank fragment
  shader, then blank vertex + fragment shaders
- catalog entry (status unknown, headless only), triage vulkan-pipeline-refused, PLAYBOOK, DEVICE_NOTES

Headless on the dev Frame: RUNNING after 78 s at 72 fps (was: exit within 21 s). Headset check pending.
2026-10-17 21:34:00 -04:00
spoopyghosty0 107215525f Save backups: choose the folder, quick actions, automatic snapshots (#352)
Settings -> Data picks the PC backup folder (e.g. a cloud-sync folder; old folders stay listed) and turns on
automatic snapshots (off by default): Quest launchers snapshot the saves when the game closes, under the launch lock,
keeping the newest three changed ones on the Frame, and FramePort imports them as automatic backups when it connects.
Agent v101. Checked on the Frame with BlazeRush (snapshot per close, one import per snapshot).
2026-10-17 21:29:32 -04:00
spoopyghosty0 6a6b6be5b5 USB setup: no console flash, connect when the Frame answers (#398)
The cable wait ran ipconfig every 2 s without CREATE_NO_WINDOW, so the windowed Windows app flashed a console each
time, and it only tried the Frame once ipconfig listed this PC's cable address, which Windows can report differently.
Commands now run hidden and the wait connects as soon as the Frame's SSH answers over the cable.
2026-10-17 21:14:33 -04:00
spoopyghosty0 01ad5e6b97 Foveation area size: use Valve's FOVE_LEVEL presets (#394)
The old radius setting exported FOVE_INNER/FOVE_OUTER, which Lepton doesn't pass into the container and Valve's
foveation layer doesn't read, so every size looked the same. Game settings now offers Default (large) / Large /
Medium / Small, exported as FOVE_LEVEL=lo/med/hi (the layer's own preset names); saved radius choices map to the
nearest preset. The agent's launcher update accepts FOVE_LEVEL.
2026-10-17 20:56:27 -04:00
spoopyghosty0 faca9bf396 unreal_noreserve: a build with nothing to rewrite passes its check (#393)
The validator required at least one rewritten mmap call, so an Unreal build without the Binned3 reservation
pattern (Lies Beneath) failed to build with "0 rewritten, 0 left" once the patch was on.
2026-10-17 16:53:43 -04:00
spoopyghosty0 5e668f33d3 Batman audio hooks: place stubs in verified free gaps, say which step failed
On the Frame the atomic-branch detours never installed ("installation failed"): an mmap hint isn't honoured,
so the stub landed out of B range. Stubs now go into free gaps from /proc/self/maps within +-128 MiB of the
entry, mapped with MAP_FIXED_NOREPLACE (a relocated result is rejected); no gap = no hook. Every failure logs
the target and the failing step.
2026-10-17 16:47:06 -04:00
spoopyghosty0 feb4658dde Batman audio hooks: publish detours with one atomic branch (#389, #34)
The detour helper from PR #34 (used by the metadata hook and PR #389's two geometry hooks) wrote a 16-byte
branch + literal in two steps while game threads may run the function (installation is retried from
xrPollEvent). Each hook now publishes a single aligned release-atomic AArch64 B to a stub within +-128 MiB;
the trampoline replays the one verified instruction and returns to entry+4. Every mprotect is checked;
failures before publication free the stub and trampoline and leave the function untouched; no stub in range =
no hook. Adapter artifacts rebuilt by us (the PR's binary isn't shipped).
2026-10-17 16:47:06 -04:00
Lucas-Mathieu 61a6b3e2b2 Keep the ELF installer regression Linux-specific 2026-10-17 16:47:06 -04:00
Lucas-Mathieu 78fc926a48 Fix Batman audio geometry input lifetime across background loading 2026-10-17 16:47:05 -04:00
spoopyghosty0 3deb279270 Headset model: an unknown OVRPort dispatcher keeps Quest 2 instead of failing the build (#373)
Quest 3 is the default for every Quest game, but the dispatcher patch only knows OVRPort 3.4.3-aa54c3f: an
APK converted with another runtime (found with an already converted Batman copy) failed to build. It now
keeps OVRPort's Quest 2 answers and says so in the build checks.
2026-10-17 16:35:35 -04:00
spoopyghosty0 9106d3f090 Agent: uninstall works with Steam library mode later/off (#305)
cmd_shortcuts returns without "started" when it queues (later) or skips the change; cmd_uninstall indexed it
and failed after the shortcut removal was already queued, leaving the game installed. Found on the Frame.
2026-10-17 16:23:27 -04:00
spoopyghosty0 39fefd225f Steam library scheduling: now / later / off (#305)
Installing on the Frame restarted Steam to add the shortcuts, which also closed FramePort running there.
Settings -> Installing gets a Steam library mode: now (as before; restarts also wait while FramePort runs on
the Frame), later (no restart: Steam's next start re-applies and verifies the shortcuts through bounded
steam.service hooks) or off (no shortcuts; Play starts the game from FramePort). Restart Steam now bypasses
the holds and asks before ending a running game. Agent v99.

Based on the feature branch's two commits (a311498, cf05ce2), merged onto main.
2026-10-17 16:23:26 -04:00
spoopyghosty0 8381dacdaa CI: fix the tests main broke (Files icons, headset default, adapter revision)
- Files: line-style icons for the drive, PC VR and Linux sections (test_ui_consistency).
- test_pc_target: Quest games now also gain device.headset_model from its migration; PC VR games never do.
- test_surface_projection: frame.adapter is revision 2 since the dormant foveation diagnostic (#365).
2026-10-17 16:08:26 -04:00
spoopyghosty0 fc5908618c Files: separate sections for PC VR games and Linux apps (#361)
Their entries open the install folder rather than Android storage, so they get their own "PC VR games" and
"Linux apps" sections next to Game storage. ui_smoke: linux-files step.
2026-10-17 15:58:13 -04:00
spoopyghosty0 d7f0d51472 Foveation as a per-game setting; "Sharpness" is "Render resolution" (#365)
Foveation (Default / Eye-tracked / Fixed / Off, radius, test) moves from Customize to Game settings →
Picture. It's a user preference, not part of the recipe: existing recipes are migrated once and Share
working config leaves it out. Agent v98 set_settings rewrites only the launcher's foveation exports, so a
change applies at the next game start without a rebuild (checked on the Frame: Fixed adds the FDM exports,
Default removes them). The APK-side parts (Batman allocation fix, Climb 2 bridge) stay in the build.
The scale setting's label is now "Render resolution (supersampling)". ui_smoke: game-settings-dialog step.
2026-10-17 15:46:35 -04:00
spoopyghosty0 55c6da7010 Files: read drives through the Frame target (shared drive cache)
The drive locations called the agent directly, bypassing the target that the Storage section and Move to…
use and the cached app.frame_drives list.
2026-10-17 15:42:36 -04:00
spoopyghosty0 f996e5e7d9 Files: SD cards/drives and PC VR/Linux game folders as locations (#361)
Each drive the agent reports (SD card, USB, other Steam library drives) is a Files location with its free
space; read-only drives allow downloads only. Installed PC VR and Linux games get their install folder.
Agent v97: drives report read_only explicitly (checked on the Frame).
2026-10-17 15:29:59 -04:00
spoopyghosty0 1e1c435191 Headset model per game, Quest 3 by default (#373)
Games saw a Quest 2: OVRPort's dispatcher hardcodes the system name "Oculus Quest2" and a Quest 2
headset UUID (XR_META_headset_id), and OVRPlugin decides the headset type from the UUID first, then the
name. device.headset_model (Customize; Quest 3 default for every Quest game, also Quest 3S, Quest Pro,
Quest 2) rewrites both in the dispatcher after checking the original bytes; Quest 2 leaves the build
byte-identical. FrameBridge reports the same name to games that call the runtime directly. A library
migration adds the default to existing recipes (installed games show Update on Frame).
Lepton's ro.product.model ("Lepton") can't be overridden by boot properties, so Build.MODEL is unchanged.

Verified on the Frame: OVRPlugin logs "systemName Meta Quest 3" (was "Oculus Quest2").
2026-10-17 15:18:45 -04:00
spoopyghosty0 7d4e20844f FrameBridge: XR_FB_color_space for games that require it (#336)
OutRun Quest VR quits before its VR session with "Rec.709 color space unavailable": the Frame's runtime
has no XR_FB_color_space. Adapter setting fb_color_space (off by default; triage color-space-missing
suggests it) offers the extension when the runtime lacks it, reports Rec.709 and accepts any colour
space without converting. OVRPort's dispatcher can't forward the new functions, so it isn't on for every
game. Not yet tried on the device.
2026-10-17 14:56:59 -04:00