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
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
© 2016 - 2026 Red Hat, Inc.