From 9b7e356e587080b2fc9f4e356a2210036d261ba8 Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Mon, 16 Mar 2026 13:00:53 -0400
Subject: [PATCH] Fix double scaling when setting a logical presentation size
SDL2 overwrites the user set scale when changing the logical size or resizing the window, while SDL3 tracks it separately and applies it on top of the logical scale. Set the user scale value to 1.0 when setting the logical size or resizing the window, to avoid double scaling within SDL3.
---
src/sdl2_compat.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index 61230791..aaae356a 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -2927,6 +2927,12 @@ EventFilter3to2(void *userdata, SDL_Event *event3)
mode == SDL_LOGICAL_PRESENTATION_DISABLED) {
SDL_RenderSetViewport(renderer, NULL);
}
+
+ /* SDL2 overwrites the render scale when the window is resized, however, on SDL3,
+ * the user set scale and logical presentation scales are separate, and will be
+ * stacked when applied, so set the scale to 1.0 to avoid double scaling.
+ */
+ SDL3_SetRenderScale(renderer, 1.0f, 1.0f);
}
/* Fixes queue overflow with resize events that aren't processed */
@@ -6072,6 +6078,11 @@ SDL_RenderSetLogicalSize(SDL_Renderer *renderer, int w, int h)
}
}
+ /* SDL2 overwrites the user set scale when setting the logical size, while SDL3 tracks it separately.
+ * Set to 1.0 to avoid double scaling within SDL3.
+ */
+ SDL3_SetRenderScale(renderer, 1.0f, 1.0f);
+
retval = SDL3_SetRenderLogicalPresentation(renderer, w, h, mode) ? 0 : -1;
return retval < 0 ? retval : FlushRendererIfNotBatching(renderer);
}