Blame 0217-spice-add-screen-mirror.patch

Hans de Goede 93b7e3
From d7080640a03a1c7739eb730eaec0c63e7e12cdb6 Mon Sep 17 00:00:00 2001
Hans de Goede 93b7e3
From: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede 93b7e3
Date: Wed, 5 Sep 2012 09:35:57 +0200
Hans de Goede 93b7e3
Subject: [PATCH 217/293] spice: add screen mirror
Hans de Goede 93b7e3
Hans de Goede 93b7e3
Create a screen mirror, keep there a copy of the most recent update
Hans de Goede 93b7e3
passed on to spice-server.
Hans de Goede 93b7e3
Hans de Goede 93b7e3
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede 93b7e3
---
Hans de Goede 93b7e3
 ui/spice-display.c | 32 ++++++++++++++++++++++----------
Hans de Goede 93b7e3
 ui/spice-display.h |  1 +
Hans de Goede 93b7e3
 2 files changed, 23 insertions(+), 10 deletions(-)
Hans de Goede 93b7e3
Hans de Goede 93b7e3
diff --git a/ui/spice-display.c b/ui/spice-display.c
Hans de Goede 93b7e3
index 6f68f28..973cd53 100644
Hans de Goede 93b7e3
--- a/ui/spice-display.c
Hans de Goede 93b7e3
+++ b/ui/spice-display.c
Hans de Goede 93b7e3
@@ -171,8 +171,8 @@ static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd,
Hans de Goede 93b7e3
     QXLDrawable *drawable;
Hans de Goede 93b7e3
     QXLImage *image;
Hans de Goede 93b7e3
     QXLCommand *cmd;
Hans de Goede 93b7e3
-    uint8_t *src, *dst;
Hans de Goede 93b7e3
-    int by, bw, bh;
Hans de Goede 93b7e3
+    uint8_t *src, *mirror, *dst;
Hans de Goede 93b7e3
+    int by, bw, bh, offset, bytes;
Hans de Goede 93b7e3
     struct timespec time_space;
Hans de Goede 93b7e3
 
Hans de Goede 93b7e3
     trace_qemu_spice_create_update(
Hans de Goede 93b7e3
@@ -216,19 +216,18 @@ static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd,
Hans de Goede 93b7e3
     image->bitmap.palette = 0;
Hans de Goede 93b7e3
     image->bitmap.format = SPICE_BITMAP_FMT_32BIT;
Hans de Goede 93b7e3
 
Hans de Goede 93b7e3
-    if (ssd->conv == NULL) {
Hans de Goede 93b7e3
-        PixelFormat dst = qemu_default_pixelformat(32);
Hans de Goede 93b7e3
-        ssd->conv = qemu_pf_conv_get(&dst, &ssd->ds->surface->pf);
Hans de Goede 93b7e3
-        assert(ssd->conv);
Hans de Goede 93b7e3
-    }
Hans de Goede 93b7e3
-
Hans de Goede 93b7e3
-    src = ds_get_data(ssd->ds) +
Hans de Goede 93b7e3
+    offset =
Hans de Goede 93b7e3
         rect->top * ds_get_linesize(ssd->ds) +
Hans de Goede 93b7e3
         rect->left * ds_get_bytes_per_pixel(ssd->ds);
Hans de Goede 93b7e3
+    bytes = ds_get_bytes_per_pixel(ssd->ds) * bw;
Hans de Goede 93b7e3
+    src = ds_get_data(ssd->ds) + offset;
Hans de Goede 93b7e3
+    mirror = ssd->ds_mirror + offset;
Hans de Goede 93b7e3
     dst = update->bitmap;
Hans de Goede 93b7e3
     for (by = 0; by < bh; by++) {
Hans de Goede 93b7e3
-        qemu_pf_conv_run(ssd->conv, dst, src, bw);
Hans de Goede 93b7e3
+        memcpy(mirror, src, bytes);
Hans de Goede 93b7e3
+        qemu_pf_conv_run(ssd->conv, dst, mirror, bw);
Hans de Goede 93b7e3
         src += ds_get_linesize(ssd->ds);
Hans de Goede 93b7e3
+        mirror += ds_get_linesize(ssd->ds);
Hans de Goede 93b7e3
         dst += image->bitmap.stride;
Hans de Goede 93b7e3
     }
Hans de Goede 93b7e3
 
Hans de Goede 93b7e3
@@ -243,6 +242,17 @@ static void qemu_spice_create_update(SimpleSpiceDisplay *ssd)
Hans de Goede 93b7e3
     if (qemu_spice_rect_is_empty(&ssd->dirty)) {
Hans de Goede 93b7e3
         return;
Hans de Goede 93b7e3
     };
Hans de Goede 93b7e3
+
Hans de Goede 93b7e3
+    if (ssd->conv == NULL) {
Hans de Goede 93b7e3
+        PixelFormat dst = qemu_default_pixelformat(32);
Hans de Goede 93b7e3
+        ssd->conv = qemu_pf_conv_get(&dst, &ssd->ds->surface->pf);
Hans de Goede 93b7e3
+        assert(ssd->conv);
Hans de Goede 93b7e3
+    }
Hans de Goede 93b7e3
+    if (ssd->ds_mirror == NULL) {
Hans de Goede 93b7e3
+        int size = ds_get_height(ssd->ds) * ds_get_linesize(ssd->ds);
Hans de Goede 93b7e3
+        ssd->ds_mirror = g_malloc0(size);
Hans de Goede 93b7e3
+    }
Hans de Goede 93b7e3
+
Hans de Goede 93b7e3
     qemu_spice_create_one_update(ssd, &ssd->dirty);
Hans de Goede 93b7e3
     memset(&ssd->dirty, 0, sizeof(ssd->dirty));
Hans de Goede 93b7e3
 }
Hans de Goede 93b7e3
@@ -358,6 +368,8 @@ void qemu_spice_display_resize(SimpleSpiceDisplay *ssd)
Hans de Goede 93b7e3
     memset(&ssd->dirty, 0, sizeof(ssd->dirty));
Hans de Goede 93b7e3
     qemu_pf_conv_put(ssd->conv);
Hans de Goede 93b7e3
     ssd->conv = NULL;
Hans de Goede 93b7e3
+    g_free(ssd->ds_mirror);
Hans de Goede 93b7e3
+    ssd->ds_mirror = NULL;
Hans de Goede 93b7e3
 
Hans de Goede 93b7e3
     qemu_mutex_lock(&ssd->lock);
Hans de Goede 93b7e3
     while ((update = QTAILQ_FIRST(&ssd->updates)) != NULL) {
Hans de Goede 93b7e3
diff --git a/ui/spice-display.h b/ui/spice-display.h
Hans de Goede 93b7e3
index 3fcb6fe..dea41c1 100644
Hans de Goede 93b7e3
--- a/ui/spice-display.h
Hans de Goede 93b7e3
+++ b/ui/spice-display.h
Hans de Goede 93b7e3
@@ -72,6 +72,7 @@ typedef struct SimpleSpiceUpdate SimpleSpiceUpdate;
Hans de Goede 93b7e3
 
Hans de Goede 93b7e3
 struct SimpleSpiceDisplay {
Hans de Goede 93b7e3
     DisplayState *ds;
Hans de Goede 93b7e3
+    uint8_t *ds_mirror;
Hans de Goede 93b7e3
     void *buf;
Hans de Goede 93b7e3
     int bufsize;
Hans de Goede 93b7e3
     QXLWorker *worker;
Hans de Goede 93b7e3
-- 
Hans de Goede 93b7e3
1.7.12
Hans de Goede 93b7e3