Hi, On Tue, 2025-05-13 at 00:37 +0000, Kim, Dongwon wrote: > Hi, > > > Subject: [PATCH 8/9] ui/gtk-gl-area: Render guest content with > > padding in > > fixed-scale mode > > > > In fixed-scale mode (zoom-to-fit=false), we expect that scale > > should not > > change, meaning that if window size is larger than guest surface, > > padding is > > # @zoom-to-fit: Zoom guest display to fit into the host window. When > # turned off the host window will be resized instead. In case > the > # display device can notify the guest on window resizes > # (virtio-gpu) this will default to "on", assuming the guest will > # resize the display to match the window size then. Otherwise it > # defaults to "off". (Since 3.1) > > Current definition says the host window should be resized to fit the > size of the guest surface instead. Wouldn't padding accommodate this? >
Yeah, window will be resized to fit the size of guest surface in fixed- scale mode. However, users are still allowed to resize the window to a larger size and this is case where padding is required, otherwise the fixed-scale assumption is broken. In fact, gl=off mode employs padding to preserve scale already but gl=on mode doesn't follow this behavior, which, IMO, is a defect that this patch is trying to correct. Best regards, Weifeng > > supposed to be added to preserve the scale. However, in OpenGL mode > > (gl=on), guest surface is always painted to the whole canvas > > without any > > padding. This change tries to fix this bug by adding appropriate > > padding > > when drawing surfaces. > > > > Signed-off-by: Weifeng Liu <weifeng.li...@gmail.com> > > --- > > ui/gtk-gl-area.c | 33 ++++++++++++++++++++++++++++++++- > > 1 file changed, 32 insertions(+), 1 deletion(-) > > > > diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c index > > db93cd6204..8151cc413c > > 100644 > > --- a/ui/gtk-gl-area.c > > +++ b/ui/gtk-gl-area.c > > @@ -44,7 +44,9 @@ void gd_gl_area_draw(VirtualConsole *vc) #endif > > int pw, ph, gs, y1, y2; > > int ww, wh; > > + int ww_surface, wh_surface; > > int fbw, fbh; > > + int wx_offset, wy_offset; > > > > if (!vc->gfx.gls) { > > return; > > @@ -61,6 +63,17 @@ void gd_gl_area_draw(VirtualConsole *vc) > > > > gd_update_scale(vc, ww, wh, fbw, fbh); > > > > + ww_surface = fbw * vc->gfx.scale_x; > > + wh_surface = fbh * vc->gfx.scale_y; > > + > > + wx_offset = wy_offset = 0; > > + if (ww > ww_surface) { > > + wx_offset = (ww - ww_surface) / 2; > > + } > > + if (wh > wh_surface) { > > + wy_offset = (wh - wh_surface) / 2; > > + } > > + > > if (vc->gfx.scanout_mode) { > > if (!vc->gfx.guest_fb.framebuffer) { > > return; > > @@ -79,11 +92,29 @@ void gd_gl_area_draw(VirtualConsole *vc) > > glBindFramebuffer(GL_READ_FRAMEBUFFER, vc- > > > gfx.guest_fb.framebuffer); > > /* GtkGLArea sets GL_DRAW_FRAMEBUFFER for us */ > > > > + if (wx_offset > 0) { > > + glEnable(GL_SCISSOR_TEST); > > + glScissor(0, 0, wx_offset * gs, wh * gs); > > + glClear(GL_COLOR_BUFFER_BIT); > > + glScissor((ww - wx_offset) * gs, 0, wx_offset * gs, wh > > * gs); > > + glClear(GL_COLOR_BUFFER_BIT); > > + glDisable(GL_SCISSOR_TEST); > > + } > > + if (wy_offset > 0) { > > + glEnable(GL_SCISSOR_TEST); > > + glScissor(0, 0, ww * gs, wy_offset * gs); > > + glClear(GL_COLOR_BUFFER_BIT); > > + glScissor(0, (wh - wy_offset) * gs, ww * gs, wy_offset > > * gs); > > + glClear(GL_COLOR_BUFFER_BIT); > > + glDisable(GL_SCISSOR_TEST); > > + } > > + > > glViewport(0, 0, pw, ph); > > y1 = vc->gfx.y0_top ? 0 : vc->gfx.h; > > y2 = vc->gfx.y0_top ? vc->gfx.h : 0; > > glBlitFramebuffer(0, y1, vc->gfx.w, y2, > > - 0, 0, pw, ph, > > + wx_offset * gs, wy_offset * gs, > > + (ww - wx_offset) * gs, (wh - wy_offset) > > * gs, > > GL_COLOR_BUFFER_BIT, GL_NEAREST); > > #ifdef CONFIG_GBM > > if (dmabuf) { > > -- > > 2.49.0 > > > > Thanks