[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 20/24] xen: re-enable refresh interval reporting for
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 20/24] xen: re-enable refresh interval reporting for xenfb |
Date: |
Thu, 4 Apr 2013 09:29:02 +0200 |
xenfb informs the guest about the gui refresh interval so it can avoid
pointless work. That logic was temporarely disabled for the
DisplayState reorganization. Restore it now, with a proper interface
for it.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/xenfb.c | 47 ++++++++++++++++-------------------------------
include/ui/console.h | 1 +
ui/console.c | 6 ++++++
3 files changed, 23 insertions(+), 31 deletions(-)
diff --git a/hw/xenfb.c b/hw/xenfb.c
index f2af7eb..6344f11 100644
--- a/hw/xenfb.c
+++ b/hw/xenfb.c
@@ -646,7 +646,7 @@ static void xenfb_guest_copy(struct XenFB *xenfb, int x,
int y, int w, int h)
dpy_gfx_update(xenfb->c.con, x, y, w, h);
}
-#if 0 /* def XENFB_TYPE_REFRESH_PERIOD */
+#ifdef XENFB_TYPE_REFRESH_PERIOD
static int xenfb_queue_full(struct XenFB *xenfb)
{
struct xenfb_page *page = xenfb->c.page;
@@ -705,37 +705,7 @@ static void xenfb_update(void *opaque)
return;
if (xenfb->feature_update) {
-#if 0 /* XENFB_TYPE_REFRESH_PERIOD */
- struct DisplayChangeListener *l;
- int period = 99999999;
- int idle = 1;
-
- if (xenfb_queue_full(xenfb))
- return;
-
- QLIST_FOREACH(l, &xenfb->c.ds->listeners, next) {
- if (l->idle)
- continue;
- idle = 0;
- if (!l->gui_timer_interval) {
- if (period > GUI_REFRESH_INTERVAL)
- period = GUI_REFRESH_INTERVAL;
- } else {
- if (period > l->gui_timer_interval)
- period = l->gui_timer_interval;
- }
- }
- if (idle)
- period = XENFB_NO_REFRESH;
-
- if (xenfb->refresh_period != period) {
- xenfb_send_refresh_period(xenfb, period);
- xenfb->refresh_period = period;
- xen_be_printf(&xenfb->c.xendev, 1, "refresh period: %d\n", period);
- }
-#else
; /* nothing */
-#endif
} else {
/* we don't get update notifications, thus use the
* sledge hammer approach ... */
@@ -785,6 +755,20 @@ static void xenfb_update(void *opaque)
xenfb->up_fullscreen = 0;
}
+static void xenfb_update_interval(void *opaque, uint64_t interval)
+{
+ struct XenFB *xenfb = opaque;
+
+ if (xenfb->feature_update) {
+#ifdef XENFB_TYPE_REFRESH_PERIOD
+ if (xenfb_queue_full(xenfb)) {
+ return;
+ }
+ xenfb_send_refresh_period(xenfb, interval);
+#endif
+ }
+}
+
/* QEMU display state changed, so refresh the framebuffer copy */
static void xenfb_invalidate(void *opaque)
{
@@ -980,6 +964,7 @@ struct XenDevOps xen_framebuffer_ops = {
static const GraphicHwOps xenfb_ops = {
.invalidate = xenfb_invalidate,
.gfx_update = xenfb_update,
+ .update_interval = xenfb_update_interval,
};
/*
diff --git a/include/ui/console.h b/include/ui/console.h
index 3cb0018..800f458 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -272,6 +272,7 @@ typedef struct GraphicHwOps {
void (*invalidate)(void *opaque);
void (*gfx_update)(void *opaque);
void (*text_update)(void *opaque, console_ch_t *text);
+ void (*update_interval)(void *opaque, uint64_t interval);
} GraphicHwOps;
QemuConsole *graphic_console_init(const GraphicHwOps *ops,
diff --git a/ui/console.c b/ui/console.c
index be89747..ead5d35 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -182,6 +182,7 @@ static void gui_update(void *opaque)
uint64_t dcl_interval;
DisplayState *ds = opaque;
DisplayChangeListener *dcl;
+ int i;
ds->refreshing = true;
dpy_refresh(ds);
@@ -196,6 +197,11 @@ static void gui_update(void *opaque)
}
if (ds->update_interval != interval) {
ds->update_interval = interval;
+ for (i = 0; i < nb_consoles; i++) {
+ if (consoles[i]->hw_ops->update_interval) {
+ consoles[i]->hw_ops->update_interval(consoles[i]->hw,
interval);
+ }
+ }
trace_console_refresh(interval);
}
ds->last_update = qemu_get_clock_ms(rt_clock);
--
1.7.9.7
- [Qemu-devel] [PATCH 07/24] console: use pixman for fill+blit, (continued)
- [Qemu-devel] [PATCH 07/24] console: use pixman for fill+blit, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 15/24] console: zap g_width + g_height, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 05/24] pixman: add qemu_pixman_color(), Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 17/24] console: make DisplayState private to console.c, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 19/24] console: gui timer fixes, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 01/24] exynos4210_fimd.c: fix display resize bug introduced after console revamp, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 21/24] console: add qemu_console_is_*, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 12/24] console: rename vga_hw_*, add QemuConsole param, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 24/24] qxl: register QemuConsole for secondary cards, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 23/24] gtk: custom cursor support, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 20/24] xen: re-enable refresh interval reporting for xenfb,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 16/24] console: move gui_update+gui_setup_refresh from vl.c into console.c, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 22/24] console: allow pinning displaychangelisteners to consoles, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 14/24] console: simplify screendump, Gerd Hoffmann, 2013/04/04
- [Qemu-devel] [PATCH 18/24] console: add GraphicHwOps, Gerd Hoffmann, 2013/04/04