docs: record OpenGL performance burndown and acceptance gates

This commit is contained in:
Matthew Stanley
2026-09-04 22:59:51 -07:00
parent 17f49ad3b2
commit beb61d90b1
+102
View File
@@ -0,0 +1,102 @@
# OpenGL performance campaign
Tracking: central Beads `beads-jod2`, beneath `beads-eio.3` (psxrecomp framework).
Branch: `perf/opengl-burndown-20260904`.
Starting revision: `bf61b1054313e1c80d5c2bf1b14a1e50f2e54b8a`.
This is the audited integration revision, not a claim about a shipped release.
## Objective and constraints
Improve sustained guest speed, frame consistency, and resource use at identical
settings and correctness. OpenGL is the primary renderer. Vulkan completeness
is a separate qualification exercise, never a substitute for an OpenGL fix.
Use GPT-5.5 agents for bounded implementation and independent adversarial review
of their code, measurements, and acceptance claims.
The primary route is Ape Escape, Crabby Beach, approaching and facing the water.
Inspect existing `ApeEscapeRecomp/saves/scph1001` states before choosing one;
preserve originals and record BIOS, state hash, scene, and input sequence.
Add quiet gameplay, facing away, and a transition, plus Tomba 2 and Mega Man X6
regression routes. Compare guest speed, game-produced frames, and host presents
separately to avoid treating original-game slowdown as host overload.
Test unrestricted, 50%, and 25% host CPU budgets, with affinity recorded as a
separate variable. Never change guest clocks to simulate hardware. CPU throttling
does not emulate older caches, memory bandwidth, or integrated graphics. Real
acceptance targets are an older 2-core/4-thread integrated-graphics PC and a
Deck-class handheld, with desktop and supported-platform regression coverage.
## Work packages
This table defines the approved work, not its live issue status. Beads owns
status and dependencies; experiment results belong in the evidence ledger.
| ID | Work and candidate experiments | Required evidence |
| --- | --- | --- |
| P0-1 | Repeatable route runner, artifact/config identity, machine-readable A/B reports | Same guest work, reproducible baseline, measured noise |
| P0-2 | Release flags, effective settings, overlay inventory, cache rejection and compiler failures | Clean-install Windows/Linux behavior without development caches |
| P1-1 | Unused audio/GPU histories, memory observers, tracing/logging, diagnostic allocations | Measured saved work; retain functional observers and cheap health counters |
| P1-2 | GL batch breaks, texture/CLUT dependencies, packing, readbacks, uploads, buffer streaming | Identical order, masks, blending, texture feedback, VRAM and enhanced output |
| P1-3 | Swap blocking, pacer ownership, spinning, refresh/focus, interpolation and audio delivery | No speed drift, latency regression or new underruns |
| P1-4 | Overlay discovery, validation, loading, fallback, compilation contention and cache growth | Correct identity across replacement, self-modification, restore and cold installs |
| P2-1 | Generated code, dispatch, continuations, state traffic, interpreter, lookup/linking | Exceptions, delay slots, resumes and invalidation across all execution tiers |
| P2-2 | RAM/MMIO, aliases, observers, cycle publication, deadlines and idle detection | Exact cycle charges, side effects and event ordering |
| P2-3 | GTE/PGXP state copies, inactive hooks and shadow validation | Exact GTE state and unchanged enabled enhancements |
| P2-4 | SPU/resampling, CD/XA, MDEC, DMA, disc/decompression/card I/O; SIMD/batching/prefetch | Audio, IRQs, backpressure, decode output and completion timing |
| P2-5 | Allocation, bandwidth, locality, texture caches, mods/UI, rewind, netplay | Bounded memory, enabled-feature parity and inexpensive inactive paths |
| P2-6 | PGO/LTO, compiler options, code layout, portable SIMD and build costs | Multi-title gains, arithmetic parity and portable release artifacts |
| P3-1 | Threads, helper processes and GPU compute for attributed hotspots | End-to-end constrained-host gains including all transfer/sync costs |
| P3-2 | Software renderer hotspots and separate Vulkan qualification | Explicit coverage gaps; OpenGL acceptance remains mandatory |
| P4-1 | Release integration and recurring performance gates | Clean-install route, correctness and resource checks on shipped artifacts |
Complete broad attribution before concentrating implementation on the largest
cost. Every area receives a measured disposition, including already optimized,
rejected, or deferred with a concrete missing prerequisite. Do not infer impact
from source size, suggestive names, or another console's bottlenecks.
## Measurement and acceptance
Follow [HOST_OPTIMIZATION_CONTRACT.md](HOST_OPTIMIZATION_CONTRACT.md).
Use at least three interleaved A/B pairs with all raw results, minima, medians,
discard reasons, a preregistered primary metric, and the 5% retention gate for
added complexity. Use forced faithful/candidate selectors where practical.
Separate warm-cache throughput (fixed guest work; no compiler activity) from
first-use and transition campaigns where compilation/loading is the subject.
The latter must be explicitly labeled and must not be represented as satisfying
the quiet-host warm-cache gate. Use 120-second paced windows for stutter.
Record source and artifact hashes, generated code, BIOS, toolchain, effective
settings, overlay contents, power state, pacing owner and instrumentation.
Attribute CPU samples and thread waits, GL scene/present time, readback/upload
bytes, execution tiers, device work, audio underruns, memory, allocations, page
faults and I/O. Expensive profiling is for attribution; final timing must also
run without it. Missing or reset counters must never become zero-cost evidence.
Compare deterministic guest state at intermediate checkpoints, including cycles,
deadlines, pending exceptions, device state, RAM/VRAM/SPU RAM and overlay identity.
Add rendered-output/audio comparisons and candidate hit witnesses. Exercise
invalidation, aliases, exceptions, DMA, save/load, rewind and netplay as affected.
Do not claim parity from a fallback that silently avoids the candidate.
For offload, specify ownership, immutable inputs, publication deadlines, bounded
queues, backpressure, cancellation and restore before coding. Compare inline
against one worker first. No races on guest memory, altered device ordering, or
implicit cross-thread GL context use. Count IPC, copying, driver contention,
memory and synchronization in the gain, especially on low-core-count/iGPU hosts.
## Initial evidence and completion
Source inspection found always-on audio PCM history and GP0 history, potential
GL full-VRAM readback, and multiple VRAM copies. These are hypotheses, not
measured causes of Crabby Beach slowdown. Widescreen overhang detection is
functional; its census already has a gate. Vulkan already has a staging cache.
Cycle batching, event deadlines, sparse probes, MDEC SIMD and GPU-direct GL
presentation already exist and must not be proposed as new work without audit.
Append accepted, rejected and incomplete experiments to an evidence ledger with
raw-data links. Keep issue status in central Beads and record landed commits.
Do not close the campaign until every work package has a disposition and accepted
improvements reach validated title releases. Target sustained real-time execution
at preserved settings on the selected hardware, without new correctness, audio,
or pacing failures. Record hardware limitations rather than hiding them.