qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] ui/gtk-egl: fix for untab/tab problem
@ 2021-09-17  0:13 Dongwon Kim
  2021-09-17  0:13 ` [PATCH 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-09-17  0:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim

This series fixes several problems happening while doing VC untab/tab.

Dongwon Kim (4):
  ui/gtk-egl: un-tab and re-tab should destroy egl surface and context
  ui/gtk-egl: make sure the right context is set as the current
  ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound
  ui/gtk-egl: guest fb texture needs to be regenerated when
    reinitializing egl

 ui/gtk-egl.c | 10 ++++++++++
 ui/gtk.c     | 19 +++++++++++++++++++
 2 files changed, 29 insertions(+)

-- 
2.17.1



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

* [PATCH 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context
  2021-09-17  0:13 [PATCH 0/4] ui/gtk-egl: fix for untab/tab problem Dongwon Kim
@ 2021-09-17  0:13 ` Dongwon Kim
  2021-11-02 13:37   ` Gerd Hoffmann
  2021-09-17  0:13 ` [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Dongwon Kim @ 2021-09-17  0:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: Khairul Anuar Romli, Dongwon Kim, Gerd Hoffmann

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.

Cc: Gerd Hoffmann <kraxel@redhat.com>
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 b0564d80c1..92df3d4c5c 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1242,6 +1242,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;
 }
 
@@ -1271,6 +1279,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] 10+ messages in thread

* [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current
  2021-09-17  0:13 [PATCH 0/4] ui/gtk-egl: fix for untab/tab problem Dongwon Kim
  2021-09-17  0:13 ` [PATCH 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
@ 2021-09-17  0:13 ` Dongwon Kim
  2021-09-17  0:13 ` [PATCH 3/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
  2021-09-17  0:13 ` [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
  3 siblings, 0 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-09-17  0:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim, Gerd Hoffmann

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

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

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index 72ce5e1f8f..7c9629d6cc 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -139,6 +139,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);
         }
     }
@@ -165,6 +166,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;
@@ -224,6 +227,9 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
 #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] 10+ messages in thread

