aboutsummaryrefslogtreecommitdiffstats
path: root/hw/qxl-render.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2011-10-21 21:53:54 +0200
committerGerd Hoffmann <kraxel@redhat.com>2011-11-01 12:11:53 +0100
commita053f1b1fb63cb57483354db7b154e9a2e585b5a (patch)
treeddee16ed23374b5bb8dba9f61e8e879589173ce8 /hw/qxl-render.c
parent0e2487bd6f56445b43307536a465ee2ba810aed9 (diff)
qxl: make sure we continue to run with a shared buffer
The qxl renderer works only with a shared displaysurface. So better make sure we actually have one and restore it when needed. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/qxl-render.c')
-rw-r--r--hw/qxl-render.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/hw/qxl-render.c b/hw/qxl-render.c
index a5676938a..2c51ba980 100644
--- a/hw/qxl-render.c
+++ b/hw/qxl-render.c
@@ -76,7 +76,14 @@ void qxl_render_update(PCIQXLDevice *qxl)
VGACommonState *vga = &qxl->vga;
QXLRect dirty[32], update;
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) {
qxl->guest_primary.resized = 0;
@@ -127,6 +134,10 @@ void qxl_render_update(PCIQXLDevice *qxl)
memset(dirty, 0, sizeof(dirty));
qxl_spice_update_area(qxl, 0, &update,
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++) {
if (qemu_spice_rect_is_empty(dirty+i)) {