|
Pablo Greco |
e6a3ae |
From 6bf01418f12a88167ec2a3244ca7b245a53c60ae Mon Sep 17 00:00:00 2001
|
|
Pablo Greco |
e6a3ae |
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
|
|
Pablo Greco |
e6a3ae |
Date: Wed, 16 Oct 2019 13:53:27 +0100
|
|
Pablo Greco |
e6a3ae |
Subject: [PATCH 1/2] virtio-gpu: block both 2d and 3d rendering
|
|
Pablo Greco |
e6a3ae |
MIME-Version: 1.0
|
|
Pablo Greco |
e6a3ae |
Content-Type: text/plain; charset=UTF-8
|
|
Pablo Greco |
e6a3ae |
Content-Transfer-Encoding: 8bit
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
RH-Author: Marc-André Lureau <marcandre.lureau@redhat.com>
|
|
Pablo Greco |
e6a3ae |
Message-id: <20191016135327.23601-1-marcandre.lureau@redhat.com>
|
|
Pablo Greco |
e6a3ae |
Patchwork-id: 91814
|
|
Pablo Greco |
e6a3ae |
O-Subject: [RHEL-8.2.0 qemu-kvm PATCH] virtio-gpu: block both 2d and 3d rendering
|
|
Pablo Greco |
e6a3ae |
Bugzilla: 1674324
|
|
Pablo Greco |
e6a3ae |
RH-Acked-by: John Snow <jsnow@redhat.com>
|
|
Pablo Greco |
e6a3ae |
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
Pablo Greco |
e6a3ae |
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1674324
|
|
Pablo Greco |
e6a3ae |
BRANCH: rhel-8.2.0
|
|
Pablo Greco |
e6a3ae |
UPSTREAM: ad341aacbf4b119a88e0f9d5a1f753d6ed0fdd86
|
|
Pablo Greco |
e6a3ae |
BREW: http://brewweb.devel.redhat.com/brew/taskinfo?taskID=24095898
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
Now that 2d commands are translated to 3d rendering, qemu must stop
|
|
Pablo Greco |
e6a3ae |
sending 3d updates (from 2d) to Spice as well.
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
Fixes:
|
|
Pablo Greco |
e6a3ae |
https://bugzilla.redhat.com/show_bug.cgi?id=1674324
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
Cc: cfergeau@redhat.com
|
|
Pablo Greco |
e6a3ae |
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
|
Pablo Greco |
e6a3ae |
Reviewed-by: Christophe Fergeau <cfergeau@redhat.com>
|
|
Pablo Greco |
e6a3ae |
Tested-by: Christophe Fergeau <cfergeau@redhat.com>
|
|
Pablo Greco |
e6a3ae |
Message-id: 20190221114330.17968-4-marcandre.lureau@redhat.com
|
|
Pablo Greco |
e6a3ae |
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
(cherry picked from commit ad341aacbf4b119a88e0f9d5a1f753d6ed0fdd86)
|
|
Pablo Greco |
e6a3ae |
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
|
Pablo Greco |
e6a3ae |
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
Pablo Greco |
e6a3ae |
---
|
|
Pablo Greco |
e6a3ae |
hw/display/virtio-gpu-3d.c | 21 ---------------------
|
|
Pablo Greco |
e6a3ae |
hw/display/virtio-gpu.c | 27 ++++++++++++++++++++++-----
|
|
Pablo Greco |
e6a3ae |
include/hw/virtio/virtio-gpu.h | 1 -
|
|
Pablo Greco |
e6a3ae |
3 files changed, 22 insertions(+), 27 deletions(-)
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c
|
|
Pablo Greco |
e6a3ae |
index 55d7640..9654c04 100644
|
|
Pablo Greco |
e6a3ae |
--- a/hw/display/virtio-gpu-3d.c
|
|
Pablo Greco |
e6a3ae |
+++ b/hw/display/virtio-gpu-3d.c
|
|
Pablo Greco |
e6a3ae |
@@ -404,11 +404,6 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
|
|
Pablo Greco |
e6a3ae |
{
|
|
Pablo Greco |
e6a3ae |
VIRTIO_GPU_FILL_CMD(cmd->cmd_hdr);
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
- cmd->waiting = g->renderer_blocked;
|
|
Pablo Greco |
e6a3ae |
- if (cmd->waiting) {
|
|
Pablo Greco |
e6a3ae |
- return;
|
|
Pablo Greco |
e6a3ae |
- }
|
|
Pablo Greco |
e6a3ae |
-
|
|
Pablo Greco |
e6a3ae |
virgl_renderer_force_ctx_0();
|
|
Pablo Greco |
e6a3ae |
switch (cmd->cmd_hdr.type) {
|
|
Pablo Greco |
e6a3ae |
case VIRTIO_GPU_CMD_CTX_CREATE:
|
|
Pablo Greco |
e6a3ae |
@@ -604,22 +599,6 @@ void virtio_gpu_virgl_reset(VirtIOGPU *g)
|
|
Pablo Greco |
e6a3ae |
}
|
|
Pablo Greco |
e6a3ae |
}
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
-void virtio_gpu_gl_block(void *opaque, bool block)
|
|
Pablo Greco |
e6a3ae |
-{
|
|
Pablo Greco |
e6a3ae |
- VirtIOGPU *g = opaque;
|
|
Pablo Greco |
e6a3ae |
-
|
|
Pablo Greco |
e6a3ae |
- if (block) {
|
|
Pablo Greco |
e6a3ae |
- g->renderer_blocked++;
|
|
Pablo Greco |
e6a3ae |
- } else {
|
|
Pablo Greco |
e6a3ae |
- g->renderer_blocked--;
|
|
Pablo Greco |
e6a3ae |
- }
|
|
Pablo Greco |
e6a3ae |
- assert(g->renderer_blocked >= 0);
|
|
Pablo Greco |
e6a3ae |
-
|
|
Pablo Greco |
e6a3ae |
- if (g->renderer_blocked == 0) {
|
|
Pablo Greco |
e6a3ae |
- virtio_gpu_process_cmdq(g);
|
|
Pablo Greco |
e6a3ae |
- }
|
|
Pablo Greco |
e6a3ae |
-}
|
|
Pablo Greco |
e6a3ae |
-
|
|
Pablo Greco |
e6a3ae |
int virtio_gpu_virgl_init(VirtIOGPU *g)
|
|
Pablo Greco |
e6a3ae |
{
|
|
Pablo Greco |
e6a3ae |
int ret;
|
|
Pablo Greco |
e6a3ae |
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
|
|
Pablo Greco |
e6a3ae |
index 07712d0..416ef80 100644
|
|
Pablo Greco |
e6a3ae |
--- a/hw/display/virtio-gpu.c
|
|
Pablo Greco |
e6a3ae |
+++ b/hw/display/virtio-gpu.c
|
|
Pablo Greco |
e6a3ae |
@@ -888,12 +888,15 @@ void virtio_gpu_process_cmdq(VirtIOGPU *g)
|
|
Pablo Greco |
e6a3ae |
while (!QTAILQ_EMPTY(&g->cmdq)) {
|
|
Pablo Greco |
e6a3ae |
cmd = QTAILQ_FIRST(&g->cmdq);
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
- /* process command */
|
|
Pablo Greco |
e6a3ae |
- VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd,
|
|
Pablo Greco |
e6a3ae |
- g, cmd);
|
|
Pablo Greco |
e6a3ae |
+ cmd->waiting = g->renderer_blocked;
|
|
Pablo Greco |
e6a3ae |
if (cmd->waiting) {
|
|
Pablo Greco |
e6a3ae |
break;
|
|
Pablo Greco |
e6a3ae |
}
|
|
Pablo Greco |
e6a3ae |
+
|
|
Pablo Greco |
e6a3ae |
+ /* process command */
|
|
Pablo Greco |
e6a3ae |
+ VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd,
|
|
Pablo Greco |
e6a3ae |
+ g, cmd);
|
|
Pablo Greco |
e6a3ae |
+
|
|
Pablo Greco |
e6a3ae |
QTAILQ_REMOVE(&g->cmdq, cmd, next);
|
|
Pablo Greco |
e6a3ae |
if (virtio_gpu_stats_enabled(g->conf)) {
|
|
Pablo Greco |
e6a3ae |
g->stats.requests++;
|
|
Pablo Greco |
e6a3ae |
@@ -1029,14 +1032,28 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t idx, QemuUIInfo *info)
|
|
Pablo Greco |
e6a3ae |
return 0;
|
|
Pablo Greco |
e6a3ae |
}
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
+static void virtio_gpu_gl_block(void *opaque, bool block)
|
|
Pablo Greco |
e6a3ae |
+{
|
|
Pablo Greco |
e6a3ae |
+ VirtIOGPU *g = opaque;
|
|
Pablo Greco |
e6a3ae |
+
|
|
Pablo Greco |
e6a3ae |
+ if (block) {
|
|
Pablo Greco |
e6a3ae |
+ g->renderer_blocked++;
|
|
Pablo Greco |
e6a3ae |
+ } else {
|
|
Pablo Greco |
e6a3ae |
+ g->renderer_blocked--;
|
|
Pablo Greco |
e6a3ae |
+ }
|
|
Pablo Greco |
e6a3ae |
+ assert(g->renderer_blocked >= 0);
|
|
Pablo Greco |
e6a3ae |
+
|
|
Pablo Greco |
e6a3ae |
+ if (g->renderer_blocked == 0) {
|
|
Pablo Greco |
e6a3ae |
+ virtio_gpu_process_cmdq(g);
|
|
Pablo Greco |
e6a3ae |
+ }
|
|
Pablo Greco |
e6a3ae |
+}
|
|
Pablo Greco |
e6a3ae |
+
|
|
Pablo Greco |
e6a3ae |
const GraphicHwOps virtio_gpu_ops = {
|
|
Pablo Greco |
e6a3ae |
.invalidate = virtio_gpu_invalidate_display,
|
|
Pablo Greco |
e6a3ae |
.gfx_update = virtio_gpu_update_display,
|
|
Pablo Greco |
e6a3ae |
.text_update = virtio_gpu_text_update,
|
|
Pablo Greco |
e6a3ae |
.ui_info = virtio_gpu_ui_info,
|
|
Pablo Greco |
e6a3ae |
-#ifdef CONFIG_VIRGL
|
|
Pablo Greco |
e6a3ae |
.gl_block = virtio_gpu_gl_block,
|
|
Pablo Greco |
e6a3ae |
-#endif
|
|
Pablo Greco |
e6a3ae |
};
|
|
Pablo Greco |
e6a3ae |
|
|
Pablo Greco |
e6a3ae |
static const VMStateDescription vmstate_virtio_gpu_scanout = {
|
|
Pablo Greco |
e6a3ae |
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
|
|
Pablo Greco |
e6a3ae |
index f95f8ce..bbeddd7 100644
|
|
Pablo Greco |
e6a3ae |
--- a/include/hw/virtio/virtio-gpu.h
|
|
Pablo Greco |
e6a3ae |
+++ b/include/hw/virtio/virtio-gpu.h
|
|
Pablo Greco |
e6a3ae |
@@ -171,7 +171,6 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
|
|
Pablo Greco |
e6a3ae |
struct virtio_gpu_ctrl_command *cmd);
|
|
Pablo Greco |
e6a3ae |
void virtio_gpu_virgl_fence_poll(VirtIOGPU *g);
|
|
Pablo Greco |
e6a3ae |
void virtio_gpu_virgl_reset(VirtIOGPU *g);
|
|
Pablo Greco |
e6a3ae |
-void virtio_gpu_gl_block(void *opaque, bool block);
|
|
Pablo Greco |
e6a3ae |
int virtio_gpu_virgl_init(VirtIOGPU *g);
|
|
Pablo Greco |
e6a3ae |
int virtio_gpu_virgl_get_num_capsets(VirtIOGPU *g);
|
|
Pablo Greco |
e6a3ae |
#endif
|
|
Pablo Greco |
e6a3ae |
--
|
|
Pablo Greco |
e6a3ae |
1.8.3.1
|
|
Pablo Greco |
e6a3ae |
|