qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context
@ 2021-07-03  0:28 Dongwon Kim
  2021-07-03  0:28 ` [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Dongwon Kim @ 2021-07-03  0:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: Khairul Anuar Romli, Dongwon Kim

An old esurface should be destroyed and set to be NULL when doing
un-tab and re-tab so that a new esurface an context can be created
for the window widget that those will be bound to.

Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
Signed-off-by: Khairul Anuar Romli <khairul.anuar.romli@intel.com>
---
 ui/gtk.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/ui/gtk.c b/ui/gtk.c
index 98046f577b..bfb95f3b4b 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1232,6 +1232,14 @@ static gboolean gd_tab_window_close(GtkWidget *widget, GdkEvent *event,
                                     vc->tab_item, vc->label);
     gtk_widget_destroy(vc->window);
     vc->window = NULL;
+    if (vc->gfx.esurface) {
+        eglDestroySurface(qemu_egl_display, vc->gfx.esurface);
+        vc->gfx.esurface = NULL;
+    }
+    if (vc->gfx.ectx) {
+        eglDestroyContext(qemu_egl_display, vc->gfx.ectx);
+        vc->gfx.ectx = NULL;
+    }
     return TRUE;
 }
 
@@ -1261,6 +1269,14 @@ static void gd_menu_untabify(GtkMenuItem *item, void *opaque)
     if (!vc->window) {
         gtk_widget_set_sensitive(vc->menu_item, false);
         vc->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+        if (vc->gfx.esurface) {
+            eglDestroySurface(qemu_egl_display, vc->gfx.esurface);
+            vc->gfx.esurface = NULL;
+        }
+        if (vc->gfx.esurface) {
+            eglDestroyContext(qemu_egl_display, vc->gfx.ectx);
+            vc->gfx.ectx = NULL;
+        }
         gd_widget_reparent(s->notebook, vc->window, vc->tab_item);
 
         g_signal_connect(vc->window, "delete-event",
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current
  2021-07-03  0:28 [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
@ 2021-07-03  0:28 ` Dongwon Kim
  2021-07-16 22:18   ` Kasireddy, Vivek
  2021-07-03  0:28 ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
  2021-07-16 22:08 ` [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Kasireddy, Vivek
  2 siblings, 1 reply; 8+ messages in thread
From: Dongwon Kim @ 2021-07-03  0:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim

Making the vc->gfx.ectx current before handling textures
associated with it

Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
 ui/gtk-egl.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index 2a2e6d3a17..32516b806c 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -126,6 +126,7 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
         }
         vc->gfx.gls = qemu_gl_init_shader();
         if (vc->gfx.ds) {
+            surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds);
             surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds);
         }
     }
@@ -152,6 +153,8 @@ void gd_egl_switch(DisplayChangeListener *dcl,
         surface_height(vc->gfx.ds) == surface_height(surface)) {
         resized = false;
     }
+    eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
+                   vc->gfx.esurface, vc->gfx.ectx);
 
     surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds);
     vc->gfx.ds = surface;
@@ -209,6 +212,11 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
                            QemuDmaBuf *dmabuf)
 {
 #ifdef CONFIG_GBM
+    VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
+
+    eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
+                   vc->gfx.esurface, vc->gfx.ectx);
+
     egl_dmabuf_import_texture(dmabuf);
     if (!dmabuf->texture) {
         return;
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound
  2021-07-03  0:28 [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
  2021-07-03  0:28 ` [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
@ 2021-07-03  0:28 ` Dongwon Kim
  2021-07-06 23:34   ` [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
  2021-07-16 21:55   ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Kasireddy, Vivek
  2021-07-16 22:08 ` [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Kasireddy, Vivek
  2 siblings, 2 replies; 8+ messages in thread
From: Dongwon Kim @ 2021-07-03  0:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim

gd_draw_event shouldn't try to repaint if surface does not exist
for the VC.

Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
 ui/gtk.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/ui/gtk.c b/ui/gtk.c
index bfb95f3b4b..0a38deedc7 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -756,6 +756,9 @@ static gboolean gd_draw_event(GtkWidget *widget, cairo_t *cr, void *opaque)
     if (!vc->gfx.ds) {
         return FALSE;
     }
+    if (!vc->gfx.surface) {
+        return FALSE;
+    }
 
     vc->gfx.dcl.update_interval =
         gd_monitor_update_interval(vc->window ? vc->window : s->window);
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl
  2021-07-03  0:28 ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
@ 2021-07-06 23:34   ` Dongwon Kim
  2021-07-16 22:23     ` Kasireddy, Vivek
  2021-07-16 21:55   ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Kasireddy, Vivek
  1 sibling, 1 reply; 8+ messages in thread
From: Dongwon Kim @ 2021-07-06 23:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim

If guest fb is backed by dmabuf (blob-resource), the texture bound to the
old context needs to be recreated in case the egl is re-initialized (e.g.
new window for vc is created in case of detaching/reattaching of the tab)

Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
 ui/gtk-egl.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index 32516b806c..5dd7c7e1f5 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -129,6 +129,10 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
             surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds);
             surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds);
         }
