GPU.js kernel stress test
Direct calls to the current Apple II video kernels at 560 × 384. The harness controls demand and completion independently of emulator clocks, FPS sliders and animation frames.
Completed rendering throughput
Blue: JavaScript · Orange: WASM · Dashed grey: requested rate. FPS counts completed kernel renders, not displayed screen refreshes. MAX is an uncapped demand run.
Batch completion latency — p95
Blue: JavaScript · Orange: WASM. Time from the first kernel call until the batch's completion is observed, including browser notification/polling delay.
CPU submission, upload calls and GPU draw time
Blue: JavaScript · Orange: WASM. Solid: CPU ms/render · Dashed: upload-call ms/render · Dotted: isolated GPU draw ms. Profiling is separate from throughput; unavailable measurements show N/A.
Measurements
| Driver / repeat | Request FPS | Completed FPS | CPU ms/render | Batch p50 ms | Batch p95 ms | Upload call ms | Upload KiB/render | Upload complete ms | GPU draw ms | Missed budget | Target met |
|---|
How to interpret the test
One batch is outstanding at a time. WebGL2 uses asynchronous completion fences; WebGL1 is explicitly labelled when it uses blocking gl.finish. The sustainable threshold requires at least 95% of requested throughput and p95 batch latency within the batch interval in every repetition. The boundary is refined with two additional requested rates when a passing/failing bracket exists.
The default reuses deterministic precomputed inputs. The optional RAM snapshot setting includes the production-style 24 KiB slice allocation/copy. WASM changes only the dispatch loop; GPU.js still executes in JavaScript. GPU timers and upload-call timings are diagnostic measurements, not physical DMA time. Tests stop when this tab becomes hidden.