On 2026/09/09 20:03, Marc-André Lureau wrote:
The draw_submitted flag on QemuDmaBuf is only used by the GTK display
backend to gate the draw pipeline and prevent gl_block refcount
imbalance when the guest submits frames faster than GTK draws them. It
is not an intrinsic property of the DMA-BUF but transient display
listener state.

Move it to VirtualGfxConsole, replacing the getter/setter calls with
direct struct member access. Reset the flag when the active dmabuf is
released in gd_gl_release_dmabuf().

Reviewed-by: Akihiko Odaki <[email protected]>
Signed-off-by: Marc-André Lureau <[email protected]>
---
  include/ui/dmabuf.h |  2 --
  include/ui/gtk.h    |  1 +
  ui/dmabuf.c         | 13 -------------
  ui/gtk-egl.c        | 13 ++++++-------
  ui/gtk-gl-area.c    | 10 +++++-----
  ui/gtk.c            |  1 +
  6 files changed, 13 insertions(+), 27 deletions(-)

diff --git a/include/ui/dmabuf.h b/include/ui/dmabuf.h
index 381583bd536c..b972099859f2 100644
--- a/include/ui/dmabuf.h
+++ b/include/ui/dmabuf.h
@@ -42,8 +42,6 @@ uint32_t qemu_dmabuf_get_backing_width(QemuDmaBuf *dmabuf);
  uint32_t qemu_dmabuf_get_backing_height(QemuDmaBuf *dmabuf);
  bool qemu_dmabuf_get_y0_top(QemuDmaBuf *dmabuf);
  bool qemu_dmabuf_get_allow_fences(QemuDmaBuf *dmabuf);
-bool qemu_dmabuf_get_draw_submitted(QemuDmaBuf *dmabuf);
  void qemu_dmabuf_set_texture(QemuDmaBuf *dmabuf, uint32_t texture);
-void qemu_dmabuf_set_draw_submitted(QemuDmaBuf *dmabuf, bool draw_submitted);
#endif
diff --git a/include/ui/gtk.h b/include/ui/gtk.h
index 4b4ef50e3701..b66b9ca5c519 100644
--- a/include/ui/gtk.h
+++ b/include/ui/gtk.h
@@ -59,6 +59,7 @@ typedef struct VirtualGfxConsole {
      bool scanout_mode;
      bool has_dmabuf;
      int gl_fence_fd;
+    bool draw_submitted;
  #endif
  } VirtualGfxConsole;
diff --git a/ui/dmabuf.c b/ui/dmabuf.c
index b61dc7ad2783..16063dc62ae8 100644
--- a/ui/dmabuf.c
+++ b/ui/dmabuf.c
@@ -26,7 +26,6 @@ struct QemuDmaBuf {
      uint32_t  backing_height;
      bool      y0_top;
      bool      allow_fences;
-    bool      draw_submitted;
  };
QemuDmaBuf *qemu_dmabuf_new(uint32_t width, uint32_t height,
@@ -212,21 +211,9 @@ bool qemu_dmabuf_get_allow_fences(QemuDmaBuf *dmabuf)
      return dmabuf->allow_fences;
  }
-bool qemu_dmabuf_get_draw_submitted(QemuDmaBuf *dmabuf)
-{
-    assert(dmabuf != NULL);
-
-    return dmabuf->draw_submitted;
-}
-
  void qemu_dmabuf_set_texture(QemuDmaBuf *dmabuf, uint32_t texture)
  {
      assert(dmabuf != NULL);
      dmabuf->texture = texture;
  }
-void qemu_dmabuf_set_draw_submitted(QemuDmaBuf *dmabuf, bool draw_submitted)
-{
-    assert(dmabuf != NULL);
-    dmabuf->draw_submitted = draw_submitted;
-}

Nit: This leaves a blank line at EOF.

