Re: [PATCH] sdl2: fix HighDPI display scaling

Oliver C <[email protected]> Fri, 31 Jul 2026 14:52:34 -0400
Newsgroups org.nongnu.qemu-trivial,org.nongnu.qemu-devel
Message-ID <CAGxFFDPnTmeEhVa_sK87W14E=pr=36F+i9OmwQEO5nyh=1Ew+w@mail.gmail.com>
I added a scale option for sdl that works the same as gtk.
I said linear filtering in my last response, but I meant point
filtering. I played around with point filtering,
but it looks pretty bad with non-integer scaling (e.g. 150% scaling to
match my setup). It does however
look quite nice with an integer scale, so maybe this could be
configurable as well?

What's the process for amending a patch? Do I reply with the
additional patches, reply with the whole patch, or create a new
thread?

Thanks,
Oliver

On Fri, Jul 31, 2026 at 1:32=E2=80=AFPM Oliver C <[email protected]> w=
rote:
>
> > Does this mean that on hiDPI displays now a 640x480 guest screen
> > (like BIOS or legacy guest) shows a tiny unusable window?
>
> This is correct, but:
>
> > ...the issue that other ui backends should do the same so just changing
> > one backend may lead to inconsistency.
>
> the gtk backend exhibits the same behavior as the sdl backend with my cha=
nges,
> i.e. it creates a 640x480 guest screen in physical pixels (my machine has=
 a
> 4k monitor with 150% scaling), just like the new changes. So these change=
s
> in fact make it more consistent. Although, I just noticed that gtk has
> a 'scale' option,
> which scales the window size, and stretches the surface to it. I
> suppose this can
> be added to sdl. I think it would also be a good idea to enable linear fi=
ltering
> when stretching the surface, so it doesn't look as blurry.
>
> > Despite the patch is just two lines maybe it's not a trivial change.
>
> Gotcha, sorry this is my first time sending a patch through mailing
> list, so thanks for bearing with me.
>
> Oliver
>
> On Fri, Jul 31, 2026 at 7:05=E2=80=AFAM BALATON Zoltan <[email protected]=
u> wrote:
> >
> > On Thu, 30 Jul 2026, Oliver Clarke wrote:
> > > This makes sdl2 windows work well with dpi scaling. It fixes the issu=
e
> > > of the display surface being stretched to fit the dpi corrected windo=
w
> > > (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 logi=
cal
> > > size of the window was 640x480, and the physical size was scaled by t=
he
> > > dpi scaling. Now, both the logical and physical size will be 640x480.
> > > This is unlike most dpi aware programs which usually do have the scal=
ed
> > > 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. Do=
es
> > 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 nee=
ds
> > 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 yo=
u
> > 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 |=3D SDL_WINDOW_OPENGL;
> > >     }
> > > #endif
> > > -
> > > +    flags |=3D SDL_WINDOW_ALLOW_HIGHDPI;
> > >     scon->real_window =3D SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINE=
D,
> > >                                          SDL_WINDOWPOS_UNDEFINED,
> > >                                          surface_width(scon->surface)=
,
> > > @@ -907,6 +907,7 @@ static void sdl2_display_init(DisplayState *ds, D=
isplayOptions *o)
> > >     char *dir;
> > >
> > >     assert(o->type =3D=3D 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);
> > >