+        if (vc->gfx.guest_fb.dmabuf) {
+            vc->gfx.guest_fb.dmabuf->texture = 0;
+            gd_egl_scanout_dmabuf(dcl, vc->gfx.guest_fb.dmabuf);
+        }
     }
 
     graphic_hw_update(dcl->con);
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* RE: [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound
  2021-07-03  0:28 ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
  2021-07-06 23:34   ` [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
@ 2021-07-16 21:55   ` Kasireddy, Vivek
  1 sibling, 0 replies; 8+ messages in thread
From: Kasireddy, Vivek @ 2021-07-16 21:55 UTC (permalink / raw)
  To: Kim, Dongwon, qemu-devel@nongnu.org; +Cc: Kim, Dongwon

Reviewed-by: Vivek Kasireddy <vivek.kasireddy@intel.com>


> -----Original Message-----
> From: Qemu-devel <qemu-devel-bounces+vivek.kasireddy=intel.com@nongnu.org> On
> Behalf Of Dongwon Kim
> Sent: Friday, July 02, 2021 5:28 PM
> To: qemu-devel@nongnu.org
> Cc: Kim, Dongwon <dongwon.kim@intel.com>
> Subject: [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is
> bound
> 
> gd_draw_event shouldn't try to repaint if surface does not exist
> for the VC.
> 
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> ---
>  ui/gtk.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/ui/gtk.c b/ui/gtk.c
> index bfb95f3b4b..0a38deedc7 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -756,6 +756,9 @@ static gboolean gd_draw_event(GtkWidget *widget, cairo_t *cr,
> void *opaque)
>      if (!vc->gfx.ds) {
>          return FALSE;
>      }
> +    if (!vc->gfx.surface) {
> +        return FALSE;
> +    }
> 
>      vc->gfx.dcl.update_interval =
>          gd_monitor_update_interval(vc->window ? vc->window : s->window);
> --
> 2.17.1
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context
  2021-07-03  0:28 [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
  2021-07-03  0:28 ` [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
  2021-07-03  0:28 ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
@ 2021-07-16 22:08 ` Kasireddy, Vivek
  2 siblings, 0 replies; 8+ messages in thread
From: Kasireddy, Vivek @ 2021-07-16 22:08 UTC (permalink / raw)
  To: Kim, Dongwon, qemu-devel@nongnu.org; +Cc: Romli, Khairul Anuar, Kim, Dongwon

Reviewed-by: Vivek Kasireddy <vivek.kasireddy@intel.com>


> -----Original Message-----
> From: Qemu-devel <qemu-devel-bounces+vivek.kasireddy=intel.com@nongnu.org> On
> Behalf Of Dongwon Kim
> Sent: Friday, July 02, 2021 5:28 PM
> To: qemu-devel@nongnu.org
> Cc: Romli, Khairul Anuar <khairul.anuar.romli@intel.com>; Kim, Dongwon
> <dongwon.kim@intel.com>
> Subject: [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context
> 
> An old esurface should be destroyed and set to be NULL when doing
> un-tab and re-tab so that a new esurface an context can be created
> for the window widget that those will be bound to.
> 
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> Signed-off-by: Khairul Anuar Romli <khairul.anuar.romli@intel.com>
> ---
>  ui/gtk.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/ui/gtk.c b/ui/gtk.c
> index 98046f577b..bfb95f3b4b 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -1232,6 +1232,14 @@ static gboolean gd_tab_window_close(GtkWidget *widget,
> GdkEvent *event,
>                                      vc->tab_item, vc->label);
>      gtk_widget_destroy(vc->window);
>      vc->window = NULL;
> +    if (vc->gfx.esurface) {
> +        eglDestroySurface(qemu_egl_display, vc->gfx.esurface);
> +        vc->gfx.esurface = NULL;
> +    }
> +    if (vc->gfx.ectx) {
> +        eglDestroyContext(qemu_egl_display, vc->gfx.ectx);
> +        vc->gfx.ectx = NULL;
> +    }
>      return TRUE;
>  }
> 
> @@ -1261,6 +1269,14 @@ static void gd_menu_untabify(GtkMenuItem *item, void
> *opaque)
>      if (!vc->window) {
>          gtk_widget_set_sensitive(vc->menu_item, false);
>          vc->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
> +        if (vc->gfx.esurface) {
> +            eglDestroySurface(qemu_egl_display, vc->gfx.esurface);
> +            vc->gfx.esurface = NULL;
> +        }
> +        if (vc->gfx.esurface) {
> +            eglDestroyContext(qemu_egl_display, vc->gfx.ectx);
> +            vc->gfx.ectx = NULL;
> +        }
>          gd_widget_reparent(s->notebook, vc->window, vc->tab_item);
> 
>          g_signal_connect(vc->window, "delete-event",
> --
> 2.17.1
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current
  2021-07-03  0:28 ` [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
@ 2021-07-16 22:18   ` Kasireddy, Vivek
  0 siblings, 0 replies; 8+ messages in thread
From: Kasireddy, Vivek @ 2021-07-16 22:18 UTC (permalink / raw)
  To: Kim, Dongwon, qemu-devel@nongnu.org; +Cc: Kim, Dongwon

Acknowledged-by: Vivek Kasireddy <vivek.kasireddy@intel.com>


> -----Original Message-----
> From: Qemu-devel <qemu-devel-bounces+vivek.kasireddy=intel.com@nongnu.org> On
> Behalf Of Dongwon Kim
> Sent: Friday, July 02, 2021 5:28 PM
> To: qemu-devel@nongnu.org
> Cc: Kim, Dongwon <dongwon.kim@intel.com>
> Subject: [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current
> 
> Making the vc->gfx.ectx current before handling textures
> associated with it
> 
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> ---
>  ui/gtk-egl.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
> index 2a2e6d3a17..32516b806c 100644
> --- a/ui/gtk-egl.c
> +++ b/ui/gtk-egl.c
> @@ -126,6 +126,7 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
>          }
>          vc->gfx.gls = qemu_gl_init_shader();
>          if (vc->gfx.ds) {
> +            surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds);
>              surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds);
>          }
>      }
> @@ -152,6 +153,8 @@ void gd_egl_switch(DisplayChangeListener *dcl,
>          surface_height(vc->gfx.ds) == surface_height(surface)) {
>          resized = false;
>      }
> +    eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
> +                   vc->gfx.esurface, vc->gfx.ectx);
> 
>      surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds);
>      vc->gfx.ds = surface;
> @@ -209,6 +212,11 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
>                             QemuDmaBuf *dmabuf)
>  {
>  #ifdef CONFIG_GBM
> +    VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
> +
> +    eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
> +                   vc->gfx.esurface, vc->gfx.ectx);
> +
>      egl_dmabuf_import_texture(dmabuf);
>      if (!dmabuf->texture) {
>          return;
> --
> 2.17.1
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl
  2021-07-06 23:34   ` [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
@ 2021-07-16 22:23     ` Kasireddy, Vivek
  0 siblings, 0 replies; 8+ messages in thread
From: Kasireddy, Vivek @ 2021-07-16 22:23 UTC (permalink / raw)
  To: Kim, Dongwon, qemu-devel@nongnu.org; +Cc: Kim, Dongwon

> 
> If guest fb is backed by dmabuf (blob-resource), the texture bound to the old context needs
> to be recreated in case the egl is re-initialized (e.g.
> new window for vc is created in case of detaching/reattaching of the tab)
> 
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> ---
>  ui/gtk-egl.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c index 32516b806c..5dd7c7e1f5 100644
> --- a/ui/gtk-egl.c
> +++ b/ui/gtk-egl.c
> @@ -129,6 +129,10 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
>              surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds);
>              surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds);
>          }
> +        if (vc->gfx.guest_fb.dmabuf) {
> +            vc->gfx.guest_fb.dmabuf->texture = 0;
[Kasireddy, Vivek] Shouldn't you call egl_dmabuf_release_texture() instead?


Thanks,
Vivek
> +            gd_egl_scanout_dmabuf(dcl, vc->gfx.guest_fb.dmabuf);
> +        }
>      }
> 
>      graphic_hw_update(dcl->con);
> --
> 2.17.1
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-07-16 22:23 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-07-03  0:28 [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
2021-07-03  0:28 ` [PATCH 2/3] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
2021-07-16 22:18   ` Kasireddy, Vivek
2021-07-03  0:28 ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
2021-07-06 23:34   ` [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
2021-07-16 22:23     ` Kasireddy, Vivek
2021-07-16 21:55   ` [PATCH 3/3] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Kasireddy, Vivek
2021-07-16 22:08 ` [PATCH 1/3] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Kasireddy, Vivek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).