mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-27 02:32:02 -04:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user