[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 8/9] ui/gtk-gl-area: Render guest content with padding in fixed-s
From: |
Weifeng Liu |
Subject: |
[PATCH 8/9] ui/gtk-gl-area: Render guest content with padding in fixed-scale mode |
Date: |
Sun, 11 May 2025 15:33:18 +0800 |
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 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.liu.z@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
- [PATCH 3/9] gtk/ui: Introduce helper gd_update_scale, (continued)
- [PATCH 4/9] ui/gtk: Update scales in fixed-scale mode when rendering GL area, Weifeng Liu, 2025/05/11
- [PATCH 2/9] ui/gtk: Use consistent naming for variables in different coordinates, Weifeng Liu, 2025/05/11
- [PATCH 5/9] ui/sdl: Consider scaling in mouse event handling, Weifeng Liu, 2025/05/11
- [PATCH 7/9] ui/gtk: Consider scaling when propagating ui info, Weifeng Liu, 2025/05/11
- [PATCH 6/9] ui/gtk: Don't update scale in fixed scale mode in gtk-egl.c, Weifeng Liu, 2025/05/11
- [PATCH 8/9] ui/gtk-gl-area: Render guest content with padding in fixed-scale mode,
Weifeng Liu <=
[PATCH 9/9] ui/gtk-egl: Render guest content with padding in fixed-scale mode, Weifeng Liu, 2025/05/11
Re: [PATCH 0/9] ui: Improve scale handling, Gerd Hoffmann, 2025/05/12