mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
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:
parent
468dfd6de2
commit
da229ef3b3
8 changed files with 54 additions and 84 deletions
71
ui/console.c
71
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue