ui/gtk-egl: Render guest content with padding in fixed-scale mode

Scaling was not respected when rendering frames in gtk-egl.c (used if
gl=on and X11 mode). To fix this, add fields x and y to struct egl_fb
for x offset and y offset so we can add padding to window.

Signed-off-by: Weifeng Liu <weifeng.liu.z@gmail.com>
Message-ID: <20250511073337.876650-10-weifeng.liu.z@gmail.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
Weifeng Liu 2025-05-11 15:33:19 +08:00 committed by Marc-André Lureau
parent fdc09b028f
commit f05e1a93f4
4 changed files with 43 additions and 9 deletions

View file

@ -340,7 +340,11 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl,
{
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
GdkWindow *window;
int ww, wh, ws;
int px_offset, py_offset;
int gs;
int pw_widget, ph_widget, pw_surface, ph_surface;
int ww_widget, wh_widget, ww_surface, wh_surface;
int fbw, fbh;
if (!vc->gfx.scanout_mode) {
return;
@ -353,10 +357,32 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl,
vc->gfx.esurface, vc->gfx.ectx);
window = gtk_widget_get_window(vc->gfx.drawing_area);
ws = gdk_window_get_scale_factor(window);
ww = gdk_window_get_width(window) * ws;
wh = gdk_window_get_height(window) * ws;
egl_fb_setup_default(&vc->gfx.win_fb, ww, wh);
gs = gdk_window_get_scale_factor(window);
ww_widget = gdk_window_get_width(window);
wh_widget = gdk_window_get_height(window);
fbw = surface_width(vc->gfx.ds);
fbh = surface_height(vc->gfx.ds);
gd_update_scale(vc, ww_widget, wh_widget, fbw, fbh);
ww_surface = fbw * vc->gfx.scale_x;
wh_surface = fbh * vc->gfx.scale_y;
pw_widget = ww_widget * gs;
ph_widget = wh_widget * gs;
pw_surface = ww_surface * gs;
ph_surface = wh_surface * gs;
px_offset = 0;
py_offset = 0;
if (pw_widget > pw_surface) {
px_offset = (pw_widget - pw_surface) / 2;
}
if (ph_widget > ph_surface) {
py_offset = (ph_widget - ph_surface) / 2;
}
egl_fb_setup_default(&vc->gfx.win_fb, pw_surface, ph_surface,
px_offset, py_offset);
if (vc->gfx.cursor_fb.texture) {
egl_texture_blit(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.guest_fb,
vc->gfx.y0_top);