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