From: Marc-André Lureau <marcandre.lur...@redhat.com> Let the caller know if the update is immediate or async.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- hw/display/qxl-render.c | 5 +++-- hw/display/qxl.c | 8 ++++---- hw/display/qxl.h | 2 +- include/ui/console.h | 3 ++- ui/console.c | 14 ++++++++++++-- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/hw/display/qxl-render.c b/hw/display/qxl-render.c index 7e4ef1e..54bbf01 100644 --- a/hw/display/qxl-render.c +++ b/hw/display/qxl-render.c @@ -162,7 +162,7 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) * callbacks are called by spice_server thread, deferring to bh called from the * io thread. */ -void qxl_render_update(PCIQXLDevice *qxl) +bool qxl_render_update(PCIQXLDevice *qxl) { QXLCookie *cookie; @@ -171,7 +171,7 @@ void qxl_render_update(PCIQXLDevice *qxl) if (!runstate_is_running() || !qxl->guest_primary.commands) { qxl_render_update_area_unlocked(qxl); qemu_mutex_unlock(&qxl->ssd.lock); - return; + return false; } qxl->guest_primary.commands = 0; @@ -182,6 +182,7 @@ void qxl_render_update(PCIQXLDevice *qxl) qxl_set_rect_to_surface(qxl, &cookie->u.render.area); qxl_spice_update_area(qxl, 0, &cookie->u.render.area, NULL, 0, 1 /* clear_dirty_region */, QXL_ASYNC, cookie); + return true; } void qxl_render_update_area_bh(void *opaque) diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 9c961da..e76ea24 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -134,7 +134,7 @@ static void qxl_reset_memslots(PCIQXLDevice *d); static void qxl_reset_surfaces(PCIQXLDevice *d); static void qxl_ring_set_dirty(PCIQXLDevice *qxl); -static void qxl_hw_update(void *opaque); +static bool qxl_hw_update_async(void *opaque); void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...) { @@ -1086,7 +1086,7 @@ static const QXLInterface qxl_interface = { }; static const GraphicHwOps qxl_ops = { - .gfx_update = qxl_hw_update, + .gfx_update_async = qxl_hw_update_async, }; static void qxl_enter_vga_mode(PCIQXLDevice *d) @@ -1775,11 +1775,11 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events) /* graphics console */ -static void qxl_hw_update(void *opaque) +static bool qxl_hw_update_async(void *opaque) { PCIQXLDevice *qxl = opaque; - qxl_render_update(qxl); + return qxl_render_update(qxl); } static void qxl_dirty_surfaces(PCIQXLDevice *qxl) diff --git a/hw/display/qxl.h b/hw/display/qxl.h index 2ddf065..5249adb 100644 --- a/hw/display/qxl.h +++ b/hw/display/qxl.h @@ -166,7 +166,7 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext); /* qxl-render.c */ void qxl_render_resize(PCIQXLDevice *qxl); -void qxl_render_update(PCIQXLDevice *qxl); +bool qxl_render_update(PCIQXLDevice *qxl); int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext); void qxl_render_update_area_done(PCIQXLDevice *qxl, QXLCookie *cookie); void qxl_render_update_area_bh(void *opaque); diff --git a/include/ui/console.h b/include/ui/console.h index 047a2b4..a14a619 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -297,6 +297,7 @@ static inline void console_write_ch(console_ch_t *dest, uint32_t ch) typedef struct GraphicHwOps { void (*invalidate)(void *opaque); void (*gfx_update)(void *opaque); + bool (*gfx_update_async)(void *opaque); void (*text_update)(void *opaque, console_ch_t *text); void (*update_interval)(void *opaque, uint64_t interval); int (*ui_info)(void *opaque, uint32_t head, QemuUIInfo *info); @@ -309,7 +310,7 @@ void graphic_console_set_hwops(QemuConsole *con, const GraphicHwOps *hw_ops, void *opaque); -void graphic_hw_update(QemuConsole *con); +bool graphic_hw_update(QemuConsole *con); void graphic_hw_invalidate(QemuConsole *con); void graphic_hw_text_update(QemuConsole *con, console_ch_t *chardata); diff --git a/ui/console.c b/ui/console.c index 75fc492..47352ef 100644 --- a/ui/console.c +++ b/ui/console.c @@ -250,14 +250,24 @@ static void gui_setup_refresh(DisplayState *ds) ds->have_text = have_text; } -void graphic_hw_update(QemuConsole *con) +bool graphic_hw_update(QemuConsole *con) { if (!con) { con = active_console; } - if (con && con->hw_ops->gfx_update) { + + if (!con) { + return false; + } + + if (con->hw_ops->gfx_update_async) { + return con->hw_ops->gfx_update_async(con->hw); + } else if (con->hw_ops->gfx_update) { con->hw_ops->gfx_update(con->hw); + return false; } + + return false; } void graphic_hw_invalidate(QemuConsole *con) -- 2.4.3