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; -} 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 } -- 2.55.0.543.g5ebe2ebe4ea8
