Re: [PATCH] sdl2: fix HighDPI display scaling

BALATON Zoltan <[email protected]> Fri, 31 Jul 2026 22:28:47 +0200 (CEST)
Newsgroups org.nongnu.qemu-trivial,org.nongnu.qemu-devel
Message-ID <[email protected]>
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--3866299591-1858572498-1785529727=:2229
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8BIT

On Fri, 31 Jul 2026, Oliver C wrote:
> 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?

I don't know what other ui backends do but if this makes it more 
consistent with at least gtk it sounds good and a scale options is useful 
in itself even without hiDPI. The ui maintainers should do a final review 
though.

> 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?

You should post a new thread if you revise a patch with v2 for the first 
revision after initial submission without version and increasing for later 
revisions but adding a scale option should be in a different patch so this 
makes it a series with two patches. Series should be submitted as replies 
to a cover letter with new thread for v2 and so on for revised series as 
well. This should be explained in 
https://www.qemu.org/docs/master/devel/submitting-a-patch.html

Thanks for improving QEMU.

Regards,
BALATON Zoltan

> Thanks,
> Oliver
>
> On Fri, Jul 31, 2026 at 1:32 PM Oliver C <[email protected]> wrote:
>>
>>> 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 changes,
>> 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 changes
>> 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 filtering
>> 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 AM BALATON Zoltan <[email protected]> wrote:
>>>
>>> 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);
>>>>
>
>
--3866299591-1858572498-1785529727=:2229--