Let's not use a timer but rather an additional thread to wait for sync. Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- hw/display/virtio-gpu-3d.c | 22 +++++++++++++++++++--- hw/display/virtio-gpu.c | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c index 728c940..42e62a8 100644 --- a/hw/display/virtio-gpu-3d.c +++ b/hw/display/virtio-gpu-3d.c @@ -773,17 +773,33 @@ void virtio_gpu_virgl_dp_destroy(VirtIOGPU *g) g_free(dp); } +static void render_poll_handler(void *opaque) +{ + virgl_renderer_poll(); +} + int virtio_gpu_virgl_init(VirtIOGPU *g) { int ret; + int flags = 0; + + if (VIRTIO_GPU_DATA_PLANE_OK(g->dp)) { + flags |= VIRGL_RENDERER_THREAD_SYNC; + } - ret = virgl_renderer_init(g, 0, &virtio_gpu_3d_cbs); + ret = virgl_renderer_init(g, flags, &virtio_gpu_3d_cbs); if (ret != 0) { return ret; } - g->fence_poll = timer_new_ms(QEMU_CLOCK_VIRTUAL, - virtio_gpu_fence_poll, g); + if (VIRTIO_GPU_DATA_PLANE_OK(g->dp)) { + aio_set_fd_handler(iothread_get_aio_context(g->iothread), + virgl_renderer_get_poll_fd(), + false, render_poll_handler, NULL, g); + } else { + g->fence_poll = timer_new_ms(QEMU_CLOCK_VIRTUAL, + virtio_gpu_fence_poll, g); + } if (virtio_gpu_stats_enabled(g->conf)) { g->print_stats = timer_new_ms(QEMU_CLOCK_VIRTUAL, diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 34d4a92..45fc018 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -897,7 +897,7 @@ static void virtio_gpu_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) virtio_gpu_process_cmdq(g); #ifdef CONFIG_VIRGL - if (g->use_virgl_renderer) { + if (g->use_virgl_renderer && !VIRTIO_GPU_DATA_PLANE_OK(g->dp)) { virtio_gpu_virgl_fence_poll(g); } #endif -- 2.9.0