diff options
| author | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-30 09:25:40 -0400 |
|---|---|---|
| committer | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-30 09:25:40 -0400 |
| commit | 9a5a1fbdf68859db978b0082f2bd257e6faa60c4 (patch) | |
| tree | 6157b1a63e65045edae016b79fc230f3552cbdfe /src/video_core/texture_cache/texture_cache.h | |
| parent | c7dffce68ad2678c9998045191991e1a6c8b228a (diff) | |
dynarmic: skip untouched locations when an IR instruction ends
Compiling a block is most of what makes Mario Kart World stutter in its
first minute: the game's thread translates ~20,000 blocks in a few
hundred milliseconds when a scene loads, and the frame waits. A CPU
profile of those bursts had ~40% of the compile time in two loops over
all 96 host locations (16 GPRs, 16 XMMs, 64 spill slots) per IR
instruction:
- EndOfAllocScope called ReleaseAll on every location, though an
instruction touches a few. It now skips the ones ReleaseAll would not
change (no references or locks, not scratch, no last use pending, and
values either still live or fully cleared).
- DefineValueImpl checked, with an assert that stays on in release
builds, that the defined value was in no location yet, and afterwards
that it was where it was put. Those scans are DEBUG_ASSERTs now.
Mario Kart World, first 45 s (boot, world map, title, attract demo):
18.5 -> 12.8 us per compiled block; frames over 60 ms 57 -> 31, over
100 ms in the first 600 presents 23 -> 12; frames render as before.
Diffstat (limited to 'src/video_core/texture_cache/texture_cache.h')
0 files changed, 0 insertions, 0 deletions
