Replay each VR eye in one render pass

- 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>
This commit is contained in:
iChris4andClaude Opus 5.5 committed 2026-09-24 18:18:08 +02:00
1 parent 13311ea626
commit ceeeba0332
12 files changed
+527 -18

No files matched your search

+8
View File
@@ -48,6 +48,7 @@ hud_virtual_screen = true
flat_screen = false
stop_at_display_copy = true
skip_copy_clears = true
single_pass_eyes = true
first_person = false
first_person_toggle_click = true
first_person_seat = "cockpit"
@@ -161,6 +162,13 @@ panel's rectangle), at the same size per pixel, so nothing moves.
`stop_at_display_copy` ends eye replay at the final `GXCopyDisp`, matching the frame shown on the
desktop. `skip_copy_clears` independently suppresses the EFB reset performed after a copy. Both
default on and can be changed live from the F10 settings bar for diagnostics.
`single_pass_eyes` draws each eye in one render pass. The desktop image ends a render pass at every
GX copy, because the copy reads what was drawn before it; an eye samples the copies the desktop
image made and never performs them, so it keeps drawing in the pass it has open, and it leaves out
whatever a later clear of the whole color and depth erases. The picture is the same with less GPU
memory traffic, which a tiled mobile GPU pays for at every split (the "Eye replay plan" log line
reports each new pass structure). It defaults on and is live; turning it off replays one render pass
per recorded pass.
`first_person` and the `first_person_*` values are the first-person camera described below. All
four are live and are also exposed in the F10 settings bar.
`performance_level` is the level asked of the runtime through `XR_EXT_performance_settings` for