Re: [Qemu-devel] [PATCH 3/4] virtio-gpu: block both 2d and 3d rendering

2019-02-21 Thread Christophe Fergeau
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 
Tested-by: Christophe Fergeau 

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 
> ---
>  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


[Qemu-devel] [PATCH 3/4] virtio-gpu: block both 2d and 3d rendering

2019-02-21 Thread Marc-André Lureau
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 
---
 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