xen: re-enable refresh interval reporting for xenfb

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 <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2013-03-19 15:01:02 +01:00
parent 0f7b2864d0
commit dea1b0bdd8
3 changed files with 24 additions and 39 deletions

View File

@ -78,7 +78,6 @@ struct XenFB {
void *pixels;
int fbpages;
int feature_update;
int refresh_period;
int bug_trigger;
int have_console;
int do_resize;
@ -646,7 +645,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;
@ -704,39 +703,7 @@ static void xenfb_update(void *opaque)
if (xenfb->c.xendev.be_state != XenbusStateConnected)
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 {
if (!xenfb->feature_update) {
/* we don't get update notifications, thus use the
* sledge hammer approach ... */
xenfb->up_fullscreen = 1;
@ -785,6 +752,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)
{
@ -858,10 +839,6 @@ static void xenfb_handle_events(struct XenFB *xenfb)
static int fb_init(struct XenDevice *xendev)
{
struct XenFB *fb = container_of(xendev, struct XenFB, c.xendev);
fb->refresh_period = -1;
#ifdef XENFB_TYPE_RESIZE
xenstore_write_be_int(xendev, "feature-resize", 1);
#endif
@ -980,6 +957,7 @@ struct XenDevOps xen_framebuffer_ops = {
static const GraphicHwOps xenfb_ops = {
.invalidate = xenfb_invalidate,
.gfx_update = xenfb_update,
.update_interval = xenfb_update_interval,
};
/*

View File

@ -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,

View File

@ -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);