When the Guest and Host are using Blob resources, there is a chance that they may use the underlying storage associated with a Blob at the same time leading to glitches such as flickering or tearing. To prevent these from happening, the Host needs to ensure that it waits until its Blit is completed by the Host GPU before letting the Guest reuse the Blob.
This should be the default behavior regardless of the type of Guest that is using Blob resources but would be particularly useful for Guests that are using frontbuffer rendering such as Linux with X or Windows 10, etc. The way it works is the Guest includes a fence as part of resource_flush and waits for it to be signalled. The Host will queue a repaint request and signal the fence after it completes waiting on the sync object associated with the Blit. v2: - Added more description in the cover letter - Removed the wait from resource_flush and included it in a gl_flushed() callback v3: - Instead of explicitly waiting on the sync object and stalling the thread, add the relevant fence fd to Qemu's main loop and wait for it to be signalled. (suggested by Gerd Hoffmann) Cc: Gerd Hoffmann <kra...@redhat.com> Cc: Dongwon Kim <dongwon....@intel.com> Cc: Tina Zhang <tina.zh...@intel.com> Vivek Kasireddy (5): ui/gtk: Create a common release_dmabuf helper ui/egl: Add egl helpers to help with synchronization ui: Create sync objects and fences only for blobs ui/gtk-egl: Wait for the draw signal for dmabuf blobs virtio-gpu: Add gl_flushed callback hw/display/virtio-gpu-udmabuf.c | 1 + hw/display/virtio-gpu.c | 32 ++++++++++++++++++++++-- include/ui/console.h | 3 +++ include/ui/egl-helpers.h | 3 +++ include/ui/gtk.h | 5 ++-- ui/egl-helpers.c | 26 ++++++++++++++++++++ ui/gtk-egl.c | 43 +++++++++++++++++++++++++++------ ui/gtk-gl-area.c | 20 +++++++++++++++ ui/gtk.c | 26 ++++++++++++++++++-- 9 files changed, 145 insertions(+), 14 deletions(-) -- 2.30.2