diff --git a/src/d_main.c b/src/d_main.c
index 53798d4466ac56ef9e083e50fe78074541e242b3..81797947d3068f520aa53a3a63347e232f043faf 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -652,6 +652,8 @@ void D_SRB2Loop(void)
 	SCR_SetMode(); // change video mode
 	SCR_Recalc();
 
+	chosenrendermode = render_none;
+
 	// Check and print which version is executed.
 	// Use this as the border between setup and the main game loop being entered.
 	CONS_Printf(
@@ -1296,19 +1298,6 @@ void D_SRB2Main(void)
 	// set user default mode or mode set at cmdline
 	SCR_CheckDefaultMode();
 
-	// Lactozilla: Check if the render mode needs to change.
-	if (setrenderneeded)
-	{
-		CONS_Printf(M_GetText("Switching the renderer...\n"));
-
-		// Switch the renderer in the interface
-		if (VID_CheckRenderer())
-			con_refresh = true; // Allow explicit screen refresh again
-
-		// Set cv_renderer to the new render mode
-		CV_StealthSetValue(&cv_renderer, rendermode);
-	}
-
 	wipegamestate = gamestate;
 
 	savedata.lives = 0; // flag this as not-used
diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c
index 7b290bf3ff3a87d8e9d80f14c9c1c84c29a91e15..f4e5d5ccf424972d7042a71bc9e703a3d67be890 100644
--- a/src/lua_hudlib.c
+++ b/src/lua_hudlib.c
@@ -305,16 +305,16 @@ static int patch_get(lua_State *L)
 		lua_pushboolean(L, patch != NULL);
 		break;
 	case patch_width:
-		lua_pushinteger(L, SHORT(patch->width));
+		lua_pushinteger(L, patch->width);
 		break;
 	case patch_height:
-		lua_pushinteger(L, SHORT(patch->height));
+		lua_pushinteger(L, patch->height);
 		break;
 	case patch_leftoffset:
-		lua_pushinteger(L, SHORT(patch->leftoffset));
+		lua_pushinteger(L, patch->leftoffset);
 		break;
 	case patch_topoffset:
-		lua_pushinteger(L, SHORT(patch->topoffset));
+		lua_pushinteger(L, patch->topoffset);
 		break;
 	}
 	return 1;
diff --git a/src/screen.c b/src/screen.c
index f14cf4bf6c3065790f0cad4ea413a3a5749606dd..9d36eee39cb1da8c2ce14e5fc1392344a9dbefc9 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -72,7 +72,7 @@ CV_PossibleValue_t cv_renderer_t[] = {
 	{0, NULL}
 };
 
-consvar_t cv_renderer = CVAR_INIT ("renderer", "Software", CV_SAVE|CV_NOLUA|CV_CALL, cv_renderer_t, SCR_SetTargetRenderer);
+consvar_t cv_renderer = CVAR_INIT ("renderer", "Software", CV_SAVE|CV_NOLUA|CV_CALL, cv_renderer_t, SCR_ChangeRenderer);
 
 static void SCR_ChangeFullscreen(void);
 
@@ -207,7 +207,11 @@ void SCR_SetMode(void)
 		if (setrenderneeded && (moviemode == MM_APNG))
 			M_StopMovie();
 
-		VID_CheckRenderer();
+		// VID_SetMode will call VID_CheckRenderer itself,
+		// so no need to do this in here.
+		if (!setmodeneeded)
+			VID_CheckRenderer();
+
 		vid.recalc = 1;
 	}
 
@@ -402,15 +406,10 @@ void SCR_ChangeFullscreen(void)
 #endif
 }
 
-void SCR_SetTargetRenderer(void)
-{
-	if (!con_refresh)
-		SCR_ChangeRenderer();
-}
-
 void SCR_ChangeRenderer(void)
 {
-	if ((signed)rendermode == cv_renderer.value)
+	if (chosenrendermode != render_none
+	|| (signed)rendermode == cv_renderer.value)
 		return;
 
 #ifdef HWRENDER
@@ -428,7 +427,6 @@ void SCR_ChangeRenderer(void)
 
 	// Set the new render mode
 	setrenderneeded = cv_renderer.value;
-	con_refresh = false;
 }
 
 boolean SCR_IsAspectCorrect(INT32 width, INT32 height)
diff --git a/src/screen.h b/src/screen.h
index 66452289cf360d1bbde5e182693043c22dabf1f8..e4944775d952249c785c14262960daa8f58bc796 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -183,7 +183,6 @@ extern INT32 setmodeneeded; // mode number to set if needed, or 0
 extern UINT8 setrenderneeded;
 
 void SCR_ChangeRenderer(void);
-void SCR_SetTargetRenderer(void);
 
 extern CV_PossibleValue_t cv_renderer_t[];
 
diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c
index f83f57576f1dae559230fd4faadeabc28486750a..fb25362af934f63f19f60ebdbae3b0fc301a9c2a 100644
--- a/src/sdl/i_video.c
+++ b/src/sdl/i_video.c
@@ -1557,7 +1557,7 @@ boolean VID_CheckRenderer(void)
 		setrenderneeded = 0;
 	}
 
-	SDLSetMode(vid.width, vid.height, USE_FULLSCREEN, (rendererchanged ? SDL_FALSE : SDL_TRUE));
+	SDLSetMode(vid.width, vid.height, USE_FULLSCREEN, (setmodeneeded ? SDL_TRUE : SDL_FALSE));
 	Impl_VideoSetupBuffer();
 
 	if (rendermode == render_soft)