[vr-perf] now has the game thread's own CPU time per frame (CLOCK_THREAD_CPUTIME_ID), the
time in xrWaitFrame and in acquiring the swapchain image (with its wait), and the eye size, so
the split between work and waiting is there (lessons 39, 50, 62). The load key loads a save
instead of starting a map, exit_seconds leaves after that many seconds of rendering.
perf_run.sh does one run and adds the Adreno's time at each frequency over it.
SteamVR logs standby; with nobody wearing it, it goes to standby a few seconds after an app
closes. If it doesn't within two minutes the script refuses to launch (FRAME_SKIP_WORN_CHECK=1
overrides). The --data help says the copy is only for when Half-Life isn't in Steam.
diag_hand_yaw and diag_hand_pitch turn the synthetic hands' aim from the head's,
so the menu laser can be pointed. vr-state.txt says where the cursor is (u, v and
the pixel in the screen image). analyze_roll.py compares HUD-on and HUD-off dumps at
different rolls and says how far the world and the HUD turned. Host test for the
laser maths (ray against the quad, beam and dot poses).
diag_roll tilts the synthetic head, to check the HUD stays level. diag_press
holds buttons down for a while ("A@300+30, LG@400+20", frames after the
map starts) so the controller map can run with nobody holding controllers:
the map code runs when there are presses to come, with the runtime's own
inputs under them. diag_gap sets how far apart the synthetic hands are, for
the two-handed hold against the grab. The map logs each press and what it
made of it. A host test builds the effective map table for both hands and
every context and fails on an input doing two things, an unlisted alias or an
action nothing reaches.
vr-state.txt now has each eye's position and rotation in head space,
and a grid of probes: rays from the left eye through pixels of the
image, traced into the world, with the depth along the view axis and the
disparity a correct stereo pair should show there. analyze_stereo.py
block-matches the right eye at those points and prints predicted against
measured (numpy and pillow in a venv). A new cmd key runs console commands
about five seconds after the map starts, for cheats, cvars, giving the
suit to get a HUD.
The repo ignores *.mdl, *.wav and the loading backgrounds, so a build from
source had no hands or replacement weapons. The script copies only the
missing, ignored files out of Team Beef's release APK, hash pinned.
The readback used gl4es's glReadPixels, which doesn't know the swapchain's
framebuffers. It uses the driver's now. The dump logs the driver's
framebuffer bindings, viewport and scissor, the share of pixels that
aren't black and the connection state, and vr-state.txt says whether a map
is running. New probe key: clear each eye to a flat colour before the dump,
to tell a broken readback from a broken picture. [vr-perf] shows game=active
once a map is running.
VR_ARCHITECTURE.md has what the first unattended runs found.
deploy.sh builds nothing, it installs over adb to Lepton Development,
registers the persistent Steam title, copies the game data, sets the
vr-diag.ini keys, pulls the dumps and the log. It checks the Frame
booking first and won't install or launch unless the holder is the name
passed with --lock-holder.
The host tests check the binding tables against each profile's
component list, that the action names are unique, the ini parser, the
BMP writer and the booking check.
make_frame_tile.py reads the release tile from the git-ignored
assets/background, takes the Quest help off it, draws the Frame's, and
writes it into build/frame-assets. The frame build type's assets override
the release tile with it, a gradle task runs it before mergeFrameAssets.
Quest and Pico builds are untouched. If the tile or Pillow and numpy are
missing, the Frame build goes on with the release tile and a warning.