virtio-gpu: add support to enable/disable command processing

So we can stop rendering for a while in case we have to.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
Gerd Hoffmann 2015-12-01 13:18:38 +01:00
parent 3eb769fd1c
commit 0c55a1cfd3
3 changed files with 8 additions and 2 deletions

View File

@ -554,7 +554,8 @@ static void virtio_gpu_fence_poll(void *opaque)
VirtIOGPU *g = opaque; VirtIOGPU *g = opaque;
virgl_renderer_poll(); virgl_renderer_poll();
if (g->inflight) { virtio_gpu_process_cmdq(g);
if (!QTAILQ_EMPTY(&g->cmdq) || !QTAILQ_EMPTY(&g->fenceq)) {
timer_mod(g->fence_poll, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 10); timer_mod(g->fence_poll, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 10);
} }
} }

View File

@ -755,7 +755,7 @@ static void virtio_gpu_handle_cursor_cb(VirtIODevice *vdev, VirtQueue *vq)
qemu_bh_schedule(g->cursor_bh); qemu_bh_schedule(g->cursor_bh);
} }
static void virtio_gpu_process_cmdq(VirtIOGPU *g) void virtio_gpu_process_cmdq(VirtIOGPU *g)
{ {
struct virtio_gpu_ctrl_command *cmd; struct virtio_gpu_ctrl_command *cmd;
@ -765,6 +765,9 @@ static void virtio_gpu_process_cmdq(VirtIOGPU *g)
/* process command */ /* process command */
VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd, VIRGL(g, virtio_gpu_virgl_process_cmd, virtio_gpu_simple_process_cmd,
g, cmd); g, cmd);
if (cmd->waiting) {
break;
}
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++;

View File

@ -76,6 +76,7 @@ struct virtio_gpu_ctrl_command {
VirtQueue *vq; VirtQueue *vq;
struct virtio_gpu_ctrl_hdr cmd_hdr; struct virtio_gpu_ctrl_hdr cmd_hdr;
uint32_t error; uint32_t error;
bool waiting;
bool finished; bool finished;
QTAILQ_ENTRY(virtio_gpu_ctrl_command) next; QTAILQ_ENTRY(virtio_gpu_ctrl_command) next;
}; };
@ -152,6 +153,7 @@ int virtio_gpu_create_mapping_iov(struct virtio_gpu_resource_attach_backing *ab,
struct virtio_gpu_ctrl_command *cmd, struct virtio_gpu_ctrl_command *cmd,
struct iovec **iov); struct iovec **iov);
void virtio_gpu_cleanup_mapping_iov(struct iovec *iov, uint32_t count); void virtio_gpu_cleanup_mapping_iov(struct iovec *iov, uint32_t count);
void virtio_gpu_process_cmdq(VirtIOGPU *g);
/* virtio-gpu-3d.c */ /* virtio-gpu-3d.c */
void virtio_gpu_virgl_process_cmd(VirtIOGPU *g, void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,