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: cfergeau@redhat.com
Signed-off-by: Marc-André Lureau <marcandre.lureau@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
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 <cfergeau@redhat.com>
Tested-by: Christophe Fergeau <cfergeau@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: cfergeau@redhat.com
> Signed-off-by: Marc-André Lureau <marcandre.lureau@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
>
>
© 2016 - 2025 Red Hat, Inc.