Repository navigation
DSP HLE Shadow Mode and OpenAL Evaluation
Status: experimental and incomplete. The audio-engine branch has a Default / JIT / HLE selector and guarded native implementations for selected DSP work. The running xemu HLE mode still uses the DSP JIT. Full DSP bypass, correct game audio and a game speedup have not been proven. This is not ready for user testing.
Current direction: Build JIT-free HLE using existing captured DSP commands and offline comparisons. No further live-game campaigns are planned. The last active Deck run finished after the runner refused a stop request; no new live-game runs were started after this direction.
| Question | Current answer |
|---|---|
| Is full DSP replacement working? | No. Coverage and guest side effects are incomplete; JIT fallback remains. |
| Does audio play in a game? | A Deck capture contained nonzero stereo audio without clipped samples. Signal presence does not prove correct playback or parity. |
| Is HLE faster in games? | Not established. Comparable game performance, CPU, memory and XISO timings are still needed. |
| Does OpenAL provide DSP emulation? | No. A standalone loopback probe matched a small gain test; integration and game behavior are untested. |
| Can users try this now? | No. The work is on experimental branches and remains on hold. |
| Guide | Contents |
|---|---|
| DSP HLE operation inventory | Identified GP/EP operations, program PCs, implementation and limits. |
| HLE fix examples and testing | Short source examples, test commands and compact measurements. |
| Area | Experimental behavior | Limitation |
|---|---|---|
| Audio engine selection | Advanced settings offer Default, JIT and HLE; a restart is required. | HLE is incomplete and can fall back to JIT. |
| EP mixer | A guarded native route serves matching program states. | Other programs and unsupported states use JIT; audio parity is not established. |
| GP filter, meter and delay | Guarded native operations run for recognized states. | These are selected paths, not a complete GP implementation. |
| GP block dispatcher | Opt-in experiment attempts native operations at JIT block boundaries. | An initial Deck run froze; two handoff diagnostics completed. Keep on hold; JIT fallback remains. |
| Shadow comparison | Compares native results with DSP results while the DSP remains authoritative. | A match covers only the observed inputs and states. |
| Offline EP mixer | Uncommitted exporter, batch script and standalone native fixture runner test existing captures. | The standalone runner does not load or execute the DSP JIT; this does not make xemu's HLE mode JIT-free. |
| Offline native EP engine | A reusable engine stages state, preflights the FIFO and commits PCM through an all-or-nothing callback. A standalone synthetic test binary links libc only. | Failed preflight or commit leaves engine state unchanged; the callback must itself be atomic. Live guest RAM/FIFO integration, GP integration and audio parity remain unfinished; xemu still uses JIT. |
| Offline EP memory and program validation | The native component exposes guest-visible X/Y/P word windows and 24-bit writes. Program validation is required and revoked when P memory changes, including after frame state changes. | Out-of-range addresses are rejected. This component is not yet connected to the live device. |
| Experimental JIT-backed native EP path | Commits PCM to QEMU guest RAM using a validated FIFO span plan, including ring/page splits, table-overlap rejection and RAM dirty marking. Monitor and silence behavior are preserved. | This is a separate path from the standalone engine. Full live-path and game-audio behavior remain unvalidated. |
| Offline GP gain | An uncommitted native 16-sample gain kernel and standalone projection runner test captured states without linking or calling the DSP JIT. | The running xemu HLE engine still uses JIT; this is not complete GP emulation. |
| Offline GP multiply-accumulate | A standalone native projection replays captured states without the DSP JIT. | Application HLE still uses the JIT and remains incomplete. |
The current work is on the audio-engine branch. These features are not a released HLE engine.
| Check | Result | What it proves |
|---|---|---|
| Offline complete GP frames | 16 / 16 completed and matched recorded final state and I/O with zero candidate DSP steps; the JIT-free candidate and separate JIT-backed reference agreed. | One identified program and saved inputs only. No live playback, hardware parity or speedup proof. |
| Public gain fixture on Deck | Three routes matched 192/192 words; a deliberately corrupted word was detected. | The comparison and negative control work for this fixture. |
| Fixed gain workload on Deck | Native median CPU cost 1.449 µs/block, DSP 7.673 µs/block: 81.11% lower. | A synthetic output/export workload improved; this is not a game speedup or full DSP equivalence. |
| EP live shadow in PGR2 | Last periodic report: 25,176 matches, including 24,041 nonzero, with zero reported mismatches. | Observed projections matched while DSP output remained authoritative. Unknown programs were skipped. |
| GP block replay | 16 captured frames matched, including 702 native calls and 104,376 projected guest cycles. | The captured offline inputs matched; this does not prove live-game stability. |
| GP block Deck game, no yield | Watchdog stopped an unresponsive run after 88.7 s; scene and audio capture were not reached. | The experimental block path is not qualified. |
| GP block Deck game, lock-yield diagnostic | Completed in 237.72 s; declared scene checks passed and runner evidence was complete. Last periodic report: 2,830,000 native calls, 432,024,051 guest cycles. | The artificial yield supports lock starvation as a hypothesis and shows native-path reachability. It does not prove full audio parity or performance. |
| GP block Deck game, voice-lock handoff | OpenGL diagnostic completed in 237.20 s; declared screen checks passed and runner evidence was complete. Last periodic report: 2,910,000 native calls, 444,421,709 guest cycles. | Uncommitted and unqualified. Two earlier Vulkan attempts did not reach the scene. |
| Offline EP mixer captures | 78/80 structurally supported captures matched PCM, mixed words and meters; 64 matching frames had nonzero PCM. 2 transition frames were unsupported. | Each matched case checks 512 PCM samples, 512 mixed words and 4 meters. 14 matching frames have an unrecognized serving identity; matching output alone does not authorize bypass. |
| Offline full-state EP candidate | 93/96 saved captures matched: 80 from two recognized programs and 13 silent frames from a third, unrecognized program. One other program mismatched cycle count; two captures had unsupported I/O. | The 13 silent frames do not prove audio parity. Candidate mode does not enable new programs for playback. The comparison binary links the JIT provider, but candidate verification does not execute it. No game test or speedup was measured. |
| Offline chained EP replay | 64/64 and 16/16 sequential frames matched recorded PCM and serialized DSP state; all 80 had nonzero PCM. The chain now uses the reusable native engine. | Predicted state carries between frame starts. Missing, reversed and duplicate frames were rejected. This does not prove full audio parity. |
| Offline EP FIFO replay | The same 64/64 and 16/16 nonzero frames matched through the staged FIFO callback; altered PCM was rejected. | Uses replay callbacks, not a live guest FIFO. No audio-parity or speedup claim. |
| Offline EP memory access | 24 synthetic location/value combinations matched the existing DSP JIT backend. The nonzero 64/64 and 16/16 saved frame sequences still matched with program revalidation. | Focused synthetic and captured-state comparisons, not full game-audio parity. |
| Offline EP startup | 2/2 consecutive saved setup frames matched full state without DSP execution. Fresh DSP JIT reference replay also matched 2/2 in separate runs; these frames had no I/O. Changed program, expected state and frame order were rejected. | State parity against the same captures and reference replay, not a performance comparison. Tightly guarded to one captured startup sequence; live HLE still uses JIT. |
| Offline EP startup-to-mixer sequence | 16/16 consecutive frames matched full state and output: two setup frames, the first code-load/mix frame and 13 steady frames. Corrupted PCM and skipped/reordered frames were rejected. | Captured audio was silent. Program identity is offline-only; this does not prove complete playback. |
| First mixer synthetic inputs | DSP JIT and native matched PCM and full state for 52/52 deterministic inputs; 51/52 produced nonzero output. | Focused offline validation, not a game performance comparison. |
| QEMU guest-RAM FIFO test | Passed monitor and AC97 paths, split-page output and invalid late-span checks. | Focused QEMU RAM test; not full live-path or game-audio validation. |
| Offline GP gain captures | 80/80 full CPU and memory-state pairs matched across 16 private files; all 80 inputs and outputs were nonzero, with zero rejections or mismatches. | Both states' full program SHA-256 values were checked. Identity checks do not establish hardware correctness. The private pair format is host-ABI-specific. |
| Offline GP multiply-accumulate captures | 192/192 full-state pairs matched across 16 private files, all with nonzero input and output. | Program identity was verified. This is an offline JIT-free harness, not proof of game compatibility or speedup. |
| Offline GP frame-entry projection | 16/16 captured entry states and 16/16 mixed native/stepped full frames matched. The latter still required 30,980 DSP steps. | Worktree-only and offline; full bypass remains unfinished. |
| Offline GP frame-counter projection | 16/16 full-state cases and 16/16 mixed full frames matched, with 16 native counter calls and 30,948 DSP steps still required. Test cost: 0.745 s CPU, 0.768 s wall, 30,836 KiB peak RSS. | Worktree-only, offline and not performance or hardware proof. |
| Offline GP frame DMA setup | After fixing A0/A2 clearing, 16/16 full-state cases with nonzero A0/A2 and 16/16 mixed frames matched; mixed frames still needed 30,884 DSP steps. The 48-process rerun used 0.961 s CPU, 1.068 s wall and 150,276 KiB maximum child peak RSS. | At that stage strict replay stopped at unhandled 0x112 with zero DSP steps. Offline only; no hardware or speedup proof. |
| Offline GP DMA handoff | 16/16 state cases and 16/16 mixed frames matched; mixed frames still needed 30,820 DSP steps. The 48-process check used 0.958 s CPU, 1.059 s wall and 150,520 KiB maximum child peak RSS. | At that stage strict replay executed 16 native DMA sequences with 16 transactions and zero DSP steps, then stopped at 0x120. JIT is still used for test state and remaining operations; no hardware or speedup proof. |
| Offline GP DMA completion | 16/16 full-state pairs and 16/16 mixed frames matched the JIT reference; mixed frames still needed 30,740 DSP steps. The 48-process check used 0.938 s CPU, 1.034 s wall and 150,588 KiB maximum child peak RSS. | At that stage strict replay used zero DSP steps and stopped at 0x12c. Offline only; no hardware or speedup proof. |
| Offline GP frame return, earlier zero path | 16/16 full-state pairs and 16/16 mixed frames matched; mixed frames still needed 30,644 DSP steps. The 48-process check used 0.927 s CPU, 1.019 s wall and 150,344 KiB maximum child peak RSS. | Strict replay used zero DSP steps to this point and stopped at 0x33. Offline only; no hardware or speedup proof. |
| Offline GP frame return, expanded paths | 16/16 zero states and mixed frames, plus 16,512/16,512 synthetic nonzero states, matched the stepped DSP. The 48-process check used 2.951 s CPU, 3.064 s wall and 150,248 KiB maximum child peak RSS. | Nonzero X:4 reaches 0x66; zero reaches 0x33. At that stage strict frames stopped at 0x33 with zero DSP steps; mixed frames still needed 30,644 steps. No hardware or speedup proof. |
| Offline GP filter-entry handoff | 16/16 captured states, 4,096/4,096 synthetic control/address states and 16/16 mixed frames matched; mixed frames still needed 30,484 DSP steps. Test cost: 2.310 s CPU, 2.410 s wall, 150,476 KiB maximum child peak RSS. | Odd X:0x84 path only; even values rejected. At that stage strict replay stopped at 0x185 before a native filter call. Offline only; no hardware or speedup proof. |
| Offline GP first-filter bridge | Start and tail each matched 16/16 captured states and 2,048/2,048 synthetic cases; 16/16 mixed frames matched with 29,524 DSP steps remaining. The 64-process test used 3.598 s CPU, 3.717 s wall and 150,232 KiB maximum child peak RSS. | At that stage strict replay completed the first 32-sample filter with zero DSP steps, then stopped at 0x1c4. JIT remains the offline state/reference backend; no hardware or speedup proof. |
| Offline GP eight-channel filters | 112/112 transitions, 112/112 first-sample and 112/112 tail states matched; 128 synthetic variants each produced 43,008 full-state matches. 16/16 mixed frames matched with 21,684 DSP steps remaining. Test cost: 27.168 s CPU, 27.501 s wall, 150,892 KiB maximum child peak RSS. | At that stage strict replay completed 8 filters and 7 active transitions per frame across 16 frames, zero DSP steps, then stopped at 0x417. 288 filter calls had nonzero output. Inactive channels, hardware and full DSP-free playback remain unproven. |
| Offline GP meter entry | 16/16 captured and 4,096/4,096 synthetic states matched, including odd and even controls; 16/16 mixed frames matched with 21,444 DSP steps remaining. Test cost: 2.773 s CPU, 2.878 s wall, 150,888 KiB maximum child peak RSS. | That strict replay completed eight filters and the first native meter per frame with zero DSP steps, then stopped at 0x43e. Offline JIT reference; no hardware or speedup proof. |
| Offline GP meter transition | 80/80 captured pairs and 20,480/20,480 varied states matched six stepped DSP JIT instructions per case. The 80-process test used 5.650 s CPU, 5.682 s wall and 30,596 KiB maximum child peak RSS. | At that stage strict partial-frame assertions passed for 16/16 saved frames, then stopped at final meter exit 0x43e. No complete strict-frame, hardware or speedup proof. |
| Offline GP final meter exit | 16/16 saved pairs and 4,096/4,096 varied states matched four stepped DSP JIT instructions. 16/16 mixed full frames matched with 20,900 DSP steps remaining. The 48-process test used 1.395 s CPU, 1.422 s wall and 31,116 KiB maximum child peak RSS. | At that stage 16/16 strict partial frames passed six meter calls, five transitions and one final exit each with zero DSP steps, then stopped at 0x422. No complete HLE, hardware or speedup proof. |
| Offline GP post-meter dispatch | 16/16 saved and 4,096/4,096 varied states matched 13 stepped DSP JIT instructions. 16/16 mixed frames matched with 20,692 DSP steps remaining. The 48-process test used 2.146 s CPU, 2.170 s wall and 31,216 KiB maximum child peak RSS. | Only X:0x1df = 3 is supported. At that stage 16/16 strict partial frames reached a second native DMA stop/freeze with zero DSP instructions, then stopped at 0x8d9. No hardware or speedup proof. |
| Offline GP post-meter DMA return | 16/16 saved pairs and 4,096/4,096 varied states matched four stepped DSP JIT instructions. 16/16 mixed frames matched with 20,628 DSP steps remaining. The 48-process test used 1.426 s CPU, 1.451 s wall and 31,276 KiB maximum child peak RSS. |
16/16 strict partial frames executed the return and second DMA sequence, with 32–33 sequence transactions per frame and zero DSP steps, then stopped at 0x8e7. Nonzero accumulator upper bits, changed instructions and DMA not stopped/frozen are rejected. No hardware or speedup proof. |
| Offline GP native-state replay |
16/16 saved partial-frame snapshots, errors, stats and ordered DMA I/O matched the separate JIT reference; both stopped at 0x8e7 at that stage. Combined test: 0.427 s CPU, 0.438 s wall, 27,608 KiB maximum child peak RSS. |
Candidate constructs no DSP JIT and executes zero DSP steps. An earlier test wrongly required 32 transactions for every frame and failed on a frame with 33; the corrected test passed all 16. Not complete frames, live audio or a speed comparison. |
| Offline GP DMA-to-gain | 16/16 saved and 4,096/4,096 varied states matched a 12-instruction JIT reference; 16/16 native-state partial-frame comparisons matched without candidate JIT. 16/16 mixed full frames matched with 20,436 DSP steps remaining. The 80-process test used 2.189 s CPU, 2.226 s wall and 30,988 KiB maximum child peak RSS. | At that stage strict replay executed the first native gain, then stopped at 0x498. Live HLE remains JIT-backed; no hardware or speedup proof. |
| Offline GP first gain return | 16/16 captured and 4,096/4,096 varied states matched two stepped JIT instructions; 16/16 JIT-free candidate partial-frame comparisons and 16/16 mixed full frames matched. Mixed frames still needed 20,404 DSP steps. The 80-process test used 1.619 s CPU, 1.663 s wall and 31,032 KiB maximum child peak RSS. | At that stage each strict partial frame executed two native gain blocks and zero candidate DSP steps, then stopped at the then-unsupported second return site 0x498. No hardware or speedup proof. |
| Offline GP gain-to-feedback | 16/16 captured and 4,096/4,096 varied states matched six stepped JIT instructions; 16/16 JIT-free candidate partial frames and 16/16 mixed full frames matched. Mixed frames still needed 20,308 DSP steps. The 80-process test used 2.165 s CPU, 2.203 s wall and 31,100 KiB maximum child peak RSS. | At that stage partial replay executed two native gain blocks and one feedback operation, then stopped at 0x792. Live HLE remains JIT-backed; no hardware or speedup proof. |
| Offline GP first feedback return | 16/16 captured and 4,096/4,096 varied states matched two stepped JIT instructions; 16/16 JIT-free candidate partial frames and 16/16 mixed full frames matched. Mixed frames still needed 20,276 DSP steps. The 80-process test used 1.649 s CPU, 1.687 s wall and 31,092 KiB maximum child peak RSS. | At that stage partial replay executed two native gain and two feedback blocks with zero candidate DSP steps, then stopped at the second return site 0x792. No hardware or speedup proof. |
| Offline GP feedback-to-copy and stride copy | Each matched 16/16 captured and 4,096/4,096 varied states against 11 and 32 stepped JIT instructions, respectively. 16/16 native-state partial frames and 16/16 mixed full frames matched; mixed frames needed 19,588 DSP steps. The 96-process test used 3.091 s CPU, 3.147 s wall and 31,068 KiB maximum child peak RSS. | At that stage partial frames stopped at 0x60a without candidate JIT. Copy is guarded to the tested alias-buffer range and matching state. No hardware or speedup proof. |
| Offline GP copy acknowledgement and mix setup | Each matched 16/16 saved pairs and 4,096/4,096 variants against four and 15 stepped DSP instructions. 16/16 native-state partial comparisons and 16/16 mixed full frames matched; mixed frames needed 19,284 DSP steps. The 96-process test used 4.189 s CPU, 4.247 s wall and 31,088 KiB maximum child peak RSS. | At that stage partial replay stopped at 0x5a9 without candidate DSP steps. Initial guard accepted one frame and safely rejected 15; after widening to observed controls 0xce–0xdd, all passed. No hardware or speedup proof. |
| Offline GP interpolation/mix loop | 16/16 captured and 4,096/4,096 bounded synthetic states matched 42 stepped JIT instructions; an extra extreme passed and one unqualified difference was rejected. 16/16 partial comparisons and 16/16 mixed full frames matched; mixed frames needed 18,612 DSP steps. Test cost: 2.438 s CPU, 2.485 s wall, 30,924 KiB maximum child peak RSS. | At that stage partial replay stopped at 0x5b1 without candidate JIT. Overlap and unqualified clipping/delta are rejected. No hardware or speedup proof. |
| Offline GP mix-end control | 16/16 captured and 4,096/4,096 synthetic states matched eight stepped JIT instructions, including both branches. 16/16 JIT-free partial comparisons and 16/16 mixed full frames matched; mixed frames needed 18,484 DSP steps. Test cost: 2.239 s CPU, 2.275 s wall, 30,864 KiB maximum child peak RSS. | At that stage strict partial replay stopped at 0x4e2 in 15 frames and 0x501 in one. Synthetic validation exposed and fixed a carry-flag mismatch. No hardware or speedup proof. |
| Offline GP control and gain ramp | Setup and ramp each matched 13/13 captured and 3,328/3,328 varied states; 16/16 JIT-free partial comparisons and mixed full frames matched, with 17,247 DSP steps remaining. The 90-process test used 3.189 s CPU, 3.237 s wall and 31,276 KiB maximum child peak RSS. | Initial guard admitted 5/13 entries; expanded tested guards admitted all 13. At that stage partial frames stopped 13×0x4f9, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP ramp to add | 13/13 captured and 3,328/3,328 varied states matched 10 stepped JIT operations; 16/16 JIT-free partial comparisons and mixed full frames matched, with 17,097 DSP steps remaining. The 77-process test used 2.536 s CPU, 2.577 s wall and 31,016 KiB maximum child peak RSS. | At that stage thirteen partial frames executed the handoff and native add, then stopped at 0x4a6; two stopped at 0x4e2, one at 0x501. No hardware or speedup proof. |
| Offline GP add continuation and MAC setup | Each matched 13/13 saved pairs and 3,328/3,328 varied states; 16/16 native-versus-JIT partial and mixed full frames matched, with 16,729 DSP steps remaining. Combined test: 3.540 s CPU, 3.599 s wall, 31,116 KiB maximum child peak RSS. | The partial run recorded 52 adds, 39 continuations and 13 MAC operations; stops were 13×0x49f, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP MAC continuation | 3,328/3,328 varied states across 13 captured starts matched; 16/16 native-versus-JIT partial and mixed full frames matched, with 16,489 DSP steps remaining. Combined test: 1.941 s CPU, 1.983 s wall, 30,976 KiB maximum child peak RSS. | At that stage strict runs recorded 39 continuations and 52 MAC operations; stops were 13× final 0x49f, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP MAC final exit | 3,328/3,328 varied states across 13 saved starts matched two stepped JIT instructions; 16/16 native-versus-JIT partial and mixed full frames matched, with 16,457 DSP steps remaining. Combined test: 1.388 s CPU, 1.430 s wall, 31,108 KiB maximum child peak RSS. | At that stage strict runs recorded 13 final calls; stops were 13×0x625, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP second MAC setup | 3,328/3,328 varied states across 13 saved starts matched 11 stepped JIT instructions; 16/16 JIT-free partial and mixed full frames matched, with 16,281 DSP steps remaining. Combined test: 2.828 s CPU, 2.870 s wall, 31,124 KiB maximum child peak RSS. | Strict frames recorded 13 setups and 65 MAC calls; stops were 13× next 0x49f, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP nested MAC continuation | 3,328/3,328 varied states across 13 saved starts matched six stepped JIT instructions; 16/16 JIT-free partial and mixed full frames matched, with 15,897 DSP steps remaining. Combined test: 1.964 s CPU, 2.002 s wall, 31,040 KiB maximum child peak RSS. | Strict frames recorded 13 nested returns and 78 MAC calls; stops were 13× next nested exit 0x49f, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP outer MAC continuation | 3,328/3,328 varied states across 13 saved starts matched eight stepped JIT instructions; 16/16 JIT-free partial and mixed full frames matched, with 15,513 DSP steps remaining. Combined test: 2.369 s CPU, 2.407 s wall, 31,064 KiB maximum child peak RSS. | Fuzz exposed and corrected a pointer assumption. Strict frames recorded 39 outer returns, 52 nested returns and 156 MAC calls; stops were 13× final outer exit 0x49f, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP outer MAC final exit | 3,328/3,328 varied states across 13 saved starts matched three stepped DSP instructions; 16/16 JIT-free partial and mixed full frames matched, with 15,465 DSP steps remaining. Combined test: 1.515 s CPU, 1.556 s wall, 31,092 KiB maximum child peak RSS. | Strict frames recorded 13 final exits and 156 MAC calls; stops were 13×0x637, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP three-pointer mix | Setup and loop each matched 3,328/3,328 varied states from 13 starts against five and 64 stepped DSP instructions; 16/16 partial and mixed full frames matched, with 12,313 DSP steps remaining. Combined test: 2.666 s CPU, 2.716 s wall, 30,956 KiB maximum child peak RSS. | Strict frames recorded 13 setup/loop calls and stopped 13×0x4ad, 2×0x4e2, 1×0x501. Clipping and output/input overlap rejected. No hardware or speedup proof. |
| Offline GP mix return handoffs | Each matched 3,328/3,328 varied states from 13 starts against four stepped JIT instructions; 16/16 JIT-free partial and mixed full frames matched, with 12,185 DSP steps remaining. Combined test: 2.521 s CPU, 2.568 s wall, 31,152 KiB maximum child peak RSS. | Strict totals: 13 each handoff, 26 mix blocks, 65 add blocks. Stops: 13×0x4a6, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP post-mix add returns | 9,984/9,984 varied states across 13 starts and three phases matched stepped JIT; 16/16 JIT-free partial and mixed full frames matched, with 12,041 DSP steps remaining. Combined test: 2.201 s CPU, 2.241 s wall, 30,968 KiB maximum child peak RSS. | Strict totals: 39 post-mix returns, 104 add blocks. Stops: 13× next 0x4a6, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP add-to-mix handoff | 3,328/3,328 varied states across 13 starts matched six stepped JIT instructions; 16/16 JIT-free partial and mixed full frames matched, with 11,945 DSP steps remaining. Combined test: 2.018 s CPU, 2.058 s wall, 31,232 KiB maximum child peak RSS. | Strict totals: 13 handoffs, 39 mix blocks. Stops: 13×0x4ad, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP mix-to-gain handoff | 3,328/3,328 varied states across 13 starts matched four stepped DSP instructions; 16/16 JIT-free partial and mixed full frames matched, with 11,881 DSP steps remaining. Combined test: 1.626 s CPU, 1.672 s wall, 31,356 KiB maximum child peak RSS. | Strict totals: 13 handoffs, 45 gain calls. Stops: 13×0x498, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP post-mix gain returns | 6,656/6,656 varied states across 13 starts and two phases matched stepped JIT; 16/16 JIT-free partial and mixed full frames matched, with 11,785 DSP steps remaining. Combined test: 1.830 s CPU, 1.866 s wall, 31,092 KiB maximum child peak RSS. | Strict totals: 26 return calls, 71 gain blocks. Stops: 13× next 0x498, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP post-gain add handoffs | 6,656/6,656 varied states across 13 starts and two phases matched stepped JIT; 16/16 JIT-free partial and mixed full frames matched, with 11,689 DSP steps remaining. Combined test: 1.906 s CPU, 1.953 s wall, 30,836 KiB maximum child peak RSS. | Strict totals: 26 handoffs, 130 add blocks. Stops: 13× next 0x4a6, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP post-gain copy | Setup and loop each matched 3,328/3,328 varied cases across 13 starts against five and 32 stepped DSP instructions; 16/16 JIT-free partial and mixed full frames matched, with 10,073 DSP steps remaining. Combined test: 2.219 s CPU, 2.261 s wall, 31,276 KiB maximum child peak RSS. | Strict totals: 13 setups and 13 copies. Stops: 13×0x492, 2×0x4e2, 1×0x501. Loop tests included overlap, self-copy and aliases. No hardware or speedup proof. |
| Offline GP post-gain copy continuation | 3,328/3,328 varied cases across 13 starts matched three stepped DSP instructions; 16/16 JIT-free partial and mixed full frames matched, with 10,025 DSP steps remaining. Combined test: 1.760 s CPU, 1.799 s wall, 31,128 KiB maximum child peak RSS. | Strict totals: 13 handoffs and 26 copies. Stops: 13× next 0x492, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP copy to feedback | 3,328/3,328 varied cases across 13 starts matched six stepped DSP instructions; 16/16 JIT-free partial and mixed full frames matched, with 9,929 DSP steps remaining. Combined test: 1.833 s CPU, 1.871 s wall, 31,152 KiB maximum child peak RSS. | Strict totals: 13 handoffs and 45 feedback calls. Stops: 13× next 0x792, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP post-copy feedback returns | 6,656/6,656 varied states across 13 starts and two phases matched stepped JIT; 16/16 JIT-free partial and mixed full frames matched, with 9,705 DSP steps remaining. Combined test: 2.798 s CPU, 2.846 s wall, 31,072 KiB maximum child peak RSS. | Strict totals: 26 handoffs and 71 feedback calls. Stops: 13× next 0x792, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP feedback loop returns | 9,984/9,984 varied states across 13 starts and three phases matched stepped JIT; 16/16 JIT-free partial and mixed full frames matched, with 9,529 DSP steps remaining. Combined test: 2.540 s CPU, 2.576 s wall, 31,132 KiB maximum child peak RSS. | Strict totals: 39 loop returns and 97 feedback calls. Stops: 13×0x697, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP feedback to matrix | 3,328/3,328 varied states across 13 starts matched seven stepped DSP instructions; 16/16 JIT-free partial and mixed full frames matched, with 9,417 DSP steps remaining. Combined test: 2.055 s CPU, 2.092 s wall, 31,104 KiB maximum child peak RSS. | Strict totals: 13 handoffs and 13 matrix calls. Stops: 13×0x6ae, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP matrix loop returns | 13,312/13,312 varied states across 13 starts and four phases matched stepped JIT; 16/16 JIT-free partial and mixed full frames matched, with 9,305 DSP steps remaining. Combined test: 1.996 s CPU, 2.036 s wall, 31,028 KiB maximum child peak RSS. | Strict totals: 52 loop returns and 52 matrix calls. Stops: 13×0x6af, 2×0x4e2, 1×0x501. No hardware or speedup proof. |
| Offline GP matrix-to-add setup | 13/13 captured and 3,328/3,328 varied states matched; 16/16 JIT-free partial and mixed full frames matched. | Combined test: 2.622 s CPU, 2.668 s wall, 31,156 KiB max child RSS; mixed frames still needed 9,241 DSP steps. Not a speed comparison. |
| Offline GP matrix add returns | 13,312/13,312 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 3.913 s CPU, 3.970 s wall, 31,124 KiB max child RSS; mixed frames still needed 9,017 DSP steps. Not a speed comparison. |
| Offline GP matrix-to-feedback setup | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 4.784 s CPU, 4.842 s wall, 31,096 KiB max child RSS; mixed frames still needed 8,905 DSP steps. Not a speed comparison. |
| Offline GP matrix feedback returns | 13,312/13,312 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 6.150 s CPU, 6.210 s wall, 31,200 KiB max child RSS; mixed frames still needed 8,681 DSP steps. Not a speed comparison. |
| Offline GP matrix feedback to copy | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 6.773 s CPU, 6.833 s wall, 31,104 KiB max child RSS; mixed frames needed 8,617 DSP steps. Not a speed comparison. |
| Offline GP matrix copy return | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 7.197 s CPU, 7.256 s wall, 31,136 KiB max child RSS; mixed frames needed 8,537 DSP steps. Not a speed comparison. |
| Offline GP matrix mixer dispatch | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 8.068 s CPU, 8.136 s wall, 30,936 KiB max child RSS; mixed frames needed 8,393 DSP steps. Not a speed comparison. |
| Offline GP matrix mixer continuation | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 9.411 s CPU, 9.475 s wall, 31,136 KiB max child RSS; mixed frames needed 8,169 DSP steps. Not a speed comparison. |
| Offline GP second mixer to copy | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 10.432 s CPU, 10.521 s wall, 31,216 KiB max child RSS; mixed frames needed 8,025 DSP steps. Not a speed comparison. |
| Offline GP duplicate-sample copy | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 10.559 s CPU, 10.637 s wall, 31,196 KiB max child RSS; mixed frames needed 4,953 DSP steps. Not a speed comparison. |
| Offline GP duplicate-copy return | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 11.229 s CPU, 11.310 s wall, 31,312 KiB max child RSS; mixed frames needed 4,825 DSP steps. Not a speed comparison. |
| Offline GP post-duplicate add returns | 6,656/6,656 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 12.545 s CPU, 12.631 s wall, 31,680 KiB max child RSS; mixed frames needed 4,649 DSP steps. Not a speed comparison. |
| Offline GP second duplicate-copy return | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 13.074 s CPU, 13.166 s wall, 31,408 KiB max child RSS; mixed frames needed 4,521 DSP steps. Not a speed comparison. |
| Offline GP second post-duplicate add returns | 6,656/6,656 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 14.340 s CPU, 14.434 s wall, 31,384 KiB max child RSS; mixed frames needed 4,345 DSP steps. Not a speed comparison. |
| Offline GP third duplicate-copy return | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 14.903 s CPU, 14.985 s wall, 31,480 KiB max child RSS; mixed frames needed 4,217 DSP steps. Not a speed comparison. |
| Offline GP third post-duplicate add returns | 6,656/6,656 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 16.045 s CPU, 16.128 s wall, 31,408 KiB max child RSS; mixed frames needed 4,041 DSP steps. Not a speed comparison. |
| Offline GP fourth duplicate-copy return | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 16.732 s CPU, 16.823 s wall, 31,148 KiB max child RSS; mixed frames needed 3,913 DSP steps. Not a speed comparison. |
| Offline GP final post-duplicate add returns | 6,656/6,656 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 17.512 s CPU, 17.584 s wall, 31,356 KiB max child RSS; mixed frames needed 3,785 DSP steps. Not a speed comparison. |
| Offline GP later DMA return | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 18.056 s CPU, 18.158 s wall, 31,336 KiB max child RSS; mixed frames needed 3,721 DSP steps. Not a speed comparison. |
| Offline GP late DMA wait entry | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 18.345 s CPU, 18.437 s wall, 31,556 KiB max child RSS; mixed frames needed 3,689 DSP steps. At that stage the wait remained unimplemented; not a speed comparison. |
| Offline GP late DMA completion | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 18.527 s CPU, 18.619 s wall, 31,480 KiB max child RSS; mixed frames needed 3,593 DSP steps. Incomplete transfer rejected; not a speed comparison. |
| Offline GP post-DMA audio entry | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 19.257 s CPU, 19.346 s wall, 31,620 KiB max child RSS; mixed frames needed 3,385 DSP steps. Not a speed comparison. |
| Offline GP post-DMA delay setup | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 20.416 s CPU, 20.515 s wall, 31,640 KiB max child RSS; mixed frames needed 3,145 DSP steps. Not a speed comparison. |
| Offline GP post-DMA next delay | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 22.013 s CPU, 22.114 s wall, 31,672 KiB max child RSS; mixed frames needed 2,857 DSP steps. Not a speed comparison. |
| Offline GP post-DMA final delay return | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 22.510 s CPU, 22.611 s wall, 31,352 KiB max child RSS; mixed frames needed 2,697 DSP steps. Not a speed comparison. |
| Offline GP decimation setup | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 5.962 s CPU, 5.997 s wall, 30,948 KiB max child RSS; mixed frames needed 2,601 DSP steps. Tests ran alongside the unit suite; not a speed comparison. |
| Offline GP decimation DMA handoff | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 6.547 s CPU, 6.594 s wall, 30,892 KiB max child RSS; mixed frames needed 2,521 DSP steps. Not a speed comparison. |
| Offline GP decimation DMA stop call and return | 3,328/3,328 varied states per handoff and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 6.812 s CPU, 6.864 s wall, 30,728 KiB max child RSS; mixed frames needed 2,489 DSP steps. Not a speed comparison. |
| Offline GP decimation DMA descriptor setup | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 7.053 s CPU, 7.103 s wall, 31,104 KiB max child RSS; mixed frames needed 2,441 DSP steps. Not a speed comparison. |
| Offline GP decimation DMA completion | 3,328/3,328 varied states per handoff and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 7.466 s CPU, 7.508 s wall, 30,988 KiB max child RSS; mixed frames needed 2,329 DSP steps. Not a speed comparison. |
| Offline GP next decimation channel | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 8.458 s CPU, 8.504 s wall, 31,156 KiB max child RSS; mixed frames needed 2,137 DSP steps. Not a speed comparison. |
| Offline GP second-channel DMA | 3,328/3,328 varied states per stage and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 9.797 s CPU, 9.847 s wall, 31,084 KiB max child RSS; mixed frames needed 1,865 DSP steps. Not a speed comparison. |
| Offline GP third decimation channel | 3,328/3,328 varied states per stage and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 12.193 s CPU, 12.245 s wall, 31,288 KiB max child RSS; mixed frames needed 1,401 DSP steps. Not a speed comparison. |
| Offline GP fourth decimation channel | 3,328/3,328 varied states per stage and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 14.506 s CPU, 14.556 s wall, 31,144 KiB max child RSS; mixed frames needed 937 DSP steps. Not a speed comparison. |
| Offline GP decimation frame exit | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 14.648 s CPU, 14.694 s wall, 31,276 KiB max child RSS; mixed frames needed 889 DSP steps. Not a speed comparison. |
| Offline GP frame-tail counter | 3,328/3,328 varied states and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 15.056 s CPU, 15.103 s wall, 31,404 KiB max child RSS; mixed frames needed 841 DSP steps. Counter values other than zero are rejected. Not a speed comparison. |
| Offline GP frame-tail comparison and two DMA transfers | 3,328/3,328 varied states per stage and 16/16 JIT-free partial and mixed full frames matched. | Combined test: 17.319 s CPU, 17.379 s wall, 31,388 KiB max child RSS; mixed frames needed 345 DSP steps. Not a speed comparison. |
| Offline GP frame-tail finish and halt | 3,328/3,328 varied states per stage; 13/16 JIT-free candidate frames completed with recorded state and I/O matching. All 16/16 mixed frames matched. | Combined test: 17.944 s CPU, 18.002 s wall, 31,888 KiB max child RSS; mixed frames needed 153 DSP steps. Not a speed comparison. |
Offline GP special controls 0x100 and zero |
256/256 varied states per control; 15/16 JIT-free candidate frames completed with recorded state and I/O matching. All 16/16 mixed frames matched. | Combined test: 18.289 s CPU, 18.355 s wall, 32,008 KiB max child RSS; mixed frames needed 113 DSP steps. Not a speed comparison. |
Offline GP control 0x80
|
Entry 256/256, effect 512/512, ramp setup 256/256 and signed ramp 256/256 varied cases matched. All 16/16 saved frames completed with zero candidate DSP steps. | Focused campaign: 1.128 s CPU, 1.161 s wall, 30,392 KiB max child RSS; includes a 4,096-iteration alias case and a 4,097-iteration rejection. Not a speed comparison. |
| Strict offline GP replay, earlier run |
0/16 saved frames completed: each stopped at unhandled PC 0x2b, before any DSP steps or native operations. Combined test: 0.206 s CPU, 0.211 s wall, 27,252 KiB peak RSS. |
--replay-gp-hle-strict stops instead of stepping the DSP when a projection is missing. It still constructs a JIT backend for state and DMA. This is not playback or performance evidence; full DSP bypass remains unfinished. |
| OpenAL loopback | Cloud and Deck each matched all 192 gain outputs. | A standalone probe can reproduce this simple gain case. No game or performance benefit is established. |
These runs execute both the DSP JIT reference and the native candidate. Rejected cases are unsupported, not passes. Resource figures cover the combined run and are not a speed comparison.
Latest follow-up results after the GP clipping fixes:
| Workload | Matched / attempted | Rejected / mismatched | Combined CPU | Wall | Sampled peak RSS |
|---|---|---|---|---|---|
| EP startup mixer | 4,096 / 4,096 | 0 / 0 | 26.089 s | 26.172 s | 31,412 KiB |
| EP mixer after DSP VM conversion roundtrip | 4,096 / 4,096; 4,095 nonzero outputs | 0 / 0 | 26.175 s | 26.283 s | 32,068 KiB |
| GP gain, 16 captured entries | 4,096 / 4,096 | 0 / 0 | 1.187 s | 1.241 s | 29,344 KiB |
| GP multiply-accumulate, one synthetic entry | 4,096 / 4,096 | 0 / 0 | 0.764 s | 0.767 s | 29,952 KiB |
| GP decimation, updated generator, one synthetic entry | 4,096 / 4,096 | 0 / 0 | 2.497 s | 2.507 s | 30,452 KiB |
| GP decimation, historical run, four program counters | 3,072 / 4,096 | 1,024 / 0 | 3.587 s | 3.728 s | 30,528 KiB |
The updated decimation run covers all 36 gain/phase combinations at one synthetic entry and executed 855,984 DSP steps. Its resource figures are combined validation costs, not a speed comparison. The historical four-counter run covered all six phases but coupled each phase to one gain; it did not cover the full cross-product and is superseded for the updated code. Its CPU and wall totals sum separate process times, and RSS is the maximum sampled process peak. The gain totals use the same resource accounting. Older campaigns remain below for traceability.
The EP VM-conversion test round-tripped both JIT and native DSP states before comparing PCM and complete state from one captured startup entry. Some test jobs ran concurrently. It is separate from the earlier no-roundtrip run and does not test a full machine save/load.
| Workload | Matched / attempted | Rejected / mismatched | User + system CPU | Wall | Sampled peak RSS |
|---|---|---|---|---|---|
| EP startup mixer | 4,096 / 4,096; 4,095 nonzero outputs | 0 / 0 | 24.725 + 1.364 s | 26.172 s | 31,412 KiB |
| GP gain | 4,095 / 4,096 | 1 / 0 | 0.842 + 0.060 s | 0.915 s | 29,116 KiB |
| GP multiply-accumulate | 3,754 / 4,096 | 342 / 0 | 0.727 + 0.048 s | 0.788 s | 29,864 KiB |
The EP inputs covered 8 boundaries, 10 isolated front/center/rear channels, 5 impulses, 5 clipping patterns, 8 front/rear phase patterns, 32 inputs decoded from synthetic mono/stereo Xbox ADPCM blocks, and 4,028 random cases. Separate existing voice and resampler tests passed 33 subtests for mono/stereo PCM/ADPCM, voice completion and notifier transitions, and converters; they are not DSP/HLE comparisons.
| Separate voice test suite | Coverage and result | CPU | Wall | Sampled peak RSS |
|---|---|---|---|---|
| VP state | 8/8 subtests, including 600 combinations: mono/stereo PCM/ADPCM × 15 buffer lengths × 5 pitches × 2 converters; completion and notification assertions. | 0.066 s | 0.144 s | 26,764 KiB |
| VP throughput and voice | 25/25 subtests, including mono/stereo ADPCM, mono PCM, changing encoded data and different worker counts. | 2.442 s | 1.333 s | 46,144 KiB |
The throughput test is multithreaded, so combined CPU can exceed wall time. These tests do not establish hardware or Dolby correctness or performance gains.
The following separate GP stress run used 16 captured entry states per operation and 256 synthetic inputs per state. Rejections remain unhandled, not passes; CPU and wall times are summed across processes, and RSS is the maximum sampled process peak.
| Operation | Matched / attempted | Rejected / mismatched | JIT instructions | CPU | Summed wall | Max sampled RSS |
|---|---|---|---|---|---|---|
| Gain | 4,080 / 4,096 | 16 / 0 | 200,704 | 1.180 s | 1.217 s | 30,236 KiB |
| Multiply-accumulate | 3,696 / 4,096 | 400 / 0 | 262,144 | 1.019 s | 1.072 s | 30,260 KiB |
The oracle is xemu's JIT, not physical Xbox hardware. Phase patterns do not validate Dolby decoding or 5.1 output. These checks cover one EP program and selected GP operations; coverage is incomplete and live HLE remains JIT-backed.
These are different workloads, not one benchmark. CPU percentages use one CPU core as 100%; a multithreaded process can exceed 100%. RSS is resident memory. Changes below are candidate minus baseline; negative means less CPU time or memory.
| Workload and metric | Baseline | Candidate | Change | Limit |
|---|---|---|---|---|
| Deck synthetic gain, CPU per block | DSP 7.673 µs | Native 1.449 µs | −81.11% | Fixed output/export work; not full DSP state or game performance. |
| Deck synthetic gain, peak RSS | DSP 28,624 KiB | Native 21,258 KiB | −25.73% | Separate workers; the live hybrid still retains the DSP. |
| Deck whole-emulator shadow fixture, CPU time | Shadow off 18.449 s | Shadow on 18.543 s | +0.51% | Four runs per mode; ranges overlap and an interruption limits the result. |
| Deck whole-emulator shadow fixture, sampled peak RSS | Shadow off 633,564 KiB | Shadow on 630,956 KiB | −0.41% | Not evidence of a memory saving. |
| Earlier Deck timer-paced audio fixture, process CPU | JIT 120.90% of one core | HLE 117.70% | −3.20 percentage points | Four runs per mode on an older implementation; not a game comparison. |
| Earlier Deck timer-paced audio fixture, peak RSS | JIT 633,508 KiB | HLE 628,146 KiB | −0.85% | Synthetic fixture; no demonstrated game memory saving. |
| Offline EP mixer on Ryzen AI Max+ 395/Linux, CPU | No matched DSP baseline | Native 2.6056 µs per 256-stereo-frame block | Not comparable | One nonzero captured fixture; five runs of 200,000 repeats; startup excluded. |
| Offline EP mixer on the same host, median sampled peak RSS | No matched DSP baseline | Native 1,612 KiB | Not comparable | Standalone runner only; no game memory-saving claim. |
| Offline chained EP replay, CPU | No matched DSP baseline | Native 35.93 µs per 256-stereo-frame block | Not comparable | Five runs of 100 repeats over the 64-frame sequence. Includes identity, guards and state comparison; excludes capture loading and startup. |
| Offline chained EP replay, median sampled peak RSS | No matched DSP baseline | 29,928 KiB | Not comparable | Whole linked test process; no DSP JIT executed and no game memory-saving claim. |
| Offline EP engine chain, CPU | No matched DSP baseline | Native 35.00 µs per 256-stereo-frame block | Not comparable | Five runs of 100 repeats over 64 saved frames; includes checks, excludes capture loading. |
| Offline EP engine chain, median sampled peak RSS | No matched DSP baseline | 30,000 KiB | Not comparable | Whole linked capture replay process; no DSP JIT executed and no speedup or game memory-saving claim. |
| Offline EP FIFO chain, CPU | No matched DSP baseline | Native 36.37 µs per 256-stereo-frame block | Not comparable | Five runs of 100 repeats over 64 saved frames; includes validation, excludes capture loading. |
| Offline EP FIFO chain, median sampled peak RSS | No matched DSP baseline | 29,984 KiB | Not comparable | Whole linked replay process; no JIT execution, speedup or game memory-saving claim. |
| Offline EP verified chain, CPU | No matched DSP baseline | Native 36.32 µs per 256-stereo-frame block | Not comparable | Five runs of 100 repeats over 64 frames; includes per-frame program verification, FIFO and full-state checks; excludes capture loading. |
| Offline EP verified chain, median sampled peak RSS | No matched DSP baseline | 30,004 KiB | Not comparable | Whole linked replay process; no DSP execution or speedup claim. |
| Offline EP startup replay, CPU | No matched DSP baseline | Native 30.46 µs per startup frame | Not comparable | Five runs of 1,000 two-frame repeats; includes program hashing and full-state verification; excludes capture loading and startup. |
| Offline EP startup replay, median sampled peak RSS | No matched DSP baseline | 24,416 KiB | Not comparable | Whole linked test process; no DSP execution or speedup claim. |
| Offline 16-frame startup-to-mixer replay, CPU | No matched DSP baseline | Native 34.36 µs per frame | Not comparable | Five runs of 100 repeats; includes validation, excludes file loading and startup. |
| Offline 16-frame startup-to-mixer replay, median sampled peak RSS | No matched DSP baseline | 25,960 KiB | Not comparable | Whole linked test process; no speedup claim. |
| Synthetic guest-RAM FIFO write, CPU | Direct 86.86 ns/write | Staged 115.39 ns/write | +28.52 ns / +32.83% cost | 12 ABBA/BAAB runs per mode, 200,000 writes/run; 1,024-byte FIFO with page/ring wrap and mock dirty callback. Not a DSP/JIT or overall emulator comparison. |
| Offline GP gain on Ryzen AI Max+ 395/Linux, CPU | No matched DSP baseline | Native 0.7893 µs per 16-sample projection | Not comparable | Five runs of 200,000 repeats per pair; fixed input and full state copying included. |
| Offline GP gain on the same host, median sampled peak RSS | No matched DSP baseline | Native 1,776 KiB | Not comparable | Standalone runner; no game memory-saving claim. |
| Offline GP multiply-accumulate on Ryzen AI Max+ 395/Linux, CPU | No matched DSP baseline | Native 0.7797 µs per 16-sample full-state projection | Not comparable | Five runs of 200,000 repeats per captured state; fixed input. |
| Offline GP multiply-accumulate on the same host, median sampled peak RSS | No matched DSP baseline | Native 1,804 KiB | Not comparable | Standalone runner; no game memory-saving claim. |
The EP capture metadata records 8 or 9 DSP slice calls and 8,589–8,783 guest cycles. Each recorded GP gain operation represents 53 guest cycles, and each multiply-accumulate operation 64 guest cycles. Guest cycles are not host CPU time. The standalone EP runner links only libc and does not load or execute the DSP JIT.
Ryzen AI Max+ 395/Linux, 16 captured frames, balanced ABBA/BAAB, two runs per mode. CPU times include startup and JIT compilation. Each comparison changes only the named dispatch; all reported captures matched. Paired percentages are calculated per frame, so they differ from a ratio of the median CPU values.
| Candidate | Median CPU, baseline → candidate | Median paired CPU improvement | Median peak RSS, baseline → candidate | Limitation |
|---|---|---|---|---|
| Meter continuation | 46.594 → 46.068 ms | −0.27%; range −6.86% to +10.51% | 30,866 → 30,872 KiB (+0.02%) | No speedup established. |
| Delay continuation | 45.343 → 46.076 ms | −1.06%; range −6.42% to +5.10% | 30,892 → 30,858 KiB (−0.11%) | No speedup established. |
| Block dispatcher | 45.843 → 45.424 ms | +2.00%; range −8.35% to +8.01% | 30,856 → 31,006 KiB (+0.49%) | No speedup established; initial no-yield Deck run hung. |
Positive paired improvement means lower CPU time. These offline results do not establish game FPS or audio correctness. A separate instrumented PGR2 Deck run measured 200.27% median CPU and 658.39 MiB peak RSS, but has no matched baseline and cannot establish improvement.
The lock-yield diagnostic used bb0de1e40c plus uncommitted tracing and an artificial 100 µs APU unlock/yield. Run 20261103-082131883-066833d926654d8aa07b8a21ee452f67 measured 211.83% median sampled process CPU and 660.81 MiB peak RSS. It was instrumented and has no matched baseline, so these numbers do not establish a speedup or correct game audio.
The later voice-lock handoff used uncommitted changes on bb0de1e40c without an artificial sleep. OpenGL run 20261103-084257190-283e32795fae402ba18379a886814e92 measured 210.54% median sampled CPU and 905.94 MiB peak RSS. Its 48 kHz capture contained 196,608 stereo frames, with 111,576 / 111,577 nonzero samples per channel and zero clipped samples. This establishes signal presence only. There is no matched baseline, audio parity is unverified, and these numbers cannot prove a speedup or be compared across renderers.
See the research evidence archive for exact commits, hashes, run IDs, controls, failures and detailed measurements. Some game captures are private.
- Complete JIT-free GP and EP behavior using the existing captures, including broader code-load behavior, standalone-engine live FIFO integration, GP integration, DMA, interrupts and state; investigate unknown program identities.
- Compare native audio with recorded DSP outputs, including effects and synchronization; retain JIT fallback until behavior is proven.
- Develop matched offline CPU and memory comparisons. XISO timing and game performance remain unqualified; no new live-game campaigns are planned.
- Validate any OpenAL effect against the corresponding Xbox behavior before considering integration.
| Resource | Purpose |
|---|---|
| Capture, replay and differential testing | Record inputs and compare DSP state and outputs offline. |
| Uncommitted offline tools |
scripts/dsp-ep-mix-replay.py batches captures; test-dsp-replay --export-ep-mix exports a fixture; test-xbox-ep-mix-hle --fixture ... --repeat ... runs it without the JIT. |
| Uncommitted GP gain tools |
gp-gain-hle.h separates the gain kernel from JIT state; scripts/dsp-gp-gain-replay.py checks both program identities and runs test-xbox-gp-gain-project without the JIT. |
| Public DSP XISO proof | Run the public guest fixture and replay checks. |
| OpenAL probe instructions | Run the separate loopback experiment. |
| Test-kit issue #383 | DSP testing work and remaining validation. |
| Audio/video synchronization issue #382 | Synchronization work not covered by these tests. |
Captured game programs and audio can contain private data; keep those captures private.
DSP tooling guide and navigation updated November 2, 2026 for experimental PR #384, source 8f51d237. Capture/replay usage and limits.
The earlier wiki-wide review was published November 1, 2026. Emulator source: b7140848. Reviewed wiki content: 1d2b671. Current status · Release availability · Publication process.
- Home
- Current status
- Stable versus main
- Implemented mechanisms
- Controls and defaults
- Measured results and limits
- Complete change register
- System
- CPU and vCPU
- Memory and DMA
- Graphics / NV2A
- APU and audio
- Timing and timers
- Platform and I/O
- Hardware observations
- Fidelity boundaries
- Methodology
- PGR2 routes
- Debugging lag / hot paths
- Tools and commands
- DSP capture, replay and fuzzing
- HLE readiness and public XISO proof
- Concurrent DSP shadow and OpenAL proof
- DSP HLE operation inventory
- DSP HLE fix examples and testing
- Development
- Upstream shortlist
- Wiki maintenance
- Research / retired work
- Optimization catalog
- Hot-path shortcuts
- Researched experiments
- Unproven proposal directory
- PR lessons
- September26 snapshot
Repository · PRs · Issues