ui/gtk-gl-area: Remove extra draw call in refresh

This partially reverts commit 77bf310084
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 <dmitry.osipenko@collabora.com>
Reported-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>
Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
Message-Id: <20250214170813.2234754-1-dongwon.kim@intel.com>
Message-ID: <20250603110204.838117-12-alex.bennee@linaro.org>
Cc: qemu-stable@nongnu.org
Message-ID: <20251016150357.876415-6-alex.bennee@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
Dongwon Kim
2025-10-16 16:03:50 +01:00
committed by Alex Bennée
parent 77dc9d662f
commit 0c6d6d79a5

View File

@@ -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;
}