I came up with the same fix while looking at that bug before seeing Marc-André's patch. Then I tested Marc-André's patch. So for this patch,
Reviewed-by: Christophe Fergeau <cferg...@redhat.com> Tested-by: Christophe Fergeau <cferg...@redhat.com> On Thu, Feb 21, 2019 at 12:43:29PM +0100, Marc-André Lureau wrote: > Now that 2d commands are translated to 3d rendering, qemu must stop > sending 3d updates (from 2d) to Spice as well. > > Fixes: > https://bugzilla.redhat.com/show_bug.cgi?id=1674324 > > Cc: cferg...@redhat.com > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > include/hw/virtio/virtio-gpu.h | 1 - > hw/display/virtio-gpu-3d.c | 21 --------------------- > hw/display/virtio-gpu.c | 27 ++++++++++++++++++++++----- > 3 files changed, 22 insertions(+), 27 deletions(-) > > diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h > index a1cecd1df8..f8cd8ee96f 100644 > --- a/include/hw/virtio/virtio-gpu.h > +++ b/include/hw/virtio/virtio-gpu.h > @@ -169,7 +169,6 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g, > struct virtio_gpu_ctrl_command *cmd); > void virtio_gpu_virgl_fence_poll(VirtIOGPU *g); > void virtio_gpu_virgl_reset(VirtIOGPU *g); > -void virtio_gpu_gl_block(void *opaque, bool block); > int virtio_gpu_virgl_init(VirtIOGPU *g); > int virtio_gpu_virgl_get_num_capsets(VirtIOGPU *g); > #endif > diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c > index bc6e99c943..cb83479ed2 100644 > --- a/hw/display/virtio-gpu-3d.c > +++ b/hw/display/virtio-gpu-3d.c > @@ -404,11 +404,6 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g, > { > VIRTIO_GPU_FILL_CMD(cmd->cmd_hdr); > > - cmd->waiting = g->renderer_blocked; > - if (cmd->waiting) { > - return; > - } > - > virgl_renderer_force_ctx_0(); > switch (cmd->cmd_hdr.type) { > case VIRTIO_GPU_CMD_CTX_CREATE: > @@ -604,22 +599,6 @@ void virtio_gpu_virgl_reset(VirtIOGPU *g) > } > } > > -void virtio_gpu_gl_block(void *opaque, bool block) > -{ > - VirtIOGPU *g = opaque; > - > - if (block) { > - g->renderer_blocked++; > - } else { > - g->renderer_blocked--; > - } > - assert(g->renderer_blocked >= 0); > - > - if (g->renderer_blocked == 0) { > - virtio_gpu_process_cmdq(g); > - } > -} > - > int virtio_gpu_virgl_init(VirtIOGPU *g) > { > int ret; > diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c > index 8f4351420b..7ada4b83ac 100644 > --- a/hw/display/virtio-gpu.c > +++ b/hw/display/virtio-gpu.c > @@ -889,12 +889,15 @@ void virtio_gpu_process_cmdq(VirtIOGPU *g) > while (!QTAILQ_EMPTY(&g->cmdq)) { > cmd = QTAILQ_FIRST(&g->cmdq); > > - /* process command */ > - VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd, > - g, cmd); > + cmd->waiting = g->renderer_blocked; > if (cmd->waiting) { > break; > } > + > + /* process command */ > + VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd, > + g, cmd); > + > QTAILQ_REMOVE(&g->cmdq, cmd, next); > if (virtio_gpu_stats_enabled(g->conf)) { > g->stats.requests++; > @@ -1030,14 +1033,28 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t > idx, QemuUIInfo *info) > return 0; > } > > +static void virtio_gpu_gl_block(void *opaque, bool block) > +{ > + VirtIOGPU *g = opaque; > + > + if (block) { > + g->renderer_blocked++; > + } else { > + g->renderer_blocked--; > + } > + assert(g->renderer_blocked >= 0); > + > + if (g->renderer_blocked == 0) { > + virtio_gpu_process_cmdq(g); > + } > +} > + > const GraphicHwOps virtio_gpu_ops = { > .invalidate = virtio_gpu_invalidate_display, > .gfx_update = virtio_gpu_update_display, > .text_update = virtio_gpu_text_update, > .ui_info = virtio_gpu_ui_info, > -#ifdef CONFIG_VIRGL > .gl_block = virtio_gpu_gl_block, > -#endif > }; > > static const VMStateDescription vmstate_virtio_gpu_scanout = { > -- > 2.21.0.rc1 > >
signature.asc
Description: PGP signature