From: Dongwon Kim <[email protected]>
This partially reverts commit 77bf310084dad38b3a2badf01766c659056f1cf2
which causes some guest display corruption when gtk-gl-area
is used for GTK rendering (e.g. Wayland Compositor) possibly due to
simulataneous accesses on the guest frame buffer by host compositor
and the guest.
Fixes: 77bf310084 ("ui/gtk: Draw guest frame at refresh cycle")
Reported-by: Dmitry Osipenko <[email protected]>
Reported-by: Alex Bennée <[email protected]>
Tested-by: Alex Bennée <[email protected]>
Tested-by: Dmitry Osipenko <[email protected]>
Reviewed-by: Alex Bennée <[email protected]>
Reviewed-by: Dmitry Osipenko <[email protected]>
Cc: Marc-André Lureau <[email protected]>
Cc: Vivek Kasireddy <[email protected]>
Signed-off-by: Dongwon Kim <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Alex Bennée <[email protected]>
Message-ID: <[email protected]>
Cc: [email protected]
---
vpre-PR:
- added large comment where draw command was removed
---
ui/gtk-gl-area.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c
index 05fc38096ec..cd86022d264 100644
--- a/ui/gtk-gl-area.c
+++ b/ui/gtk-gl-area.c
@@ -165,7 +165,22 @@ void gd_gl_area_refresh(DisplayChangeListener *dcl)
if (vc->gfx.guest_fb.dmabuf &&
qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
- gd_gl_area_draw(vc);
+ /*
+ * gd_egl_refresh() calls gd_egl_draw() if a DMA-BUF draw has already
+ * been submitted, but this function does not call gd_gl_area_draw() in
+ * such a case due to display corruption.
+ *
+ * Calling gd_gl_area_draw() is necessary to prevent a situation where
+ * there is a scheduled draw event but it won't happen bacause the
window
+ * is currently in inactive state (minimized or tabified). If draw is
not
+ * done for a long time, gl_block timeout and/or fence timeout (on the
+ * guest) will happen eventually.
+ *
+ * However, it is found that calling gd_gl_area_draw() here causes
guest
+ * display corruption on a Wayland Compositor. The display corruption
is
+ * more serious than the possible fence timeout so gd_gl_area_draw() is
+ * omitted for now.
+ */
return;
}
--
2.47.3