提交 110fc086 编写于 作者: A Anthony Liguori

Merge remote-tracking branch 'spice/spice.v46' into staging

...@@ -28,16 +28,16 @@ static void qxl_flip(PCIQXLDevice *qxl, QXLRect *rect) ...@@ -28,16 +28,16 @@ static void qxl_flip(PCIQXLDevice *qxl, QXLRect *rect)
int len, i; int len, i;
src += (qxl->guest_primary.surface.height - rect->top - 1) * src += (qxl->guest_primary.surface.height - rect->top - 1) *
qxl->guest_primary.stride; qxl->guest_primary.abs_stride;
dst += rect->top * qxl->guest_primary.stride; dst += rect->top * qxl->guest_primary.abs_stride;
src += rect->left * qxl->guest_primary.bytes_pp; src += rect->left * qxl->guest_primary.bytes_pp;
dst += rect->left * qxl->guest_primary.bytes_pp; dst += rect->left * qxl->guest_primary.bytes_pp;
len = (rect->right - rect->left) * qxl->guest_primary.bytes_pp; len = (rect->right - rect->left) * qxl->guest_primary.bytes_pp;
for (i = rect->top; i < rect->bottom; i++) { for (i = rect->top; i < rect->bottom; i++) {
memcpy(dst, src, len); memcpy(dst, src, len);
dst += qxl->guest_primary.stride; dst += qxl->guest_primary.abs_stride;
src -= qxl->guest_primary.stride; src -= qxl->guest_primary.abs_stride;
} }
} }
...@@ -45,7 +45,8 @@ void qxl_render_resize(PCIQXLDevice *qxl) ...@@ -45,7 +45,8 @@ void qxl_render_resize(PCIQXLDevice *qxl)
{ {
QXLSurfaceCreate *sc = &qxl->guest_primary.surface; QXLSurfaceCreate *sc = &qxl->guest_primary.surface;
qxl->guest_primary.stride = sc->stride; qxl->guest_primary.qxl_stride = sc->stride;
qxl->guest_primary.abs_stride = abs(sc->stride);
qxl->guest_primary.resized++; qxl->guest_primary.resized++;
switch (sc->format) { switch (sc->format) {
case SPICE_SURFACE_FMT_16_555: case SPICE_SURFACE_FMT_16_555:
...@@ -75,7 +76,14 @@ void qxl_render_update(PCIQXLDevice *qxl) ...@@ -75,7 +76,14 @@ void qxl_render_update(PCIQXLDevice *qxl)
VGACommonState *vga = &qxl->vga; VGACommonState *vga = &qxl->vga;
QXLRect dirty[32], update; QXLRect dirty[32], update;
void *ptr; void *ptr;
int i; int i, redraw = 0;
if (!is_buffer_shared(vga->ds->surface)) {
dprint(qxl, 1, "%s: restoring shared displaysurface\n", __func__);
qxl->guest_primary.resized++;
qxl->guest_primary.commands++;
redraw = 1;
}
if (qxl->guest_primary.resized) { if (qxl->guest_primary.resized) {
qxl->guest_primary.resized = 0; qxl->guest_primary.resized = 0;
...@@ -87,11 +95,11 @@ void qxl_render_update(PCIQXLDevice *qxl) ...@@ -87,11 +95,11 @@ void qxl_render_update(PCIQXLDevice *qxl)
qemu_free_displaysurface(vga->ds); qemu_free_displaysurface(vga->ds);
qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram); qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram);
if (qxl->guest_primary.stride < 0) { if (qxl->guest_primary.qxl_stride < 0) {
/* spice surface is upside down -> need extra buffer to flip */ /* spice surface is upside down -> need extra buffer to flip */
qxl->guest_primary.stride = -qxl->guest_primary.stride; qxl->guest_primary.flipped =
qxl->guest_primary.flipped = g_malloc(qxl->guest_primary.surface.width * g_malloc(qxl->guest_primary.surface.width *
qxl->guest_primary.stride); qxl->guest_primary.abs_stride);
ptr = qxl->guest_primary.flipped; ptr = qxl->guest_primary.flipped;
} else { } else {
ptr = qxl->guest_primary.data; ptr = qxl->guest_primary.data;
...@@ -100,7 +108,7 @@ void qxl_render_update(PCIQXLDevice *qxl) ...@@ -100,7 +108,7 @@ void qxl_render_update(PCIQXLDevice *qxl)
__FUNCTION__, __FUNCTION__,
qxl->guest_primary.surface.width, qxl->guest_primary.surface.width,
qxl->guest_primary.surface.height, qxl->guest_primary.surface.height,
qxl->guest_primary.stride, qxl->guest_primary.qxl_stride,
qxl->guest_primary.bytes_pp, qxl->guest_primary.bytes_pp,
qxl->guest_primary.bits_pp, qxl->guest_primary.bits_pp,
qxl->guest_primary.flipped ? "yes" : "no"); qxl->guest_primary.flipped ? "yes" : "no");
...@@ -108,7 +116,7 @@ void qxl_render_update(PCIQXLDevice *qxl) ...@@ -108,7 +116,7 @@ void qxl_render_update(PCIQXLDevice *qxl)
qemu_create_displaysurface_from(qxl->guest_primary.surface.width, qemu_create_displaysurface_from(qxl->guest_primary.surface.width,
qxl->guest_primary.surface.height, qxl->guest_primary.surface.height,
qxl->guest_primary.bits_pp, qxl->guest_primary.bits_pp,
qxl->guest_primary.stride, qxl->guest_primary.abs_stride,
ptr); ptr);
dpy_resize(vga->ds); dpy_resize(vga->ds);
} }
...@@ -126,6 +134,10 @@ void qxl_render_update(PCIQXLDevice *qxl) ...@@ -126,6 +134,10 @@ void qxl_render_update(PCIQXLDevice *qxl)
memset(dirty, 0, sizeof(dirty)); memset(dirty, 0, sizeof(dirty));
qxl_spice_update_area(qxl, 0, &update, qxl_spice_update_area(qxl, 0, &update,
dirty, ARRAY_SIZE(dirty), 1, QXL_SYNC); dirty, ARRAY_SIZE(dirty), 1, QXL_SYNC);
if (redraw) {
memset(dirty, 0, sizeof(dirty));
dirty[0] = update;
}
for (i = 0; i < ARRAY_SIZE(dirty); i++) { for (i = 0; i < ARRAY_SIZE(dirty); i++) {
if (qemu_spice_rect_is_empty(dirty+i)) { if (qemu_spice_rect_is_empty(dirty+i)) {
......
...@@ -1663,12 +1663,25 @@ static int qxl_pre_load(void *opaque) ...@@ -1663,12 +1663,25 @@ static int qxl_pre_load(void *opaque)
return 0; return 0;
} }
static void qxl_create_memslots(PCIQXLDevice *d)
{
int i;
for (i = 0; i < NUM_MEMSLOTS; i++) {
if (!d->guest_slots[i].active) {
continue;
}
dprint(d, 1, "%s: restoring guest slot %d\n", __func__, i);
qxl_add_memslot(d, i, 0, QXL_SYNC);
}
}
static int qxl_post_load(void *opaque, int version) static int qxl_post_load(void *opaque, int version)
{ {
PCIQXLDevice* d = opaque; PCIQXLDevice* d = opaque;
uint8_t *ram_start = d->vga.vram_ptr; uint8_t *ram_start = d->vga.vram_ptr;
QXLCommandExt *cmds; QXLCommandExt *cmds;
int in, out, i, newmode; int in, out, newmode;
dprint(d, 1, "%s: start\n", __FUNCTION__); dprint(d, 1, "%s: start\n", __FUNCTION__);
...@@ -1685,19 +1698,16 @@ static int qxl_post_load(void *opaque, int version) ...@@ -1685,19 +1698,16 @@ static int qxl_post_load(void *opaque, int version)
qxl_mode_to_string(d->mode)); qxl_mode_to_string(d->mode));
newmode = d->mode; newmode = d->mode;
d->mode = QXL_MODE_UNDEFINED; d->mode = QXL_MODE_UNDEFINED;
switch (newmode) { switch (newmode) {
case QXL_MODE_UNDEFINED: case QXL_MODE_UNDEFINED:
break; break;
case QXL_MODE_VGA: case QXL_MODE_VGA:
qxl_create_memslots(d);
qxl_enter_vga_mode(d); qxl_enter_vga_mode(d);
break; break;
case QXL_MODE_NATIVE: case QXL_MODE_NATIVE:
for (i = 0; i < NUM_MEMSLOTS; i++) { qxl_create_memslots(d);
if (!d->guest_slots[i].active) {
continue;
}
qxl_add_memslot(d, i, 0, QXL_SYNC);
}
qxl_create_guest_primary(d, 1, QXL_SYNC); qxl_create_guest_primary(d, 1, QXL_SYNC);
/* replay surface-create and cursor-set commands */ /* replay surface-create and cursor-set commands */
...@@ -1722,6 +1732,8 @@ static int qxl_post_load(void *opaque, int version) ...@@ -1722,6 +1732,8 @@ static int qxl_post_load(void *opaque, int version)
break; break;
case QXL_MODE_COMPAT: case QXL_MODE_COMPAT:
/* note: no need to call qxl_create_memslots, qxl_set_mode
* creates the mem slot. */
qxl_set_mode(d, d->shadow_rom.mode, 1); qxl_set_mode(d, d->shadow_rom.mode, 1);
break; break;
} }
......
...@@ -48,7 +48,8 @@ typedef struct PCIQXLDevice { ...@@ -48,7 +48,8 @@ typedef struct PCIQXLDevice {
QXLSurfaceCreate surface; QXLSurfaceCreate surface;
uint32_t commands; uint32_t commands;
uint32_t resized; uint32_t resized;
int32_t stride; int32_t qxl_stride;
uint32_t abs_stride;
uint32_t bits_pp; uint32_t bits_pp;
uint32_t bytes_pp; uint32_t bytes_pp;
uint8_t *data, *flipped; uint8_t *data, *flipped;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册