[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/3] ui/gtk: flush display pipeline before saving vmstate when bl
From: |
Dongwon Kim |
Subject: |
[PATCH 1/3] ui/gtk: flush display pipeline before saving vmstate when blob=true |
Date: |
Wed, 13 Dec 2023 20:24:17 +0000 |
If the guest state is paused before it gets a response for the current
scanout frame submission (resource-flush), it won't flush new frames
after being restored as it still waits for the old response, which is
accepted as a scanout render done signal. So it's needed to unblock
the current scanout render pipeline before the run state is changed
to make sure the guest receives the response for the current frame
submission.
v2: Giving some time for the fence to be signaled before flushing
the pipeline
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>
Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
ui/gtk.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/ui/gtk.c b/ui/gtk.c
index 810d7fc796..ea8d07833e 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -678,6 +678,25 @@ static const DisplayGLCtxOps egl_ctx_ops = {
static void gd_change_runstate(void *opaque, bool running, RunState state)
{
GtkDisplayState *s = opaque;
+ int i;
+
+ if (state == RUN_STATE_SAVE_VM) {
+ for (i = 0; i < s->nb_vcs; i++) {
+ VirtualConsole *vc = &s->vc[i];
+
+ if (vc->gfx.guest_fb.dmabuf &&
+ vc->gfx.guest_fb.dmabuf->fence_fd >= 0) {
+ eglClientWaitSync(qemu_egl_display,
+ vc->gfx.guest_fb.dmabuf->sync,
+ EGL_SYNC_FLUSH_COMMANDS_BIT_KHR,
+ 100000000);
+
+ /* force flushing current scanout blob rendering process
+ * just in case the fence is still not signaled */
+ gd_hw_gl_flushed(vc);
+ }
+ }
+ }
gd_update_caption(s);
}
--
2.34.1