include/ui/egl-helpers.h | 2 ++ ui/egl-helpers.c | 18 ++++++++++++++++++ ui/gtk-egl.c | 8 +++++--- 3 files changed, 25 insertions(+), 3 deletions(-)
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(-)
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);
}
--
2.7.4
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);
}
--
2.7.4
> On Jan 24, 2019, at 9:31 AM, Chen Zhang <tgfbeta@me.com> wrote:
>
> 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(-)
>
> 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);
> }
> --
> 2.7.4
> 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
© 2016 - 2025 Red Hat, Inc.