Message ID | ab7146dc-4b21-4193-8f3b-109723fbd877@me.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | gtk-egl: Blend cursor buffer within a scaled viewport | expand |
The patch pasted in previous mail lost some indentations and spaces. Sorry. From 7921a69f106233ebc0ff9bdc29d7c6182160fc6f Mon Sep 17 00:00:00 2001 From: Chen Zhang <tgfbeta@me.com> Date: Thu, 24 Jan 2019 09:16:23 +0800 Subject: [PATCH] DMABuf: Blend cursor buf within a scaled viewport Signed-off-by: Chen Zhang <tgfbeta@me.com> --- include/ui/egl-helpers.h | 2 ++ ui/egl-helpers.c | 18 ++++++++++++++++++ ui/gtk-egl.c | 8 +++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index 3fc656a..63ffc2d 100644 --- a/include/ui/egl-helpers.h +++ b/include/ui/egl-helpers.h @@ -28,6 +28,8 @@ void egl_fb_read(void *dst, egl_fb *src); void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip); void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, int x, int y); +void egl_texture_blend2(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, + int x, int y, int w, int h); #ifdef CONFIG_OPENGL_DMABUF diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index 5e115b3..9dddee9 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -137,6 +137,24 @@ void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, glDisable(GL_BLEND); } +void egl_texture_blend2(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, + int x, int y, int w, int h) +{ + glBindFramebuffer(GL_FRAMEBUFFER_EXT, dst->framebuffer); + if (flip) { + glViewport(x, y, w, h); + } else { + glViewport(x, dst->height - h - y, + w, h); + } + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, src->texture); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + qemu_gl_run_texture_blit(gls, flip); + glDisable(GL_BLEND); +} + /* ---------------------------------------------------------------------- */ #ifdef CONFIG_OPENGL_DMABUF diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c index afd1714..afff0e1 100644 --- a/ui/gtk-egl.c +++ b/ui/gtk-egl.c @@ -276,9 +276,11 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl, if (vc->gfx.cursor_fb.texture) { egl_texture_blit(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.guest_fb, vc->gfx.y0_top); - egl_texture_blend(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.cursor_fb, - vc->gfx.y0_top, - vc->gfx.cursor_x, vc->gfx.cursor_y); + egl_texture_blend2(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.cursor_fb, + vc->gfx.y0_top, + vc->gfx.cursor_x, vc->gfx.cursor_y, + vc->gfx.scale_x * vc->gfx.cursor_fb.width, + vc->gfx.scale_x * vc->gfx.cursor_fb.height); } else { egl_fb_blit(&vc->gfx.win_fb, &vc->gfx.guest_fb, !vc->gfx.y0_top); }
> diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h > index 3fc656a..63ffc2d 100644 > --- a/include/ui/egl-helpers.h > +++ b/include/ui/egl-helpers.h > @@ -28,6 +28,8 @@ void egl_fb_read(void *dst, egl_fb *src); > void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip); > void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, > int x, int y); > +void egl_texture_blend2(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, > + int x, int y, int w, int h); Why do you add egl_texture_blend2()? How about adding scale_{x,y} parameters to egl_texture_blend() instead? > + vc->gfx.scale_x * vc->gfx.cursor_fb.width, > + vc->gfx.scale_x * vc->gfx.cursor_fb.height); ^ this should be y I guess ? cheers, Gerd
Hi, > On Jan 24, 2019, at 8:07 PM, Gerd Hoffmann <kraxel@redhat.com> wrote: > >> diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h >> index 3fc656a..63ffc2d 100644 >> --- a/include/ui/egl-helpers.h >> +++ b/include/ui/egl-helpers.h >> @@ -28,6 +28,8 @@ void egl_fb_read(void *dst, egl_fb *src); >> void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip); >> void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, >> int x, int y); >> +void egl_texture_blend2(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, >> + int x, int y, int w, int h); > > Why do you add egl_texture_blend2()? > How about adding scale_{x,y} parameters to egl_texture_blend() instead? It is valid to augment parameter list of egl_texture_blend(), however, there are two other callers: namely, spicy-display and egl-headless, neither of which seems to scale any underlying viewports. In that case, default scales (1.0, 1.0) shall be provided. > >> + vc->gfx.scale_x * vc->gfx.cursor_fb.width, >> + vc->gfx.scale_x * vc->gfx.cursor_fb.height); > ^ this should be y I guess ? Sorry for this typo. > > cheers, > Gerd > Best regards,
On Thu, Jan 24, 2019 at 10:11:24PM +0800, Chen Zhang wrote: > Hi, > > > On Jan 24, 2019, at 8:07 PM, Gerd Hoffmann <kraxel@redhat.com> wrote: > > > >> diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h > >> index 3fc656a..63ffc2d 100644 > >> --- a/include/ui/egl-helpers.h > >> +++ b/include/ui/egl-helpers.h > >> @@ -28,6 +28,8 @@ void egl_fb_read(void *dst, egl_fb *src); > >> void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip); > >> void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, > >> int x, int y); > >> +void egl_texture_blend2(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, > >> + int x, int y, int w, int h); > > > > Why do you add egl_texture_blend2()? > > How about adding scale_{x,y} parameters to egl_texture_blend() instead? > It is valid to augment parameter list of egl_texture_blend(), however, there are > two other callers: namely, spicy-display and egl-headless, neither of which > seems to scale any underlying viewports. In that case, default scales (1.0, 1.0) > shall be provided. Yes, these callers can simply set scale_x and scale_y to 1. cheers, Gerd
diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index 3fc656a..63ffc2d 100644 --- a/include/ui/egl-helpers.h +++ b/include/ui/egl-helpers.h @@ -28,6 +28,8 @@ void egl_fb_read(void *dst, egl_fb *src); void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip); void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, int x, int y); +void egl_texture_blend2(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, + int x, int y, int w, int h); #ifdef CONFIG_OPENGL_DMABUF diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index 5e115b3..9dddee9 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -137,6 +137,24 @@ void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, glDisable(GL_BLEND); } +void egl_texture_blend2(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, + int x, int y, int w, int h) +{ + glBindFramebuffer(GL_FRAMEBUFFER_EXT, dst->framebuffer); + if (flip) { + glViewport(x, y, w, h); + } else { + glViewport(x, dst->height - h - y, + w, h); + } + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, src->texture); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + qemu_gl_run_texture_blit(gls, flip); + glDisable(GL_BLEND); +} + /* ---------------------------------------------------------------------- */ #ifdef CONFIG_OPENGL_DMABUF diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c index afd1714..afff0e1 100644 --- a/ui/gtk-egl.c +++ b/ui/gtk-egl.c @@ -276,9 +276,11 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl, if (vc->gfx.cursor_fb.texture) { egl_texture_blit(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.guest_fb, vc->gfx.y0_top); - egl_texture_blend(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.cursor_fb, - vc->gfx.y0_top, - vc->gfx.cursor_x, vc->gfx.cursor_y); + egl_texture_blend2(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.cursor_fb, + vc->gfx.y0_top, + vc->gfx.cursor_x, vc->gfx.cursor_y, + vc->gfx.scale_x * vc->gfx.cursor_fb.width, + vc->gfx.scale_x * vc->gfx.cursor_fb.height); } else { egl_fb_blit(&vc->gfx.win_fb, &vc->gfx.guest_fb, !vc->gfx.y0_top); }
When a gtk-egl window (for gvt-g DMABuf) was zoomed, the cursor plane buffer did not zoom covariantly, resulting in a mismatched cursor size. In this patch, `egl_texture_blend()` is augmented with two extra parameters to convey the size for a scaled viewport, as in `egl_texture_blend2()`. Signed-off-by: Chen Zhang <tgfbeta@me.com> --- include/ui/egl-helpers.h | 2 ++ ui/egl-helpers.c | 18 ++++++++++++++++++ ui/gtk-egl.c | 8 +++++--- 3 files changed, 25 insertions(+), 3 deletions(-)