Regards,
Akihiko Odaki

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index c671aabd11b3..8623181336e9 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -86,10 +86,10 @@ void gd_egl_draw(VirtualConsole *vc)
      if (vc->gfx.scanout_mode) {
  #ifdef CONFIG_GBM
          if (dmabuf) {
-            if (!qemu_dmabuf_get_draw_submitted(dmabuf)) {
+            if (!vc->gfx.draw_submitted) {
                  return;
              } else {
-                qemu_dmabuf_set_draw_submitted(dmabuf, false);
+                vc->gfx.draw_submitted = false;
              }
              qemu_console_hw_gl_block(vc->gfx.dcl.con, true);
          }
@@ -169,8 +169,7 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
  #endif
      }
- if (vc->gfx.guest_fb.dmabuf &&
-        qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
+    if (vc->gfx.guest_fb.dmabuf && vc->gfx.draw_submitted) {
          gd_egl_draw(vc);
          return;
      }
@@ -290,6 +289,7 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
if (qemu_dmabuf_get_allow_fences(dmabuf)) {
          vc->gfx.guest_fb.dmabuf = dmabuf;
+        vc->gfx.draw_submitted = false;
      }
  #endif
  }
@@ -406,9 +406,8 @@ void gd_egl_flush(DisplayChangeListener *dcl,
      VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
      GtkWidget *area = vc->gfx.drawing_area;
- if (vc->gfx.guest_fb.dmabuf &&
-        !qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
-        qemu_dmabuf_set_draw_submitted(vc->gfx.guest_fb.dmabuf, true);
+    if (vc->gfx.guest_fb.dmabuf && !vc->gfx.draw_submitted) {
+        vc->gfx.draw_submitted = true;
          gtk_egl_set_scanout_mode(vc, true);
      }
diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c
index 29d1b1e4116f..45c0c8c81a11 100644
--- a/ui/gtk-gl-area.c
+++ b/ui/gtk-gl-area.c
@@ -82,10 +82,10 @@ void gd_gl_area_draw(VirtualConsole *vc)
#ifdef CONFIG_GBM
          if (dmabuf) {
-            if (!qemu_dmabuf_get_draw_submitted(dmabuf)) {
+            if (!vc->gfx.draw_submitted) {
                  return;
              } else {
-                qemu_dmabuf_set_draw_submitted(dmabuf, false);
+                vc->gfx.draw_submitted = false;
              }
              qemu_console_hw_gl_block(vc->gfx.dcl.con, true);
          }
@@ -319,9 +319,8 @@ void gd_gl_area_scanout_flush(DisplayChangeListener *dcl,
  {
      VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
- if (vc->gfx.guest_fb.dmabuf &&
-        !qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
-        qemu_dmabuf_set_draw_submitted(vc->gfx.guest_fb.dmabuf, true);
+    if (vc->gfx.guest_fb.dmabuf && !vc->gfx.draw_submitted) {
+        vc->gfx.draw_submitted = true;
          gtk_gl_area_set_scanout_mode(vc, true);
      }
      gtk_gl_area_queue_render(GTK_GL_AREA(vc->gfx.drawing_area));
@@ -356,6 +355,7 @@ void gd_gl_area_scanout_dmabuf(DisplayChangeListener *dcl,
if (qemu_dmabuf_get_allow_fences(dmabuf)) {
          vc->gfx.guest_fb.dmabuf = dmabuf;
+        vc->gfx.draw_submitted = false;
      }
  #endif
  }
diff --git a/ui/gtk.c b/ui/gtk.c
index 1c75b9ea3c4d..55e45e8445bc 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -593,6 +593,7 @@ static void gd_gl_release_dmabuf(DisplayChangeListener *dcl,
      egl_dmabuf_release_texture(dmabuf);
      if (vc->gfx.guest_fb.dmabuf == dmabuf) {
          vc->gfx.guest_fb.dmabuf = NULL;
+        vc->gfx.draw_submitted = false;
      }
  #endif
  }



Reply via email to