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

Reply via email to