[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 05/22] console: untangle gfx & txt updates
From: |
Jan Kiszka |
Subject: |
Re: [Qemu-devel] [PATCH 05/22] console: untangle gfx & txt updates |
Date: |
Fri, 02 Nov 2012 08:20:39 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 |
On 2012-11-01 14:04, Gerd Hoffmann wrote:
> Stop abusing displaysurface fields for text mode displays.
> (bpp = 0, width = cols, height = lines).
>
> Add flags to displaystate indicating whenever text mode display
> (curses) or gfx mode displays (sdl, vnc, ...) are present.
>
> Add separate displaychangelistener callbacks for text / gfx mode
> resize & updates.
>
> This allows to enable gfx and txt diplays at the same time and also
> paves the way for more cleanups in the future.
Breaks building xenfb.c.
Jan
>
> Signed-off-by: Gerd Hoffmann <address@hidden>
> ---
> console.c | 59 +++++++++++++++++++++-------------------
> console.h | 74
> +++++++++++++++++++++++++++++++++++---------------
> hw/blizzard.c | 4 +-
> hw/exynos4210_fimd.c | 2 +-
> hw/g364fb.c | 7 +++--
> hw/jazz_led.c | 4 +-
> hw/milkymist-vgafb.c | 2 +-
> hw/musicpal.c | 2 +-
> hw/nseries.c | 2 +-
> hw/omap_lcdc.c | 2 +-
> hw/palm.c | 2 +-
> hw/pl110.c | 2 +-
> hw/pxa2xx_lcd.c | 8 +++---
> hw/qxl-render.c | 10 +++---
> hw/qxl.c | 4 +-
> hw/sm501.c | 4 +-
> hw/ssd0303.c | 2 +-
> hw/ssd0323.c | 2 +-
> hw/tc6393xb.c | 4 +-
> hw/tcx.c | 16 +++++-----
> hw/vga.c | 34 ++++++++++-------------
> hw/vmware_vga.c | 4 +-
> ui/curses.c | 21 +++++---------
> ui/sdl.c | 12 ++++----
> ui/spice-display.c | 4 +-
> ui/vnc.c | 8 +++---
> vl.c | 14 ++++++++-
> 27 files changed, 171 insertions(+), 138 deletions(-)
>
> diff --git a/console.c b/console.c
> index b53dc1b..61812c7 100644
> --- a/console.c
> +++ b/console.c
> @@ -638,30 +638,33 @@ static void console_refresh(QemuConsole *s)
>
> if (s != active_console)
> return;
> - if (!ds_get_bits_per_pixel(s->ds)) {
> +
> + if (s->ds->have_text) {
> s->text_x[0] = 0;
> s->text_y[0] = 0;
> s->text_x[1] = s->width - 1;
> s->text_y[1] = s->height - 1;
> s->cursor_invalidate = 1;
> - return;
> }
>
> - vga_fill_rect(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds),
> - color_table[0][COLOR_BLACK]);
> - y1 = s->y_displayed;
> - for(y = 0; y < s->height; y++) {
> - c = s->cells + y1 * s->width;
> - for(x = 0; x < s->width; x++) {
> - vga_putcharxy(s->ds, x, y, c->ch,
> - &(c->t_attrib));
> - c++;
> + if (s->ds->have_gfx) {
> + vga_fill_rect(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds),
> + color_table[0][COLOR_BLACK]);
> + y1 = s->y_displayed;
> + for (y = 0; y < s->height; y++) {
> + c = s->cells + y1 * s->width;
> + for (x = 0; x < s->width; x++) {
> + vga_putcharxy(s->ds, x, y, c->ch,
> + &(c->t_attrib));
> + c++;
> + }
> + if (++y1 == s->total_height) {
> + y1 = 0;
> + }
> }
> - if (++y1 == s->total_height)
> - y1 = 0;
> + console_show_cursor(s, 1);
> + dpy_gfx_update(s->ds, 0, 0, ds_get_width(s->ds),
> ds_get_height(s->ds));
> }
> - console_show_cursor(s, 1);
> - dpy_update(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds));
> }
>
> static void console_scroll(int ydelta)
> @@ -1094,17 +1097,17 @@ void console_select(unsigned int index)
> qemu_del_timer(active_console->cursor_timer);
> }
> active_console = s;
> - if (ds_get_bits_per_pixel(s->ds)) {
> + if (ds->have_gfx) {
> ds->surface = qemu_resize_displaysurface(ds, s->g_width,
> s->g_height);
> - } else {
> - s->ds->surface->width = s->width;
> - s->ds->surface->height = s->height;
> + dpy_gfx_resize(ds);
> + }
> + if (ds->have_text) {
> + dpy_text_resize(ds, s->width, s->height);
> }
> if (s->cursor_timer) {
> qemu_mod_timer(s->cursor_timer,
> qemu_get_clock_ms(rt_clock) + CONSOLE_CURSOR_PERIOD / 2);
> }
> - dpy_resize(s->ds);
> vga_hw_invalidate();
> }
> }
> @@ -1123,10 +1126,10 @@ static int console_puts(CharDriverState *chr, const
> uint8_t *buf, int len)
> console_putchar(s, buf[i]);
> }
> console_show_cursor(s, 1);
> - if (ds_get_bits_per_pixel(s->ds) && s->update_x0 < s->update_x1) {
> - dpy_update(s->ds, s->update_x0, s->update_y0,
> - s->update_x1 - s->update_x0,
> - s->update_y1 - s->update_y0);
> + if (s->ds->have_gfx && s->update_x0 < s->update_x1) {
> + dpy_gfx_update(s->ds, s->update_x0, s->update_y0,
> + s->update_x1 - s->update_x0,
> + s->update_y1 - s->update_y0);
> }
> return len;
> }
> @@ -1234,8 +1237,8 @@ static void text_console_update(void *opaque,
> console_ch_t *chardata)
> (s->cells[src].t_attrib.fgcol << 12) |
> (s->cells[src].t_attrib.bgcol << 8) |
> (s->cells[src].t_attrib.bold << 21));
> - dpy_update(s->ds, s->text_x[0], s->text_y[0],
> - s->text_x[1] - s->text_x[0], i - s->text_y[0]);
> + dpy_text_update(s->ds, s->text_x[0], s->text_y[0],
> + s->text_x[1] - s->text_x[0], i - s->text_y[0]);
> s->text_x[0] = s->width;
> s->text_y[0] = s->height;
> s->text_x[1] = 0;
> @@ -1596,7 +1599,7 @@ void qemu_console_resize(DisplayState *ds, int width,
> int height)
> s->g_height = height;
> if (is_graphic_console()) {
> ds->surface = qemu_resize_displaysurface(ds, width, height);
> - dpy_resize(ds);
> + dpy_gfx_resize(ds);
> }
> }
>
> @@ -1604,7 +1607,7 @@ void qemu_console_copy(DisplayState *ds, int src_x, int
> src_y,
> int dst_x, int dst_y, int w, int h)
> {
> if (is_graphic_console()) {
> - dpy_copy(ds, src_x, src_y, dst_x, dst_y, w, h);
> + dpy_gfx_copy(ds, src_x, src_y, dst_x, dst_y, w, h);
> }
> }
>
> diff --git a/console.h b/console.h
> index fb38ce9..00e2f03 100644
> --- a/console.h
> +++ b/console.h
> @@ -154,15 +154,19 @@ struct DisplayChangeListener {
> int idle;
> uint64_t gui_timer_interval;
>
> - void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
> - void (*dpy_resize)(struct DisplayState *s);
> - void (*dpy_setdata)(struct DisplayState *s);
> void (*dpy_refresh)(struct DisplayState *s);
> - void (*dpy_copy)(struct DisplayState *s, int src_x, int src_y,
> - int dst_x, int dst_y, int w, int h);
> - void (*dpy_fill)(struct DisplayState *s, int x, int y,
> - int w, int h, uint32_t c);
> +
> + void (*dpy_gfx_update)(struct DisplayState *s, int x, int y, int w, int
> h);
> + void (*dpy_gfx_resize)(struct DisplayState *s);
> + void (*dpy_gfx_setdata)(struct DisplayState *s);
> + void (*dpy_gfx_copy)(struct DisplayState *s, int src_x, int src_y,
> + int dst_x, int dst_y, int w, int h);
> + void (*dpy_gfx_fill)(struct DisplayState *s, int x, int y,
> + int w, int h, uint32_t c);
> +
> void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
> + void (*dpy_text_resize)(struct DisplayState *s, int w, int h);
> + void (*dpy_text_update)(struct DisplayState *s, int x, int y, int w, int
> h);
>
> void (*dpy_mouse_set)(struct DisplayState *s, int x, int y, int on);
> void (*dpy_cursor_define)(struct DisplayState *s, QEMUCursor *cursor);
> @@ -180,6 +184,8 @@ struct DisplayState {
> struct DisplaySurface *surface;
> void *opaque;
> struct QEMUTimer *gui_timer;
> + bool have_gfx;
> + bool have_text;
>
> struct DisplayAllocator* allocator;
> QLIST_HEAD(, DisplayChangeListener) listeners;
> @@ -244,28 +250,32 @@ static inline void
> unregister_displaychangelistener(DisplayState *ds,
> gui_setup_refresh(ds);
> }
>
> -static inline void dpy_update(DisplayState *s, int x, int y, int w, int h)
> +static inline void dpy_gfx_update(DisplayState *s, int x, int y, int w, int
> h)
> {
> struct DisplayChangeListener *dcl;
> QLIST_FOREACH(dcl, &s->listeners, next) {
> - dcl->dpy_update(s, x, y, w, h);
> + if (dcl->dpy_gfx_update) {
> + dcl->dpy_gfx_update(s, x, y, w, h);
> + }
> }
> }
>
> -static inline void dpy_resize(DisplayState *s)
> +static inline void dpy_gfx_resize(DisplayState *s)
> {
> struct DisplayChangeListener *dcl;
> QLIST_FOREACH(dcl, &s->listeners, next) {
> - dcl->dpy_resize(s);
> + if (dcl->dpy_gfx_resize) {
> + dcl->dpy_gfx_resize(s);
> + }
> }
> }
>
> -static inline void dpy_setdata(DisplayState *s)
> +static inline void dpy_gfx_setdata(DisplayState *s)
> {
> struct DisplayChangeListener *dcl;
> QLIST_FOREACH(dcl, &s->listeners, next) {
> - if (dcl->dpy_setdata) {
> - dcl->dpy_setdata(s);
> + if (dcl->dpy_gfx_setdata) {
> + dcl->dpy_gfx_setdata(s);
> }
> }
> }
> @@ -280,26 +290,26 @@ static inline void dpy_refresh(DisplayState *s)
> }
> }
>
> -static inline void dpy_copy(struct DisplayState *s, int src_x, int src_y,
> +static inline void dpy_gfx_copy(struct DisplayState *s, int src_x, int src_y,
> int dst_x, int dst_y, int w, int h)
> {
> struct DisplayChangeListener *dcl;
> QLIST_FOREACH(dcl, &s->listeners, next) {
> - if (dcl->dpy_copy) {
> - dcl->dpy_copy(s, src_x, src_y, dst_x, dst_y, w, h);
> + if (dcl->dpy_gfx_copy) {
> + dcl->dpy_gfx_copy(s, src_x, src_y, dst_x, dst_y, w, h);
> } else { /* TODO */
> - dcl->dpy_update(s, dst_x, dst_y, w, h);
> + dcl->dpy_gfx_update(s, dst_x, dst_y, w, h);
> }
> }
> }
>
> -static inline void dpy_fill(struct DisplayState *s, int x, int y,
> - int w, int h, uint32_t c)
> +static inline void dpy_gfx_fill(struct DisplayState *s, int x, int y,
> + int w, int h, uint32_t c)
> {
> struct DisplayChangeListener *dcl;
> QLIST_FOREACH(dcl, &s->listeners, next) {
> - if (dcl->dpy_fill) {
> - dcl->dpy_fill(s, x, y, w, h, c);
> + if (dcl->dpy_gfx_fill) {
> + dcl->dpy_gfx_fill(s, x, y, w, h, c);
> }
> }
> }
> @@ -314,6 +324,26 @@ static inline void dpy_text_cursor(struct DisplayState
> *s, int x, int y)
> }
> }
>
> +static inline void dpy_text_update(DisplayState *s, int x, int y, int w, int
> h)
> +{
> + struct DisplayChangeListener *dcl;
> + QLIST_FOREACH(dcl, &s->listeners, next) {
> + if (dcl->dpy_text_update) {
> + dcl->dpy_text_update(s, x, y, w, h);
> + }
> + }
> +}
> +
> +static inline void dpy_text_resize(DisplayState *s, int w, int h)
> +{
> + struct DisplayChangeListener *dcl;
> + QLIST_FOREACH(dcl, &s->listeners, next) {
> + if (dcl->dpy_text_resize) {
> + dcl->dpy_text_resize(s, w, h);
> + }
> + }
> +}
> +
> static inline void dpy_mouse_set(struct DisplayState *s, int x, int y, int
> on)
> {
> struct DisplayChangeListener *dcl;
> diff --git a/hw/blizzard.c b/hw/blizzard.c
> index 06e19b3..1b57eb5 100644
> --- a/hw/blizzard.c
> +++ b/hw/blizzard.c
> @@ -921,8 +921,8 @@ static void blizzard_update_display(void *opaque)
> for (; y < s->my[1]; y ++, src += bypl, dst += bypl)
> memcpy(dst, src, bwidth);
>
> - dpy_update(s->state, s->mx[0], s->my[0],
> - s->mx[1] - s->mx[0], y - s->my[0]);
> + dpy_gfx_update(s->state, s->mx[0], s->my[0],
> + s->mx[1] - s->mx[0], y - s->my[0]);
>
> s->mx[0] = s->x;
> s->mx[1] = 0;
> diff --git a/hw/exynos4210_fimd.c b/hw/exynos4210_fimd.c
> index 7cb2c31..f2443ca 100644
> --- a/hw/exynos4210_fimd.c
> +++ b/hw/exynos4210_fimd.c
> @@ -1307,7 +1307,7 @@ static void exynos4210_fimd_update(void *opaque)
> fimd_copy_line_toqemu(global_width, s->ifb + global_width * line
> *
> RGBA_SIZE, d + global_width * line * bpp);
> }
> - dpy_update(s->console, 0, 0, global_width, global_height);
> + dpy_gfx_update(s->console, 0, 0, global_width, global_height);
> }
> s->invalidate = false;
> s->vidintcon[1] |= FIMD_VIDINT_INTFRMPEND;
> diff --git a/hw/g364fb.c b/hw/g364fb.c
> index f7b4bf5..8192baf 100644
> --- a/hw/g364fb.c
> +++ b/hw/g364fb.c
> @@ -197,7 +197,8 @@ static void g364fb_draw_graphic8(G364State *s)
> reset_dirty(s, page_min, page_max);
> page_min = (ram_addr_t)-1;
> page_max = 0;
> - dpy_update(s->ds, xmin, ymin, xmax - xmin + 1, ymax - ymin +
> 1);
> + dpy_gfx_update(s->ds, xmin, ymin,
> + xmax - xmin + 1, ymax - ymin + 1);
> xmin = s->width;
> xmax = 0;
> ymin = s->height;
> @@ -216,7 +217,7 @@ static void g364fb_draw_graphic8(G364State *s)
>
> done:
> if (page_min != (ram_addr_t)-1) {
> - dpy_update(s->ds, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1);
> + dpy_gfx_update(s->ds, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1);
> reset_dirty(s, page_min, page_max);
> }
> }
> @@ -238,7 +239,7 @@ static void g364fb_draw_blank(G364State *s)
> d += ds_get_linesize(s->ds);
> }
>
> - dpy_update(s->ds, 0, 0, s->width, s->height);
> + dpy_gfx_update(s->ds, 0, 0, s->width, s->height);
> s->blanked = 1;
> }
>
> diff --git a/hw/jazz_led.c b/hw/jazz_led.c
> index 853bf6d..640e75e 100644
> --- a/hw/jazz_led.c
> +++ b/hw/jazz_led.c
> @@ -196,7 +196,7 @@ static void jazz_led_update_display(void *opaque)
> }
>
> s->state = REDRAW_NONE;
> - dpy_update(ds, 0, 0, ds_get_width(ds), ds_get_height(ds));
> + dpy_gfx_update(ds, 0, 0, ds_get_width(ds), ds_get_height(ds));
> }
>
> static void jazz_led_invalidate_display(void *opaque)
> @@ -218,7 +218,7 @@ static void jazz_led_text_update(void *opaque,
> console_ch_t *chardata)
> console_write_ch(chardata++, 0x00200100 | buf[0]);
> console_write_ch(chardata++, 0x00200100 | buf[1]);
>
> - dpy_update(s->ds, 0, 0, 2, 1);
> + dpy_text_update(s->ds, 0, 0, 2, 1);
> }
>
> static int jazz_led_post_load(void *opaque, int version_id)
> diff --git a/hw/milkymist-vgafb.c b/hw/milkymist-vgafb.c
> index 8d36bc1..833881c 100644
> --- a/hw/milkymist-vgafb.c
> +++ b/hw/milkymist-vgafb.c
> @@ -134,7 +134,7 @@ static void vgafb_update_display(void *opaque)
> &first, &last);
>
> if (first >= 0) {
> - dpy_update(s->ds, 0, first, s->regs[R_HRES], last - first + 1);
> + dpy_gfx_update(s->ds, 0, first, s->regs[R_HRES], last - first + 1);
> }
> s->invalidate = 0;
> }
> diff --git a/hw/musicpal.c b/hw/musicpal.c
> index beec76b..e0c57c8 100644
> --- a/hw/musicpal.c
> +++ b/hw/musicpal.c
> @@ -526,7 +526,7 @@ static void lcd_refresh(void *opaque)
> ds_get_bits_per_pixel(s->ds));
> }
>
> - dpy_update(s->ds, 0, 0, 128*3, 64*3);
> + dpy_gfx_update(s->ds, 0, 0, 128*3, 64*3);
> }
>
> static void lcd_invalidate(void *opaque)
> diff --git a/hw/nseries.c b/hw/nseries.c
> index 9306aa1..26d5e35 100644
> --- a/hw/nseries.c
> +++ b/hw/nseries.c
> @@ -1376,7 +1376,7 @@ static void n8x0_init(ram_addr_t ram_size, const char
> *boot_device,
> size until the guest activates the display. */
> ds = get_displaystate();
> ds->surface = qemu_resize_displaysurface(ds, 800, 480);
> - dpy_resize(ds);
> + dpy_gfx_resize(ds);
> }
>
> static struct arm_boot_info n800_binfo = {
> diff --git a/hw/omap_lcdc.c b/hw/omap_lcdc.c
> index bf177c2..d7ae303 100644
> --- a/hw/omap_lcdc.c
> +++ b/hw/omap_lcdc.c
> @@ -219,7 +219,7 @@ static void omap_update_display(void *opaque)
> draw_line, omap_lcd->palette,
> &first, &last);
> if (first >= 0) {
> - dpy_update(omap_lcd->state, 0, first, width, last - first + 1);
> + dpy_gfx_update(omap_lcd->state, 0, first, width, last - first + 1);
> }
> omap_lcd->invalidate = 0;
> }
> diff --git a/hw/palm.c b/hw/palm.c
> index d263051..6f6f414 100644
> --- a/hw/palm.c
> +++ b/hw/palm.c
> @@ -273,7 +273,7 @@ static void palmte_init(QEMUMachineInitArgs *args)
> will set the size once configured, so this just sets an initial
> size until the guest activates the display. */
> ds->surface = qemu_resize_displaysurface(ds, 320, 320);
> - dpy_resize(ds);
> + dpy_gfx_resize(ds);
> }
>
> static QEMUMachine palmte_machine = {
> diff --git a/hw/pl110.c b/hw/pl110.c
> index 82486b0..79a3f82 100644
> --- a/hw/pl110.c
> +++ b/hw/pl110.c
> @@ -239,7 +239,7 @@ static void pl110_update_display(void *opaque)
> fn, s->palette,
> &first, &last);
> if (first >= 0) {
> - dpy_update(s->ds, 0, first, s->cols, last - first + 1);
> + dpy_gfx_update(s->ds, 0, first, s->cols, last - first + 1);
> }
> s->invalidate = 0;
> }
> diff --git a/hw/pxa2xx_lcd.c b/hw/pxa2xx_lcd.c
> index 38c3889..b53dfaf 100644
> --- a/hw/pxa2xx_lcd.c
> +++ b/hw/pxa2xx_lcd.c
> @@ -871,20 +871,20 @@ static void pxa2xx_update_display(void *opaque)
> if (miny >= 0) {
> switch (s->orientation) {
> case 0:
> - dpy_update(s->ds, 0, miny, s->xres, maxy - miny + 1);
> + dpy_gfx_update(s->ds, 0, miny, s->xres, maxy - miny + 1);
> break;
> case 90:
> - dpy_update(s->ds, miny, 0, maxy - miny + 1, s->xres);
> + dpy_gfx_update(s->ds, miny, 0, maxy - miny + 1, s->xres);
> break;
> case 180:
> maxy = s->yres - maxy - 1;
> miny = s->yres - miny - 1;
> - dpy_update(s->ds, 0, maxy, s->xres, miny - maxy + 1);
> + dpy_gfx_update(s->ds, 0, maxy, s->xres, miny - maxy + 1);
> break;
> case 270:
> maxy = s->yres - maxy - 1;
> miny = s->yres - miny - 1;
> - dpy_update(s->ds, maxy, 0, miny - maxy + 1, s->xres);
> + dpy_gfx_update(s->ds, maxy, 0, miny - maxy + 1, s->xres);
> break;
> }
> }
> diff --git a/hw/qxl-render.c b/hw/qxl-render.c
> index e8cf29e..47eb8b4 100644
> --- a/hw/qxl-render.c
> +++ b/hw/qxl-render.c
> @@ -123,17 +123,17 @@ static void
> qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
> qxl->guest_primary.surface.width,
> qxl->guest_primary.surface.height);
> }
> - dpy_resize(vga->ds);
> + dpy_gfx_resize(vga->ds);
> }
> for (i = 0; i < qxl->num_dirty_rects; i++) {
> if (qemu_spice_rect_is_empty(qxl->dirty+i)) {
> break;
> }
> qxl_blit(qxl, qxl->dirty+i);
> - dpy_update(vga->ds,
> - qxl->dirty[i].left, qxl->dirty[i].top,
> - qxl->dirty[i].right - qxl->dirty[i].left,
> - qxl->dirty[i].bottom - qxl->dirty[i].top);
> + dpy_gfx_update(vga->ds,
> + qxl->dirty[i].left, qxl->dirty[i].top,
> + qxl->dirty[i].right - qxl->dirty[i].left,
> + qxl->dirty[i].bottom - qxl->dirty[i].top);
> }
> qxl->num_dirty_rects = 0;
> }
> diff --git a/hw/qxl.c b/hw/qxl.c
> index d54daf6..1f56fcd 100644
> --- a/hw/qxl.c
> +++ b/hw/qxl.c
> @@ -1864,8 +1864,8 @@ static void display_refresh(struct DisplayState *ds)
> }
>
> static DisplayChangeListener display_listener = {
> - .dpy_update = display_update,
> - .dpy_resize = display_resize,
> + .dpy_gfx_update = display_update,
> + .dpy_gfx_resize = display_resize,
> .dpy_refresh = display_refresh,
> };
>
> diff --git a/hw/sm501.c b/hw/sm501.c
> index 4aafe49..50324cd 100644
> --- a/hw/sm501.c
> +++ b/hw/sm501.c
> @@ -1351,7 +1351,7 @@ static void sm501_draw_crt(SM501State * s)
> } else {
> if (y_start >= 0) {
> /* flush to display */
> - dpy_update(s->ds, 0, y_start, width, y - y_start);
> + dpy_gfx_update(s->ds, 0, y_start, width, y - y_start);
> y_start = -1;
> }
> }
> @@ -1362,7 +1362,7 @@ static void sm501_draw_crt(SM501State * s)
>
> /* complete flush to display */
> if (y_start >= 0)
> - dpy_update(s->ds, 0, y_start, width, y - y_start);
> + dpy_gfx_update(s->ds, 0, y_start, width, y - y_start);
>
> /* clear dirty flags */
> if (page_min != ~0l) {
> diff --git a/hw/ssd0303.c b/hw/ssd0303.c
> index 4e1ee6e..d7fd828 100644
> --- a/hw/ssd0303.c
> +++ b/hw/ssd0303.c
> @@ -252,7 +252,7 @@ static void ssd0303_update_display(void *opaque)
> }
> }
> s->redraw = 0;
> - dpy_update(s->ds, 0, 0, 96 * MAGNIFY, 16 * MAGNIFY);
> + dpy_gfx_update(s->ds, 0, 0, 96 * MAGNIFY, 16 * MAGNIFY);
> }
>
> static void ssd0303_invalidate_display(void * opaque)
> diff --git a/hw/ssd0323.c b/hw/ssd0323.c
> index 9c42d64..4098830 100644
> --- a/hw/ssd0323.c
> +++ b/hw/ssd0323.c
> @@ -260,7 +260,7 @@ static void ssd0323_update_display(void *opaque)
> }
> }
> s->redraw = 0;
> - dpy_update(s->ds, 0, 0, 128 * MAGNIFY, 64 * MAGNIFY);
> + dpy_gfx_update(s->ds, 0, 0, 128 * MAGNIFY, 64 * MAGNIFY);
> }
>
> static void ssd0323_invalidate_display(void * opaque)
> diff --git a/hw/tc6393xb.c b/hw/tc6393xb.c
> index 31d4f26..f032027 100644
> --- a/hw/tc6393xb.c
> +++ b/hw/tc6393xb.c
> @@ -454,7 +454,7 @@ static void tc6393xb_draw_graphic(TC6393xbState *s, int
> full_update)
> return;
> }
>
> - dpy_update(s->ds, 0, 0, s->scr_width, s->scr_height);
> + dpy_gfx_update(s->ds, 0, 0, s->scr_width, s->scr_height);
> }
>
> static void tc6393xb_draw_blank(TC6393xbState *s, int full_update)
> @@ -472,7 +472,7 @@ static void tc6393xb_draw_blank(TC6393xbState *s, int
> full_update)
> d += ds_get_linesize(s->ds);
> }
>
> - dpy_update(s->ds, 0, 0, s->scr_width, s->scr_height);
> + dpy_gfx_update(s->ds, 0, 0, s->scr_width, s->scr_height);
> }
>
> static void tc6393xb_update_display(void *opaque)
> diff --git a/hw/tcx.c b/hw/tcx.c
> index 7abe865..7aee2a9 100644
> --- a/hw/tcx.c
> +++ b/hw/tcx.c
> @@ -268,8 +268,8 @@ static void tcx_update_display(void *opaque)
> } else {
> if (y_start >= 0) {
> /* flush to display */
> - dpy_update(ts->ds, 0, y_start,
> - ts->width, y - y_start);
> + dpy_gfx_update(ts->ds, 0, y_start,
> + ts->width, y - y_start);
> y_start = -1;
> }
> d += dd * 4;
> @@ -278,8 +278,8 @@ static void tcx_update_display(void *opaque)
> }
> if (y_start >= 0) {
> /* flush to display */
> - dpy_update(ts->ds, 0, y_start,
> - ts->width, y - y_start);
> + dpy_gfx_update(ts->ds, 0, y_start,
> + ts->width, y - y_start);
> }
> /* reset modified pages */
> if (page_max >= page_min) {
> @@ -344,8 +344,8 @@ static void tcx24_update_display(void *opaque)
> } else {
> if (y_start >= 0) {
> /* flush to display */
> - dpy_update(ts->ds, 0, y_start,
> - ts->width, y - y_start);
> + dpy_gfx_update(ts->ds, 0, y_start,
> + ts->width, y - y_start);
> y_start = -1;
> }
> d += dd * 4;
> @@ -356,8 +356,8 @@ static void tcx24_update_display(void *opaque)
> }
> if (y_start >= 0) {
> /* flush to display */
> - dpy_update(ts->ds, 0, y_start,
> - ts->width, y - y_start);
> + dpy_gfx_update(ts->ds, 0, y_start,
> + ts->width, y - y_start);
> }
> /* reset modified pages */
> if (page_max >= page_min) {
> diff --git a/hw/vga.c b/hw/vga.c
> index f3256cb..dc8ddde 100644
> --- a/hw/vga.c
> +++ b/hw/vga.c
> @@ -1456,8 +1456,8 @@ static void vga_draw_text(VGACommonState *s, int
> full_update)
> ch_attr_ptr++;
> }
> if (cx_max != -1) {
> - dpy_update(s->ds, cx_min * cw, cy * cheight,
> - (cx_max - cx_min + 1) * cw, cheight);
> + dpy_gfx_update(s->ds, cx_min * cw, cy * cheight,
> + (cx_max - cx_min + 1) * cw, cheight);
> }
> dest += linesize * cheight;
> line1 = line + cheight;
> @@ -1688,7 +1688,7 @@ static void vga_draw_graphic(VGACommonState *s, int
> full_update)
> #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
> s->ds->surface->pf =
> qemu_different_endianness_pixelformat(depth);
> #endif
> - dpy_resize(s->ds);
> + dpy_gfx_resize(s->ds);
> } else {
> qemu_console_resize(s->ds, disp_width, height);
> }
> @@ -1702,7 +1702,7 @@ static void vga_draw_graphic(VGACommonState *s, int
> full_update)
> } else if (is_buffer_shared(s->ds->surface) &&
> (full_update || s->ds->surface->data != s->vram_ptr +
> (s->start_addr * 4))) {
> s->ds->surface->data = s->vram_ptr + (s->start_addr * 4);
> - dpy_setdata(s->ds);
> + dpy_gfx_setdata(s->ds);
> }
>
> s->rgb_to_pixel =
> @@ -1807,8 +1807,8 @@ static void vga_draw_graphic(VGACommonState *s, int
> full_update)
> } else {
> if (y_start >= 0) {
> /* flush to display */
> - dpy_update(s->ds, 0, y_start,
> - disp_width, y - y_start);
> + dpy_gfx_update(s->ds, 0, y_start,
> + disp_width, y - y_start);
> y_start = -1;
> }
> }
> @@ -1828,8 +1828,8 @@ static void vga_draw_graphic(VGACommonState *s, int
> full_update)
> }
> if (y_start >= 0) {
> /* flush to display */
> - dpy_update(s->ds, 0, y_start,
> - disp_width, y - y_start);
> + dpy_gfx_update(s->ds, 0, y_start,
> + disp_width, y - y_start);
> }
> /* reset modified pages */
> if (page_max >= page_min) {
> @@ -1863,8 +1863,8 @@ static void vga_draw_blank(VGACommonState *s, int
> full_update)
> memset(d, val, w);
> d += ds_get_linesize(s->ds);
> }
> - dpy_update(s->ds, 0, 0,
> - s->last_scr_width, s->last_scr_height);
> + dpy_gfx_update(s->ds, 0, 0,
> + s->last_scr_width, s->last_scr_height);
> }
>
> #define GMODE_TEXT 0
> @@ -2052,9 +2052,7 @@ static void vga_update_text(void *opaque, console_ch_t
> *chardata)
> cw != s->last_cw || cheight != s->last_ch) {
> s->last_scr_width = width * cw;
> s->last_scr_height = height * cheight;
> - s->ds->surface->width = width;
> - s->ds->surface->height = height;
> - dpy_resize(s->ds);
> + dpy_text_resize(s->ds, width, height);
> s->last_width = width;
> s->last_height = height;
> s->last_ch = cheight;
> @@ -2087,7 +2085,7 @@ static void vga_update_text(void *opaque, console_ch_t
> *chardata)
> for (i = 0; i < size; src ++, dst ++, i ++)
> console_write_ch(dst, VMEM2CHTYPE(le32_to_cpu(*src)));
>
> - dpy_update(s->ds, 0, 0, width, height);
> + dpy_text_update(s->ds, 0, 0, width, height);
> } else {
> c_max = 0;
>
> @@ -2110,7 +2108,7 @@ static void vga_update_text(void *opaque, console_ch_t
> *chardata)
>
> if (c_min <= c_max) {
> i = TEXTMODE_Y(c_min);
> - dpy_update(s->ds, 0, i, width, TEXTMODE_Y(c_max) - i + 1);
> + dpy_text_update(s->ds, 0, i, width, TEXTMODE_Y(c_max) - i +
> 1);
> }
> }
>
> @@ -2136,9 +2134,7 @@ static void vga_update_text(void *opaque, console_ch_t
> *chardata)
> s->last_width = 60;
> s->last_height = height = 3;
> dpy_text_cursor(s->ds, -1, -1);
> - s->ds->surface->width = s->last_width;
> - s->ds->surface->height = height;
> - dpy_resize(s->ds);
> + dpy_text_resize(s->ds, s->last_width, height);
>
> for (dst = chardata, i = 0; i < s->last_width * height; i ++)
> console_write_ch(dst ++, ' ');
> @@ -2149,7 +2145,7 @@ static void vga_update_text(void *opaque, console_ch_t
> *chardata)
> for (i = 0; i < size; i ++)
> console_write_ch(dst ++, 0x00200100 | msg_buffer[i]);
>
> - dpy_update(s->ds, 0, 0, s->last_width, height);
> + dpy_text_update(s->ds, 0, 0, s->last_width, height);
> }
>
> static uint64_t vga_mem_read(void *opaque, hwaddr addr,
> diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c
> index dc92790..34532e5 100644
> --- a/hw/vmware_vga.c
> +++ b/hw/vmware_vga.c
> @@ -321,14 +321,14 @@ static inline void vmsvga_update_rect(struct
> vmsvga_state_s *s,
> for (; line > 0; line --, src += bypl, dst += bypl)
> memcpy(dst, src, width);
>
> - dpy_update(s->vga.ds, x, y, w, h);
> + dpy_gfx_update(s->vga.ds, x, y, w, h);
> }
>
> static inline void vmsvga_update_screen(struct vmsvga_state_s *s)
> {
> memcpy(ds_get_data(s->vga.ds), s->vga.vram_ptr,
> s->bypp * s->width * s->height);
> - dpy_update(s->vga.ds, 0, 0, s->width, s->height);
> + dpy_gfx_update(s->vga.ds, 0, 0, s->width, s->height);
> }
>
> static inline void vmsvga_update_rect_delayed(struct vmsvga_state_s *s,
> diff --git a/ui/curses.c b/ui/curses.c
> index c2be2c6..b40b223 100644
> --- a/ui/curses.c
> +++ b/ui/curses.c
> @@ -95,17 +95,16 @@ static void curses_calc_pad(void)
> }
> }
>
> -static void curses_resize(DisplayState *ds)
> +static void curses_resize(DisplayState *ds, int width, int height)
> {
> - if (ds_get_width(ds) == gwidth && ds_get_height(ds) == gheight)
> + if (width == gwidth && height == gheight) {
> return;
> + }
>
> - gwidth = ds_get_width(ds);
> - gheight = ds_get_height(ds);
> + gwidth = width;
> + gheight = height;
>
> curses_calc_pad();
> - ds->surface->width = width * FONT_WIDTH;
> - ds->surface->height = height * FONT_HEIGHT;
> }
>
> #ifndef _WIN32
> @@ -167,8 +166,6 @@ static void curses_refresh(DisplayState *ds)
> clear();
> refresh();
> curses_calc_pad();
> - ds->surface->width = FONT_WIDTH * width;
> - ds->surface->height = FONT_HEIGHT * height;
> vga_hw_invalidate();
> invalidate = 0;
> }
> @@ -195,8 +192,6 @@ static void curses_refresh(DisplayState *ds)
> refresh();
> curses_calc_pad();
> curses_update(ds, 0, 0, width, height);
> - ds->surface->width = FONT_WIDTH * width;
> - ds->surface->height = FONT_HEIGHT * height;
> continue;
> }
> #endif
> @@ -355,13 +350,11 @@ void curses_display_init(DisplayState *ds, int
> full_screen)
> #endif
>
> dcl = (DisplayChangeListener *) g_malloc0(sizeof(DisplayChangeListener));
> - dcl->dpy_update = curses_update;
> - dcl->dpy_resize = curses_resize;
> + dcl->dpy_text_update = curses_update;
> + dcl->dpy_text_resize = curses_resize;
> dcl->dpy_refresh = curses_refresh;
> dcl->dpy_text_cursor = curses_cursor_position;
> register_displaychangelistener(ds, dcl);
> - qemu_free_displaysurface(ds);
> - ds->surface = qemu_create_displaysurface_from(640, 400, 0, 0, (uint8_t*)
> screen);
>
> invalidate = 1;
> }
> diff --git a/ui/sdl.c b/ui/sdl.c
> index f8ead93..fac1a47 100644
> --- a/ui/sdl.c
> +++ b/ui/sdl.c
> @@ -553,7 +553,7 @@ static void sdl_scale(DisplayState *ds, int width, int
> height)
> if (!is_buffer_shared(ds->surface)) {
> ds->surface = qemu_resize_displaysurface(ds, ds_get_width(ds),
> ds_get_height(ds));
> - dpy_resize(ds);
> + dpy_gfx_resize(ds);
> }
> }
>
> @@ -1020,11 +1020,11 @@ void sdl_display_init(DisplayState *ds, int
> full_screen, int no_frame)
> }
>
> dcl = g_malloc0(sizeof(DisplayChangeListener));
> - dcl->dpy_update = sdl_update;
> - dcl->dpy_resize = sdl_resize;
> + dcl->dpy_gfx_update = sdl_update;
> + dcl->dpy_gfx_resize = sdl_resize;
> dcl->dpy_refresh = sdl_refresh;
> - dcl->dpy_setdata = sdl_setdata;
> - dcl->dpy_fill = sdl_fill;
> + dcl->dpy_gfx_setdata = sdl_setdata;
> + dcl->dpy_gfx_fill = sdl_fill;
> dcl->dpy_mouse_set = sdl_mouse_warp;
> dcl->dpy_cursor_define = sdl_mouse_define;
> register_displaychangelistener(ds, dcl);
> @@ -1034,7 +1034,7 @@ void sdl_display_init(DisplayState *ds, int
> full_screen, int no_frame)
> da->resize_displaysurface = sdl_resize_displaysurface;
> da->free_displaysurface = sdl_free_displaysurface;
> if (register_displayallocator(ds, da) == da) {
> - dpy_resize(ds);
> + dpy_gfx_resize(ds);
> }
>
> mouse_mode_notifier.notify = sdl_mouse_mode_change;
> diff --git a/ui/spice-display.c b/ui/spice-display.c
> index 5779fa8..fb99148 100644
> --- a/ui/spice-display.c
> +++ b/ui/spice-display.c
> @@ -571,8 +571,8 @@ static void display_refresh(struct DisplayState *ds)
> }
>
> static DisplayChangeListener display_listener = {
> - .dpy_update = display_update,
> - .dpy_resize = display_resize,
> + .dpy_gfx_update = display_update,
> + .dpy_gfx_resize = display_resize,
> .dpy_refresh = display_refresh,
> };
>
> diff --git a/ui/vnc.c b/ui/vnc.c
> index 1b70db7..0ae1c74 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -2753,10 +2753,10 @@ void vnc_display_init(DisplayState *ds)
> qemu_mutex_init(&vs->mutex);
> vnc_start_worker_thread();
>
> - dcl->dpy_copy = vnc_dpy_copy;
> - dcl->dpy_update = vnc_dpy_update;
> - dcl->dpy_resize = vnc_dpy_resize;
> - dcl->dpy_setdata = vnc_dpy_setdata;
> + dcl->dpy_gfx_copy = vnc_dpy_copy;
> + dcl->dpy_gfx_update = vnc_dpy_update;
> + dcl->dpy_gfx_resize = vnc_dpy_resize;
> + dcl->dpy_gfx_setdata = vnc_dpy_setdata;
> dcl->dpy_mouse_set = vnc_mouse_set;
> dcl->dpy_cursor_define = vnc_dpy_cursor_define;
> register_displaychangelistener(ds, dcl);
> diff --git a/vl.c b/vl.c
> index 4c45b02..8716fc0 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1375,11 +1375,18 @@ void gui_setup_refresh(DisplayState *ds)
> {
> DisplayChangeListener *dcl;
> bool need_timer = false;
> + bool have_gfx = false;
> + bool have_text = false;
>
> QLIST_FOREACH(dcl, &ds->listeners, next) {
> if (dcl->dpy_refresh != NULL) {
> need_timer = true;
> - break;
> + }
> + if (dcl->dpy_gfx_update != NULL) {
> + have_gfx = true;
> + }
> + if (dcl->dpy_text_update != NULL) {
> + have_text = true;
> }
> }
>
> @@ -1392,6 +1399,9 @@ void gui_setup_refresh(DisplayState *ds)
> qemu_free_timer(ds->gui_timer);
> ds->gui_timer = NULL;
> }
> +
> + ds->have_gfx = have_gfx;
> + ds->have_text = have_text;
> }
>
> struct vm_change_state_entry {
> @@ -3866,7 +3876,7 @@ int main(int argc, char **argv, char **envp)
> #endif
>
> /* display setup */
> - dpy_resize(ds);
> + dpy_gfx_resize(ds);
> text_consoles_set_display(ds);
>
> if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
>
signature.asc
Description: OpenPGP digital signature
- [Qemu-devel] [PATCH 12/22] pixman: helper functions, (continued)
- [Qemu-devel] [PATCH 12/22] pixman: helper functions, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 15/22] console: don't set PixelFormat alpha fields for 32bpp, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 11/22] pixman: windup in configure & makefiles, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 13/22] pixman: add pixman image to DisplaySurface, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 17/22] vga: stop direct access to DisplaySurface fields., Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 06/22] console: init displaychangelisteners on register, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 16/22] qxl: stop direct access to DisplaySurface fields., Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 22/22] pixman: drop obsolete fields from DisplaySurface, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 21/22] pixman/vnc: remove dead code., Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 05/22] console: untangle gfx & txt updates, Gerd Hoffmann, 2012/11/01
- Re: [Qemu-devel] [PATCH 05/22] console: untangle gfx & txt updates,
Jan Kiszka <=
- [Qemu-devel] [PATCH 02/22] console: add unregister_displaychangelistener, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 09/22] console: remove DisplayAllocator, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 19/22] pixman/vnc: use pixman images in vnc., Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 14/22] console: make qemu_alloc_display static, Gerd Hoffmann, 2012/11/01
- Re: [Qemu-devel] [PULL 00/22] console cleanups & pixman rendering, Anthony Liguori, 2012/11/01