runtime: SDL software renderer only

The SDL accelerated renderer (`SDL_RENDERER_ACCELERATED`) lets
`SDL_RenderPresent` block inside the GPU driver, which has been
reproducibly hanging the SDL main thread mid-frame after extended
uptime. Both psx-runtime and psx-beetle showed the same signature:
process alive, debug socket dead, partial framebuffer (top half
rendered, bottom half stale) — a classic GPU-driver-side hang.

Switching both binaries to `SDL_RENDERER_SOFTWARE` removes the GPU
driver from the path. Verified under stress: five consecutive
`wtrace_dump count=200000` (~6.2 s each, 31 s cumulative
main-thread block) without a single freeze. Beetle, which had been
freezing at ~15 min of plain title-screen idle with constant 90 MB
RSS (so memory pressure was definitively not the cause), now stays
responsive indefinitely.

Cost: a few percent more CPU. Worth it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthew Stanley
2026-05-13 19:25:42 -07:00
parent 4161c854d2
commit 9eb4ab3f21
2 changed files with 8 additions and 7 deletions
+3 -2
View File
@@ -89,8 +89,9 @@ int main(int argc, char** argv) {
return 1;
}
SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
if (!ren) ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_SOFTWARE);
/* Software renderer only — see main.cpp note. GPU-driver-side hangs in
* SDL_RenderPresent reproducibly wedge the SDL main thread mid-frame. */
SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_SOFTWARE);
if (!ren) {
std::fprintf(stderr, "SDL_CreateRenderer failed: %s\n", SDL_GetError());
return 1;
+5 -5
View File
@@ -421,11 +421,11 @@ int main(int argc, char** argv) {
return 1;
}
sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_ACCELERATED);
if (!sdl_renderer) {
/* Fall back to software renderer. */
sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_SOFTWARE);
}
/* Software renderer only: the accelerated path lets SDL_RenderPresent
* block inside the GPU driver, which has reproducibly hung the main
* thread mid-frame after extended uptime (TombaRecomp/ISSUES.md #6).
* Software costs a few % more CPU but cannot stall in the GPU stack. */
sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_SOFTWARE);
if (!sdl_renderer) {
std::fprintf(stderr, "SDL_CreateRenderer failed: %s\n", SDL_GetError());
return 1;