[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 1/2] virtio-gpu: delay virglrenderer reset when bloc
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 1/2] virtio-gpu: delay virglrenderer reset when blocked. |
Date: |
Thu, 14 Mar 2019 07:11:18 +0100 |
If renderer_blocked is set do not call virtio_gpu_virgl_reset().
Instead set a flag indicating that virglrenderer needs a reset.
When renderer_blocked gets cleared do the actual reset call.
Without this we can trigger an assert in spice due to calling
spice_qxl_gl_scanout() while another operation is still running:
spice_qxl_gl_scanout: condition `qxl_state->gl_draw_cookie ==
GL_DRAW_COOKIE_INVALID' failed
Signed-off-by: Gerd Hoffmann <address@hidden>
---
include/hw/virtio/virtio-gpu.h | 1 +
hw/display/virtio-gpu.c | 12 +++++++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index ce0ca7217175..60425c5d58dc 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -113,6 +113,7 @@ typedef struct VirtIOGPU {
bool use_virgl_renderer;
bool renderer_inited;
int renderer_blocked;
+ bool renderer_reset;
QEMUTimer *fence_poll;
QEMUTimer *print_stats;
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 4dbf48e42482..fbd8d908ad32 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1084,6 +1084,12 @@ static void virtio_gpu_gl_block(void *opaque, bool block)
assert(g->renderer_blocked >= 0);
if (g->renderer_blocked == 0) {
+#ifdef CONFIG_VIRGL
+ if (g->renderer_reset) {
+ g->renderer_reset = false;
+ virtio_gpu_virgl_reset(g);
+ }
+#endif
virtio_gpu_process_cmdq(g);
}
}
@@ -1368,7 +1374,11 @@ static void virtio_gpu_reset(VirtIODevice *vdev)
#ifdef CONFIG_VIRGL
if (g->use_virgl_renderer) {
- virtio_gpu_virgl_reset(g);
+ if (g->renderer_blocked) {
+ g->renderer_reset = true;
+ } else {
+ virtio_gpu_virgl_reset(g);
+ }
g->use_virgl_renderer = 0;
}
#endif
--
2.18.1