Build aurora's Vulkan interop on Linux with the patched Dawn linked statically, extend the Vulkan OpenXR backend guards to desktop Linux, and route openxr_integration to it with XR_KHR_vulkan_enable2 and timespec display-time conversion. Re-applied from the earlier native Linux commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adapted only for paths here: xrmock build.sh headers, privacy-check root, KartFrame lock and ccache dir.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Requirements, install, first run, updating, the full controller layout as
the code implements it, settings and script variables, known problems,
troubleshooting, logs and how to report a problem, building, credits. The AI
statement is shorter. CONTRIBUTING.md points bug reports at the right README.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
steam-frame/collect-logs.sh gathers the Lepton, wrapper, game and build logs
plus Config.toml into one archive and masks IP and MAC addresses, UUIDs, host
names, Wi-Fi names, serial numbers, Steam IDs, email addresses, tokens and
certificate blocks. Lepton's log carries the Frame's kernel log, which lists
hardware serial numbers. steam-frame/PRIVACY_AUDIT.md records what was
checked and the commands that repeat the check. A build.sh comment no longer
names an unrelated project.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
frame-controller-models.py now runs a QEM edge-collapse simplifier on each
hand (about 4,000 triangles, seams, boundaries and moving parts kept), so the
menus stay at 90 Hz; install.sh converts them unless WCF_FRAME_MODELS=0.
README: change 9, and the known issue about Quest controllers removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7dBRsvawKKn1F9gf68SYv
frame-controller-models.py converts the Frame controller render models SteamVR
keeps on every Frame into the game's WCC1 controller format (grip space, baked
AO texture, nine animated controls, tutorial landmarks), and the launch wrapper
puts them in place of the Touch Plus files. They looked right in the headset
but cost too much: ~7x the vertices, re-animated on the CPU each frame, and the
menus fell to 45-60 fps. install.sh therefore only converts them with
WCF_FRAME_MODELS=1. README documents that and change 8 (grips hold the wheel in
the cockpit).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7dBRsvawKKn1F9gf68SYv
With hand steering on, a grip squeeze in the first-person cockpit both grabbed
the wheel and drifted. Grips now drift only outside the cockpit (or with hand
steering off); the right bumper drifts everywhere. The SteamVR binding no
longer sends a grip click to frame_drift, and the seed config turns hand
steering back on.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7dBRsvawKKn1F9gf68SYv
The second release built and ran on the Frame from a clean start. The item box
change does not hide the empty box; the menus show Quest Touch models because
Lepton gets no SteamVR render models; grips do not grab the wheel because hand
steering is off on purpose for this layout.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7dBRsvawKKn1F9gf68SYv
The first release's objects were compiled with NDK r30, whose libc++ headers
emit std::__hash_memory; the kit's r29 libc++ has no such symbol and the
on-device link failed. Use HomuHomu833's r29 build on arm64 (Google's r29 on
x86_64) and fail the build when an object imports a mangled symbol the kit's
original does not.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7dBRsvawKKn1F9gf68SYv
Lepton keeps the app's private data across an APK update, so a game built
against upstream's kit survives; the app refuses it as stale and the wrapper
used to start the game activity anyway (black screen). Compare game.json's
kitFingerprint with the APK's kit.json and leave the launcher up otherwise.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7dBRsvawKKn1F9gf68SYv
steam-frame/build.sh compiles the two runtime unity groups holding the patched
openxr_input.cpp / openxr_integration.cpp and Aurora's gfx/common.cpp with a
self-contained Android NDK, checks their exported symbols against the kit in the
upstream v1.3.1 Quest APK, and make-apk.py puts them into that APK's game kit with
a new kit fingerprint, the classes.dex clipboard fix (dexpatch.py), zipalign-style
alignment and a v2 signature made with openssl. The headset then builds the game
from the player's own disc against the Frame kit, as upstream designed.
install.sh adds the Lepton shortcut through Steam's client API and writes the
SteamVR binding and per-app settings; wiicompiled-launch.sh seeds Config.toml and
starts the game activity once a game exists, since the 2D launcher never shows in
the headset. build-deps/ carries the third-party headers the three units include.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7dBRsvawKKn1F9gf68SYv
- The pacing thread aims each immersive window eye through the window itself (AimEyesThroughWindow):
it keeps its position but looks square-on at the window's plane through an off-axis frustum just
around it, so the eye image is the window, at the display's pixel density (about 680x380 per eye
at render_scale 0.8 instead of 1344x1408), with a two-pixel border the mask leaves transparent.
The frame's views carry that pose and field of view to the projection layer.
- vulkan_interop.cpp copies an eye smaller than its AHardwareBuffer into the buffer's corner, and
the Quest layer's imageRect is the rendered part of the swapchain image.
- These eyes are not foveated: their field of view follows the head, which would rebuild the
density map every frame.
- Quest only (kWindowShapedEyesSupported); the PC backends copy whole eyes and keep masking them.
debug.wiicompiled.window_eyes 0 renders them whole and masked again for A/B timing.
- Quest 3, paused Retro Rewind race, render_scale 1.0: Immersive window runs the GPU at level 1
(456 MHz, app GPU 11.0 ms, eyes 8.4 ms) where Immersive needs level 3 (599-640 MHz, 13.4 ms,
10.3 ms), about 42% fewer GPU cycles. No edge artifacts, image as sharp. Docs: OPENXR.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Introduced a new configuration option for immersive window mode in runtime_config.h.
- Updated the parsing and setting functions to handle the immersive window state.
- Modified the OpenXR backend to support rendering with the immersive window, blending the race view with the surrounding environment.
- Enhanced the settings overlay to allow users to select between immersive, immersive window, and flat screen race views.
- Implemented GPU rendering logic for the immersive window mask, ensuring correct visual output in various rendering paths.
- Added tests to validate the immersive window functionality and its interaction with existing race view settings.
- The Quest's GPU applies the fragment density per screen tile and samples textures at a coarser
level inside reduced-rate tiles, so fine animated detail such as Retro Rewind's swamp goo shows
square tile edges at the periphery.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Retro Rewind's SNES Ghost Valley 2 at render_scale 1.0, GPU-bound at about 40 FPS: merging the
eye passes lifts it from 38.9 to 41.5 FPS (app GPU 23.3 to 21.7 ms), and no foveation level
raises the frame rate further.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Luigi Circuit Grand Prix start on a Quest 3, same-session A/B through the debug properties:
one render pass per eye saves 12% of eye GPU time at render_scale 0.8 and 8% at 1.3.
- Foveation is neutral at 0.8 (eyes are geometry and full-resolution tile-store bound) and saves
8/14/22% at Low/Medium/High at 1.3, so it stays off by default.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Eyes render under a VK_EXT_fragment_density_map: full rate around each eye's forward direction,
2x2 then 4x4 pixel blocks towards the edges ([vr] foveation = off|low|medium|high, default off).
XR_FB_foveation cannot help here: the runtime's maps only shape passes drawing into its
swapchain, and the eyes reach it through a copy.
- aurora-main/patches/dawn/aurora_fdm.inc: Dawn enables the extension only on request and for
dynamic rendering, flags every render pipeline, and chains an immutable RG8 map into any pass
whose first color attachment is a view bound to one (ABI: include/aurora/dawn_fdm_abi.h).
- android/Build-QuestDawn.ps1 builds the pinned Dawn revision with those patches for arm64
(dawn-build CI flags, protobuf off) into a cached package; Build-Quest.ps1 links it
(-StockDawn opts out) and AuroraDawnProvider.cmake enables the ABI from its manifest.
- lib/gfx/foveation.hpp generates the maps (32 px per texel, densities 255/127/63); an eye is
foveated only when single_pass_eyes draws it in one render pass. Menus never are.
- Live level from the headset panel's VR tab and the launcher; the launch decides whether the
device has maps. debug.wiicompiled.foveation and debug.wiicompiled.fdm for A/B.
- Tests: Foveation cases in gx_fifo_tests, mkw_vr_config_tests. Docs: OPENXR.md, quest-port.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Added eye_pass_plan.hpp: an eye keeps drawing in the render pass it has open across the frame's
GX copies (only the mono render performs them), skips passes a later clear of the whole color and
depth erases, and splits only for a clear of color alone or depth alone.
- render_stereo_eye follows that plan; the cockpit fallback is drawn inside the last pass instead of
a render pass of its own that loaded the eye back.
- The stencil is now cleared where the eye actually starts, so a cockpit mask drawn in an erased pass
can no longer punch holes in the HUD.
- [vr] single_pass_eyes (default on, live from F10) and debug.wiicompiled.eye_passes 0/1 on the Quest
switch back to one render pass per recorded pass for A/B timing.
- Each new plan shape is logged once ("Eye replay plan: ...").
- Tests: EyePassPlan cases in gx_fifo_tests; stereo_multiplayer_smoke and stereo_frame_worker_smoke
pass on D3D12.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Added `ic_question_tip.xml` and `ic_success_tip.xml` vector drawables for UI icons.
- Created layout files for friend-related dialogs: `dialog_add_friend.xml` and `dialog_friend_code.xml`.
- Implemented `item_friend.xml` for displaying individual friend cards in the friends list.
- Developed `page_friends.xml` for the main friends page layout, including empty state handling.
- Added unit tests in `RksysFriendsTest.kt` to validate friend management logic and interactions.
- Introduced `SidebarStatusTest.kt` to ensure proper status reading and SVG path parsing.
- Added PlayerRow.kt to bind player data for leaderboard and rooms.
- Introduced PodiumCard.kt for podium animations and display of player rankings.
- Created drawable resources for podium backgrounds, badges, and particles.
- Developed layout files for leaderboard header and podium cards.
- Implemented LeaderboardTest to validate leaderboard functionality and player ranking logic.
- Created dialog_player_profile.xml for displaying player profiles with loading and error states.
- Added item_player.xml for individual player items in lists, showing Mii, name, friend code, and VR.
- Introduced item_room.xml for room items, displaying game mode, ID, and player count.
- Developed page_room_details.xml for detailed room information, including player actions.
- Implemented page_rooms.xml for the main rooms page layout, featuring search functionality and room listings.
- Added view_vr_history.xml for visualizing player's VR history over time.
- Created LiveRoomsTest.kt to validate room and player functionalities, including leaderboard integration and search capabilities.