[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/18] virtio-gpu: use a bh for cursor modifications
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 11/18] virtio-gpu: use a bh for cursor modifications |
Date: |
Mon, 5 Sep 2016 02:20:32 +0400 |
This will allow to schedule the bh from the iothread, and with the
bitmaps, it will batch the cursors modifications.
Signed-off-by: Marc-André Lureau <address@hidden>
---
hw/display/virtio-gpu.c | 50 +++++++++++++++++++++++++++++++++++++++---
include/hw/virtio/virtio-gpu.h | 3 +++
2 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 9a768c5..ff33d83 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -94,6 +94,37 @@ static void update_cursor_data_virgl(VirtIOGPU *g,
#endif
+/* called with display_info_lock */
+static void scanout_set_cursor(int i, void *opaque)
+{
+ VirtIOGPU *g = opaque;
+ struct virtio_gpu_scanout *s = &g->scanout[i];
+
+ dpy_mouse_set(s->con, s->cursor.pos.x, s->cursor.pos.y,
+ s->cursor.resource_id ? 1 : 0);
+}
+
+/* called with display_info_lock */
+static void scanout_define_cursor(int i, void *opaque)
+{
+ VirtIOGPU *g = opaque;
+ struct virtio_gpu_scanout *s = &g->scanout[i];
+
+ dpy_cursor_define(s->con, s->current_cursor);
+}
+
+static void virtio_gpu_update_cursor_bh(void *opaque)
+{
+ VirtIOGPU *g = opaque;
+
+ qemu_mutex_lock(&g->display_info_lock);
+ bitmap_foreach(g->define_cursor_bitmap, g->conf.max_outputs,
+ scanout_define_cursor, g);
+ bitmap_foreach(g->set_cursor_bitmap, g->conf.max_outputs,
+ scanout_set_cursor, g);
+ qemu_mutex_unlock(&g->display_info_lock);
+}
+
static void update_cursor(VirtIOGPU *g, struct virtio_gpu_update_cursor
*cursor)
{
struct virtio_gpu_scanout *s;
@@ -124,15 +155,19 @@ static void update_cursor(VirtIOGPU *g, struct
virtio_gpu_update_cursor *cursor)
VIRGL(g, update_cursor_data_virgl, update_cursor_data_simple,
g, s, cursor->resource_id);
}
- dpy_cursor_define(s->con, s->current_cursor);
s->cursor = *cursor;
+
+ set_bit(cursor->pos.scanout_id, g->define_cursor_bitmap);
} else {
s->cursor.pos.x = cursor->pos.x;
s->cursor.pos.y = cursor->pos.y;
+ s->cursor.resource_id = cursor->resource_id;
}
- dpy_mouse_set(s->con, cursor->pos.x, cursor->pos.y,
- cursor->resource_id ? 1 : 0);
+
+ set_bit(cursor->pos.scanout_id, g->set_cursor_bitmap);
+ qemu_bh_schedule(g->update_cursor_bh);
+
qemu_mutex_unlock(&g->display_info_lock);
}
@@ -1171,6 +1206,10 @@ static void virtio_gpu_device_realize(DeviceState *qdev,
Error **errp)
g->ctrl_bh = qemu_bh_new(virtio_gpu_ctrl_bh, g);
g->cursor_bh = qemu_bh_new(virtio_gpu_cursor_bh, g);
+ g->update_cursor_bh = qemu_bh_new(virtio_gpu_update_cursor_bh, g);
+ g->set_cursor_bitmap = bitmap_new(g->conf.max_outputs);
+ g->define_cursor_bitmap = bitmap_new(g->conf.max_outputs);
+
QTAILQ_INIT(&g->reslist);
QTAILQ_INIT(&g->cmdq);
QTAILQ_INIT(&g->fenceq);
@@ -1196,6 +1235,11 @@ static void virtio_gpu_device_realize(DeviceState *qdev,
Error **errp)
static void virtio_gpu_device_unrealize(DeviceState *qdev, Error **errp)
{
VirtIOGPU *g = VIRTIO_GPU(qdev);
+
+ qemu_bh_delete(g->update_cursor_bh);
+ g_free(g->set_cursor_bitmap);
+ g_free(g->define_cursor_bitmap);
+
if (g->migration_blocker) {
migrate_del_blocker(g->migration_blocker);
error_free(g->migration_blocker);
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index 406a4e8..8bddc93 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -108,8 +108,11 @@ typedef struct VirtIOGPU {
QEMUBH *ctrl_bh;
QEMUBH *cursor_bh;
+ QEMUBH *update_cursor_bh;
VirtQueue *ctrl_vq;
VirtQueue *cursor_vq;
+ unsigned long *define_cursor_bitmap;
+ unsigned long *set_cursor_bitmap;
int enable;
--
2.9.0
- [Qemu-devel] [PATCH 00/18] virgl: use a seperate rendering thread, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 02/18] console: add dpy_gl_ctx_is_mt_safe, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 04/18] virtio-gpu: start splitting scanout/resource flushing, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 01/18] console: skip same-size resize, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 03/18] virtio-gpu: add "iothread" property, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 05/18] virtio-gpu: start introducing a lock around the display info, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 06/18] virtio-gpu: create a thread context, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 08/18] gl: bind GL api before context creation, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 07/18] gl: allow to keep current context in ctx-create, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 09/18] bitmap: add a simple foreach util, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 11/18] virtio-gpu: use a bh for cursor modifications,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 10/18] virtio-blk: use bitmap_foreach, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 12/18] virtio-gpu: save a pointer from virtio_gpu_ctrl_command, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 14/18] virtio-gpu: batch virtio_notify when using a data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 13/18] virtio-gpu: add a virgl data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 16/18] virtio-gpu: use virgl thread sync with the data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 15/18] virtio-gpu: dispatch to main thread for scanout & flush, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 17/18] virtio-gpu: schedule a bh to unblock the data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 18/18] virtio-gpu: start/stop the data-plane, Marc-André Lureau, 2016/09/04
- Re: [Qemu-devel] [PATCH 00/18] virgl: use a seperate rendering thread, no-reply, 2016/09/04
- Re: [Qemu-devel] [PATCH 00/18] virgl: use a seperate rendering thread, no-reply, 2016/09/04