virtio-gpu: block both 2d and 3d rendering

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>
Reviewed-by: Christophe Fergeau <cfergeau@redhat.com>
Tested-by: Christophe Fergeau <cfergeau@redhat.com>
Message-id: 20190221114330.17968-4-marcandre.lureau@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Marc-André Lureau 2019-02-21 12:43:29 +01:00 committed by Gerd Hoffmann
parent 4a9102c5eb
commit ad341aacbf
3 changed files with 22 additions and 27 deletions

View File

@ -404,11 +404,6 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
{ {
VIRTIO_GPU_FILL_CMD(cmd->cmd_hdr); VIRTIO_GPU_FILL_CMD(cmd->cmd_hdr);
cmd->waiting = g->renderer_blocked;
if (cmd->waiting) {
return;
}
virgl_renderer_force_ctx_0(); virgl_renderer_force_ctx_0();
switch (cmd->cmd_hdr.type) { switch (cmd->cmd_hdr.type) {
case VIRTIO_GPU_CMD_CTX_CREATE: 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 virtio_gpu_virgl_init(VirtIOGPU *g)
{ {
int ret; int ret;

View File

@ -889,12 +889,15 @@ void virtio_gpu_process_cmdq(VirtIOGPU *g)
while (!QTAILQ_EMPTY(&g->cmdq)) { while (!QTAILQ_EMPTY(&g->cmdq)) {
cmd = QTAILQ_FIRST(&g->cmdq); cmd = QTAILQ_FIRST(&g->cmdq);
/* process command */ cmd->waiting = g->renderer_blocked;
VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd,
g, cmd);
if (cmd->waiting) { if (cmd->waiting) {
break; break;
} }
/* process command */
VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd,
g, cmd);
QTAILQ_REMOVE(&g->cmdq, cmd, next); QTAILQ_REMOVE(&g->cmdq, cmd, next);
if (virtio_gpu_stats_enabled(g->conf)) { if (virtio_gpu_stats_enabled(g->conf)) {
g->stats.requests++; g->stats.requests++;
@ -1030,14 +1033,28 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t idx, QemuUIInfo *info)
return 0; 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 = { const GraphicHwOps virtio_gpu_ops = {
.invalidate = virtio_gpu_invalidate_display, .invalidate = virtio_gpu_invalidate_display,
.gfx_update = virtio_gpu_update_display, .gfx_update = virtio_gpu_update_display,
.text_update = virtio_gpu_text_update, .text_update = virtio_gpu_text_update,
.ui_info = virtio_gpu_ui_info, .ui_info = virtio_gpu_ui_info,
#ifdef CONFIG_VIRGL
.gl_block = virtio_gpu_gl_block, .gl_block = virtio_gpu_gl_block,
#endif
}; };
static const VMStateDescription vmstate_virtio_gpu_scanout = { static const VMStateDescription vmstate_virtio_gpu_scanout = {

View File

@ -169,7 +169,6 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
struct virtio_gpu_ctrl_command *cmd); struct virtio_gpu_ctrl_command *cmd);
void virtio_gpu_virgl_fence_poll(VirtIOGPU *g); void virtio_gpu_virgl_fence_poll(VirtIOGPU *g);
void virtio_gpu_virgl_reset(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_init(VirtIOGPU *g);
int virtio_gpu_virgl_get_num_capsets(VirtIOGPU *g); int virtio_gpu_virgl_get_num_capsets(VirtIOGPU *g);
#endif #endif