diff options
| author | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-30 00:54:19 -0400 |
|---|---|---|
| committer | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-30 00:54:38 -0400 |
| commit | 092c16d6f39b395e7b3e105a42963733bf9de045 (patch) | |
| tree | fd0913c27aa5a40b2d39b1d4e518a4e420462542 /src/video_core/surface.cpp | |
| parent | 59fce4d557a23e33bcd671710ea9f7b292dcdb46 (diff) | |
gpu_split: reset the ring when the split stops
GpuSplit is a static instance and outlives the emulation session. Stop()
joined the back thread but kept the ring positions and engine pointers,
so the next session's back thread started reading at 0 of a new, empty
ring while `published` still held the old session's position: each
empty entry reads as a wrap, the back thread skipped ahead a ring at a
time and never landed on the old position. The front then spun in
Drain(), the next game's first GPU work never ran, and it waited on its
first syncpoint forever (Mario Kart World loaded after another Switch 2
game: syncpoint 2 stuck at 0, waiting for 2). The back thread also held
the previous session's freed engines.
Stop() now drops the ring and resets the positions, the engines and the
front macro mode, so MaybeStart() begins a clean ring.
Diffstat (limited to 'src/video_core/surface.cpp')
0 files changed, 0 insertions, 0 deletions
