--- hw/qxl.c | 44 ++++++++++++++++++++++++++------------------ 1 files changed, 26 insertions(+), 18 deletions(-)
diff --git a/hw/qxl.c b/hw/qxl.c index 538f51e..247c260 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -824,9 +824,9 @@ void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id) } } -static void qxl_create_guest_primary(PCIQXLDevice *qxl, int loadvm) +static void qxl_create_guest_primary(PCIQXLDevice *qxl, int loadvm, + QXLDevSurfaceCreate *surface) { - QXLDevSurfaceCreate surface; QXLSurfaceCreate *sc = &qxl->guest_primary.surface; assert(qxl->mode != QXL_MODE_NATIVE); @@ -835,24 +835,23 @@ static void qxl_create_guest_primary(PCIQXLDevice *qxl, int loadvm) dprint(qxl, 1, "%s: %dx%d\n", __FUNCTION__, le32_to_cpu(sc->width), le32_to_cpu(sc->height)); - surface.format = le32_to_cpu(sc->format); - surface.height = le32_to_cpu(sc->height); - surface.mem = le64_to_cpu(sc->mem); - surface.position = le32_to_cpu(sc->position); - surface.stride = le32_to_cpu(sc->stride); - surface.width = le32_to_cpu(sc->width); - surface.type = le32_to_cpu(sc->type); - surface.flags = le32_to_cpu(sc->flags); - - surface.mouse_mode = true; - surface.group_id = MEMSLOT_GROUP_GUEST; + surface->format = le32_to_cpu(sc->format); + surface->height = le32_to_cpu(sc->height); + surface->mem = le64_to_cpu(sc->mem); + surface->position = le32_to_cpu(sc->position); + surface->stride = le32_to_cpu(sc->stride); + surface->width = le32_to_cpu(sc->width); + surface->type = le32_to_cpu(sc->type); + surface->flags = le32_to_cpu(sc->flags); + + surface->mouse_mode = true; + surface->group_id = MEMSLOT_GROUP_GUEST; if (loadvm) { - surface.flags |= QXL_SURF_FLAG_KEEP_DATA; + surface->flags |= QXL_SURF_FLAG_KEEP_DATA; } qxl->mode = QXL_MODE_NATIVE; qxl->cmdflags = 0; - qemu_spice_create_primary_surface(&qxl->ssd, 0, &surface); /* for local rendering */ qxl_render_resize(qxl); @@ -890,6 +889,7 @@ static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm) .mouse_mode = true, .mem = devmem + d->shadow_rom.draw_area_offset, }; + QXLDevSurfaceCreate s; dprint(d, 1, "%s: mode %d [ %d x %d @ %d bpp devmem 0x%lx ]\n", __FUNCTION__, modenr, mode->x_res, mode->y_res, mode->bits, devmem); @@ -902,7 +902,8 @@ static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm) qemu_spice_add_memslot(&d->ssd, &memslot); d->guest_primary.surface = surface; - qxl_create_guest_primary(d, 0); + qxl_create_guest_primary(d, 0, &s); + qemu_spice_create_primary_surface(&d->ssd, 0, &s); d->mode = QXL_MODE_COMPAT; d->cmdflags = QXL_COMMAND_FLAG_COMPAT; @@ -992,11 +993,16 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val) qxl_del_memslot(d, val); break; case QXL_IO_CREATE_PRIMARY: + { + QXLDevSurfaceCreate surface; + PANIC_ON(val != 0); dprint(d, 1, "QXL_IO_CREATE_PRIMARY\n"); d->guest_primary.surface = d->ram->create_surface; - qxl_create_guest_primary(d, 0); + qxl_create_guest_primary(d, 0, &surface); + qemu_spice_create_primary_surface(&d->ssd, 0, &surface); break; + } case QXL_IO_DESTROY_PRIMARY: PANIC_ON(val != 0); dprint(d, 1, "QXL_IO_DESTROY_PRIMARY\n"); @@ -1367,6 +1373,7 @@ static int qxl_post_load(void *opaque, int version) uint8_t *ram_start = d->vga.vram_ptr; QXLCommandExt *cmds; QXLDevMemSlot memslot; + QXLDevSurfaceCreate surface; int in, out, i, newmode; dprint(d, 1, "%s: start\n", __FUNCTION__); @@ -1397,7 +1404,8 @@ static int qxl_post_load(void *opaque, int version) qxl_add_memslot(d, i, 0, &memslot); qemu_spice_add_memslot(&d->ssd, &memslot); } - qxl_create_guest_primary(d, 1); + qxl_create_guest_primary(d, 1, &surface); + qemu_spice_create_primary_surface(&d->ssd, 0, &surface); /* replay surface-create and cursor-set commands */ cmds = qemu_mallocz(sizeof(QXLCommandExt) * (NUM_SURFACES + 1)); -- 1.7.1 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel