[PATCH] ui/gtk-egl: Ensure EGL surface is available before drawing

dongwon.kim@intel.com posted 1 patch 1 month, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260303011151.1925827-1-dongwon.kim@intel.com
Maintainers: "Marc-André Lureau" <marcandre.lureau@redhat.com>
ui/gtk-egl.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
[PATCH] ui/gtk-egl: Ensure EGL surface is available before drawing
Posted by dongwon.kim@intel.com 1 month, 1 week ago
From: Dongwon Kim <dongwon.kim@intel.com>

The EGL surface and context are destroyed when a new GTK window is
created. We must ensure these are recreated and initialized before
any rendering happens in gd_egl_refresh.

Currently, the check for a pending draw is performed before the
surface initialization block. This can result in an attempt to
draw when the EGL surface (vc->gfx.esurface) is not yet available.

This patch moves the drawing check after the surface initialization
to ensure a valid surface exists before rendering in gd_egl_refresh.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
 ui/gtk-egl.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index ae9239999c..52d187c482 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -152,12 +152,6 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
     gd_update_monitor_refresh_rate(
             vc, vc->window ? vc->window : vc->gfx.drawing_area);
 
-    if (vc->gfx.guest_fb.dmabuf &&
-        qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
-        gd_egl_draw(vc);
-        return;
-    }
-
     if (!vc->gfx.esurface) {
         gd_egl_init(vc);
         if (!vc->gfx.esurface) {
@@ -176,6 +170,12 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
 #endif
     }
 
+    if (vc->gfx.guest_fb.dmabuf &&
+        qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
+        gd_egl_draw(vc);
+        return;
+    }
+
     graphic_hw_update(dcl->con);
 
     if (vc->gfx.glupdates) {
-- 
2.43.0


Re: [PATCH] ui/gtk-egl: Ensure EGL surface is available before drawing
Posted by Marc-André Lureau 1 month, 1 week ago
On Tue, Mar 3, 2026 at 2:17 AM <dongwon.kim@intel.com> wrote:
>
> From: Dongwon Kim <dongwon.kim@intel.com>
>
> The EGL surface and context are destroyed when a new GTK window is
> created. We must ensure these are recreated and initialized before
> any rendering happens in gd_egl_refresh.
>
> Currently, the check for a pending draw is performed before the
> surface initialization block. This can result in an attempt to
> draw when the EGL surface (vc->gfx.esurface) is not yet available.
>
> This patch moves the drawing check after the surface initialization
> to ensure a valid surface exists before rendering in gd_egl_refresh.
>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>

Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  ui/gtk-egl.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
> index ae9239999c..52d187c482 100644
> --- a/ui/gtk-egl.c
> +++ b/ui/gtk-egl.c
> @@ -152,12 +152,6 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
>      gd_update_monitor_refresh_rate(
>              vc, vc->window ? vc->window : vc->gfx.drawing_area);
>
> -    if (vc->gfx.guest_fb.dmabuf &&
> -        qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
> -        gd_egl_draw(vc);
> -        return;
> -    }
> -
>      if (!vc->gfx.esurface) {
>          gd_egl_init(vc);
>          if (!vc->gfx.esurface) {
> @@ -176,6 +170,12 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
>  #endif
>      }
>
> +    if (vc->gfx.guest_fb.dmabuf &&
> +        qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
> +        gd_egl_draw(vc);
> +        return;
> +    }
> +
>      graphic_hw_update(dcl->con);
>
>      if (vc->gfx.glupdates) {
> --
> 2.43.0
>
>


-- 
Marc-André Lureau