From 52edf25fe29b98c2fd4ad0f9919537902fd91bde Mon Sep 17 00:00:00 2001 From: Anonimus Date: Thu, 6 Nov 2025 14:32:03 -0500 Subject: [PATCH] Disable renderswaps when maps are being rendered Should hopefully prevent that obnoxious renderer swap SIGSEGV from ever being run into --- src/d_main.cpp | 4 ++++ src/screen.c | 8 ++++++++ src/screen.h | 1 + 3 files changed, 13 insertions(+) diff --git a/src/d_main.cpp b/src/d_main.cpp index c0011cc7d..ecf34700f 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -594,11 +594,15 @@ static void D_Display(void) // STUPID race condition... { wipegamestate = gamestate; + cansetrender = true; // clean up border stuff // see if the border needs to be initially drawn if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction && curbghide && (!hidetitlemap))) { + // Rendering a level; don't allow renderer changes! + cansetrender = false; + D_RenderLevel(); ps_uitime = I_GetPreciseTime(); diff --git a/src/screen.c b/src/screen.c index df4a2aace..c80c602c9 100644 --- a/src/screen.c +++ b/src/screen.c @@ -51,6 +51,7 @@ viddef_t vid; INT32 setmodeneeded; //video mode change needed if > 0 (the mode number to set + 1) UINT8 setrenderneeded = 0; +boolean cansetrender = true; //added : 03-02-98: default screen mode, as loaded/saved in config consvar_t cv_scr_width = CVAR_INIT ("scr_width", "640", CV_SAVE, CV_Unsigned, NULL); @@ -496,6 +497,13 @@ void SCR_ChangeRenderer(void) || (signed)rendermode == cv_renderer.value) return; + if (!cansetrender) + { + CONS_Alert(CONS_NOTICE, "You cannot change renderers at the moment.\n"); + CV_SetValue(&cv_renderer, (signed)rendermode); + return; + } + #ifdef HWRENDER // Check if OpenGL loaded successfully (or wasn't disabled) before switching to it. if ((vid.glstate == VID_GL_LIBRARY_ERROR) diff --git a/src/screen.h b/src/screen.h index 539ede6d4..1c893ea02 100644 --- a/src/screen.h +++ b/src/screen.h @@ -88,6 +88,7 @@ enum extern viddef_t vid; extern INT32 setmodeneeded; // mode number to set if needed, or 0 extern UINT8 setrenderneeded; +extern boolean cansetrender; extern double averageFPS;