* [PATCH 3/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound
  2021-09-17  0:13 [PATCH 0/4] ui/gtk-egl: fix for untab/tab problem Dongwon Kim
  2021-09-17  0:13 ` [PATCH 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
  2021-09-17  0:13 ` [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
@ 2021-09-17  0:13 ` Dongwon Kim
  2021-09-17  0:13 ` [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
  3 siblings, 0 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-09-17  0:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim, Gerd Hoffmann

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

Cc: Gerd Hoffmann <kraxel@redhat.com>
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 92df3d4c5c..5346c331f4 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -778,6 +778,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] 10+ messages in thread

* [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl
  2021-09-17  0:13 [PATCH 0/4] ui/gtk-egl: fix for untab/tab problem Dongwon Kim
                   ` (2 preceding siblings ...)
  2021-09-17  0:13 ` [PATCH 3/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
@ 2021-09-17  0:13 ` Dongwon Kim
  3 siblings, 0 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-09-17  0:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim, Gerd Hoffmann

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)

v2: call egl_dmabuf_release_texutre instead of putting 0 to dmabuf->texture
    (Vivek Kasireddy)

Cc: Gerd Hoffmann <kraxel@redhat.com>
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 7c9629d6cc..8c55ed18fb 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -142,6 +142,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) {
+            egl_dmabuf_release_texture(vc->gfx.guest_fb.dmabuf);
+            gd_egl_scanout_dmabuf(dcl, vc->gfx.guest_fb.dmabuf);
+        }
     }
 
     graphic_hw_update(dcl->con);
-- 
2.17.1



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

* Re: [PATCH 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context
  2021-09-17  0:13 ` [PATCH 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
@ 2021-11-02 13:37   ` Gerd Hoffmann
  2021-11-02 22:36     ` [PATCH v2 " Dongwon Kim
  0 siblings, 1 reply; 10+ messages in thread
From: Gerd Hoffmann @ 2021-11-02 13:37 UTC (permalink / raw)
  To: Dongwon Kim; +Cc: Khairul Anuar Romli, qemu-devel

On Thu, Sep 16, 2021 at 05:13:17PM -0700, Dongwon Kim wrote:
> 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.

Fails to build on windows (probably also on --disable-opengl builds).

take care,
  Gerd



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

* [PATCH v2 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context
  2021-11-02 13:37   ` Gerd Hoffmann
@ 2021-11-02 22:36     ` Dongwon Kim
  2021-11-02 22:36       ` [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
                         ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-11-02 22:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: Khairul Anuar Romli, Dongwon Kim, Gerd Hoffmann

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.

v2: enabling opengl specific routines only when CONFIG_OPENGL is set

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

diff --git a/ui/gtk.c b/ui/gtk.c
index b0564d80c1..8da673c18c 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1242,6 +1242,16 @@ static gboolean gd_tab_window_close(GtkWidget *widget, GdkEvent *event,
                                     vc->tab_item, vc->label);
     gtk_widget_destroy(vc->window);
     vc->window = NULL;
+#if defined(CONFIG_OPENGL)
+    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;
+    }
+#endif
     return TRUE;
 }
 
@@ -1271,6 +1281,16 @@ 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 defined(CONFIG_OPENGL)
+        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;
+        }
+#endif
         gd_widget_reparent(s->notebook, vc->window, vc->tab_item);
 
         g_signal_connect(vc->window, "delete-event",
-- 
2.30.2



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

* [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current
  2021-11-02 22:36     ` [PATCH v2 " Dongwon Kim
@ 2021-11-02 22:36       ` Dongwon Kim
  2021-11-02 22:36       ` [PATCH 3/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
  2021-11-02 22:36       ` [PATCH 4/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
  2 siblings, 0 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-11-02 22:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim, Gerd Hoffmann

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

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

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index 72ce5e1f8f..7c9629d6cc 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -139,6 +139,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);
         }
     }
@@ -165,6 +166,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;
@@ -224,6 +227,9 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
 #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.30.2



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

* [PATCH 3/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl
  2021-11-02 22:36     ` [PATCH v2 " Dongwon Kim
  2021-11-02 22:36       ` [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
@ 2021-11-02 22:36       ` Dongwon Kim
  2021-11-02 22:36       ` [PATCH 4/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
  2 siblings, 0 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-11-02 22:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim, Gerd Hoffmann

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)

v2: call egl_dmabuf_release_texutre instead of putting 0 to dmabuf->texture
    (Vivek Kasireddy)

Cc: Gerd Hoffmann <kraxel@redhat.com>
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 7c9629d6cc..8c55ed18fb 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -142,6 +142,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) {
+            egl_dmabuf_release_texture(vc->gfx.guest_fb.dmabuf);
+            gd_egl_scanout_dmabuf(dcl, vc->gfx.guest_fb.dmabuf);
+        }
     }
 
     graphic_hw_update(dcl->con);
-- 
2.30.2



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

* [PATCH 4/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound
  2021-11-02 22:36     ` [PATCH v2 " Dongwon Kim
  2021-11-02 22:36       ` [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
  2021-11-02 22:36       ` [PATCH 3/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
@ 2021-11-02 22:36       ` Dongwon Kim
  2 siblings, 0 replies; 10+ messages in thread
From: Dongwon Kim @ 2021-11-02 22:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim, Gerd Hoffmann

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

Cc: Gerd Hoffmann <kraxel@redhat.com>
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 8da673c18c..d2892ea6b4 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -778,6 +778,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.30.2



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

end of thread, other threads:[~2021-11-02 23:35 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-09-17  0:13 [PATCH 0/4] ui/gtk-egl: fix for untab/tab problem Dongwon Kim
2021-09-17  0:13 ` [PATCH 1/4] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
2021-11-02 13:37   ` Gerd Hoffmann
2021-11-02 22:36     ` [PATCH v2 " Dongwon Kim
2021-11-02 22:36       ` [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
2021-11-02 22:36       ` [PATCH 3/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
2021-11-02 22:36       ` [PATCH 4/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
2021-09-17  0:13 ` [PATCH 2/4] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
2021-09-17  0:13 ` [PATCH 3/4] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
2021-09-17  0:13 ` [PATCH 4/4] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim

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).