aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/gpu_split.cpp
diff options
context:
space:
mode:
authorTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-30 09:25:40 -0400
committerTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-30 09:25:40 -0400
commit9a5a1fbdf68859db978b0082f2bd257e6faa60c4 (patch)
tree6157b1a63e65045edae016b79fc230f3552cbdfe /src/video_core/gpu_split.cpp
parentc7dffce68ad2678c9998045191991e1a6c8b228a (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/gpu_split.cpp')
0 files changed, 0 insertions, 0 deletions