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 <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2013-02-28 10:48:02 +01:00
parent 468dfd6de2
commit da229ef3b3
8 changed files with 54 additions and 84 deletions

View file

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