From da229ef3b3c5709b01d62e7a6e213b31bca33d16 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 28 Feb 2013 10:48:02 +0100 Subject: console: rework DisplaySurface handling [vga emu side] Decouple DisplaySurface allocation & deallocation from DisplayState. Replace dpy_gfx_resize + dpy_gfx_setdata with a dpy_gfx_replace_surface function. This handles the graphic hardware emulation. Signed-off-by: Gerd Hoffmann --- ui/console.c | 71 +++++++++++++++++++++++++----------------------------------- 1 file changed, 29 insertions(+), 42 deletions(-) (limited to 'ui/console.c') diff --git a/ui/console.c b/ui/console.c index 09f11859e1..c2ca9e7b93 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1099,8 +1099,9 @@ void console_select(unsigned int index) } active_console = s; if (ds->have_gfx) { - ds->surface = qemu_resize_displaysurface(ds, s->g_width, s->g_height); - dpy_gfx_resize(ds); + DisplaySurface *surface; + surface = qemu_create_displaysurface(s->g_width, s->g_height); + dpy_gfx_replace_surface(ds, surface); } if (ds->have_text) { dpy_text_resize(ds, s->width, s->height); @@ -1316,34 +1317,24 @@ static void qemu_alloc_display(DisplaySurface *surface, int width, int height, #endif } -DisplaySurface *qemu_create_displaysurface(DisplayState *ds, - int width, int height) +DisplaySurface *qemu_create_displaysurface(int width, int height) { DisplaySurface *surface = g_new0(DisplaySurface, 1); - int linesize = width * 4; + + trace_displaysurface_create(surface, width, height); qemu_alloc_display(surface, width, height, linesize, qemu_default_pixelformat(32), 0); return surface; } -DisplaySurface *qemu_resize_displaysurface(DisplayState *ds, - int width, int height) -{ - int linesize = width * 4; - - trace_displaysurface_resize(ds, ds->surface, width, height); - qemu_alloc_display(ds->surface, width, height, linesize, - qemu_default_pixelformat(32), 0); - return ds->surface; -} - DisplaySurface *qemu_create_displaysurface_from(int width, int height, int bpp, int linesize, uint8_t *data, bool byteswap) { DisplaySurface *surface = g_new0(DisplaySurface, 1); + trace_displaysurface_create_from(surface, width, height, bpp, byteswap); if (byteswap) { surface->pf = qemu_different_endianness_pixelformat(bpp); } else { @@ -1364,14 +1355,14 @@ DisplaySurface *qemu_create_displaysurface_from(int width, int height, int bpp, return surface; } -void qemu_free_displaysurface(DisplayState *ds) +void qemu_free_displaysurface(DisplaySurface *surface) { - trace_displaysurface_free(ds, ds->surface); - if (ds->surface == NULL) { + if (surface == NULL) { return; } - qemu_pixman_image_unref(ds->surface->image); - g_free(ds->surface); + trace_displaysurface_free(surface); + qemu_pixman_image_unref(surface->image); + g_free(surface); } void register_displaychangelistener(DisplayState *ds, @@ -1414,24 +1405,19 @@ void dpy_gfx_update(DisplayState *s, int x, int y, int w, int h) } } -void dpy_gfx_resize(DisplayState *s) +void dpy_gfx_replace_surface(DisplayState *s, + DisplaySurface *surface) { + DisplaySurface *old_surface = s->surface; struct DisplayChangeListener *dcl; + + s->surface = surface; QLIST_FOREACH(dcl, &s->listeners, next) { if (dcl->ops->dpy_gfx_resize) { dcl->ops->dpy_gfx_resize(dcl, s); } } -} - -void dpy_gfx_setdata(DisplayState *s) -{ - struct DisplayChangeListener *dcl; - QLIST_FOREACH(dcl, &s->listeners, next) { - if (dcl->ops->dpy_gfx_setdata) { - dcl->ops->dpy_gfx_setdata(dcl, s); - } - } + qemu_free_displaysurface(old_surface); } void dpy_refresh(DisplayState *s) @@ -1521,6 +1507,7 @@ bool dpy_cursor_define_supported(struct DisplayState *s) static void dumb_display_init(void) { DisplayState *ds = g_malloc0(sizeof(DisplayState)); + DisplaySurface *surface; int width = 640; int height = 480; @@ -1528,7 +1515,9 @@ static void dumb_display_init(void) width = active_console->g_width; height = active_console->g_height; } - ds->surface = qemu_create_displaysurface(ds, width, height); + surface = qemu_create_displaysurface(width, height); + dpy_gfx_replace_surface(ds, surface); + register_displaystate(ds); } @@ -1561,22 +1550,19 @@ DisplayState *graphic_console_init(vga_hw_update_ptr update, { QemuConsole *s; DisplayState *ds; + DisplaySurface *surface; ds = (DisplayState *) g_malloc0(sizeof(DisplayState)); - ds->surface = qemu_create_displaysurface(ds, 640, 480); - s = new_console(ds, GRAPHIC_CONSOLE); - if (s == NULL) { - qemu_free_displaysurface(ds); - g_free(ds); - return NULL; - } s->hw_update = update; s->hw_invalidate = invalidate; s->hw_screen_dump = screen_dump; s->hw_text_update = text_update; s->hw = opaque; + surface = qemu_create_displaysurface(640, 480); + dpy_gfx_replace_surface(ds, surface); + register_displaystate(ds); return ds; } @@ -1752,8 +1738,9 @@ void qemu_console_resize(DisplayState *ds, int width, int height) s->g_width = width; s->g_height = height; if (is_graphic_console()) { - ds->surface = qemu_resize_displaysurface(ds, width, height); - dpy_gfx_resize(ds); + DisplaySurface *surface; + surface = qemu_create_displaysurface(width, height); + dpy_gfx_replace_surface(ds, surface); } } -- cgit v1.2.3