Re: [PATCH] sdl2: fix HighDPI display scaling

BALATON Zoltan <[email protected]> Fri, 31 Jul 2026 13:05:19 +0200 (CEST)
Newsgroups org.nongnu.qemu-trivial,org.nongnu.qemu-devel
Message-ID <[email protected]>
On Thu, 30 Jul 2026, Oliver Clarke wrote:
> This makes sdl2 windows work well with dpi scaling. It fixes the issue 
> of the display surface being stretched to fit the dpi corrected window 
> (which created a blurry result).
>
> Note, this does not do any scaling, it just tells the os to not scale 
> the window. Before, when the console requested size 640x480, the logical 
> size of the window was 640x480, and the physical size was scaled by the 
> dpi scaling. Now, both the logical and physical size will be 640x480. 
> This is unlike most dpi aware programs which usually do have the scaled 
> physical size, then also make the render target that scaled size as 
> well. This doesn't make as much sense for QEMU, since the guest is 
> responsible for modesetting, and they should get the exact physical 
> pixels they request (if i modeset to 3840x2160, I wouldn't want this to 
> be scaled in any way).

Despite the patch is just two lines maybe it's not a trivial change. Does 
this mean that on hiDPI displays now a 640x480 guest screen (like BIOS or 
legacy guest) shows a tiny unusable window? In that case maybe this needs 
to be switchable with a property or turn off scaling of 4k and higher 
resolutions but then we get to the issue that other ui backends should do 
the same so just changing one backend may lead to inconsistency. Did you 
check how is this handled in other ui backends?

Regards,
BALATON Zoltan

> Signed-off-by: Oliver Clarke <[email protected]>
> ---
> ui/sdl2.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/ui/sdl2.c b/ui/sdl2.c
> index 1c97d23a47..1910477db4 100644
> --- a/ui/sdl2.c
> +++ b/ui/sdl2.c
> @@ -102,7 +102,7 @@ void sdl2_window_create(struct sdl2_console *scon)
>         flags |= SDL_WINDOW_OPENGL;
>     }
> #endif
> -
> +    flags |= SDL_WINDOW_ALLOW_HIGHDPI;
>     scon->real_window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED,
>                                          SDL_WINDOWPOS_UNDEFINED,
>                                          surface_width(scon->surface),
> @@ -907,6 +907,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>     char *dir;
>
>     assert(o->type == DISPLAY_TYPE_SDL);
> +    SDL_SetHint(SDL_HINT_WINDOWS_DPI_AWARENESS, "permonitorv2");
>
>     if (SDL_GetHintBoolean("QEMU_ENABLE_SDL_LOGGING", SDL_FALSE)) {
>         SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);
>