[Spice-devel] [PATCH v3] server: add QXLInterface::surface_updated callback

Alon Levy alevy at redhat.com
Mon Jul 11 03:48:38 PDT 2011


On Sun, Jul 10, 2011 at 09:55:21AM +0300, Yonit Halperin wrote:
> On 07/07/2011 07:33 PM, Alon Levy wrote:
> >used to move dirty rectangle notification from update_area to surface_updated.
> >
> >This is RfC quality. Specifically where to call surface_updated. Currently I
> >only call it from stop. This should be good enough for migration, which is
> >the only use case I think. This means after stop qemu is guranteed to know
> >the dirty regions of all surfaces.
> >---
> >  server/red_dispatcher.c          |   20 +++--------
> >  server/red_worker.c              |   71 +++++++++++++++++++++++++------------
> >  server/spice.h                   |    8 ++--
> >  server/tests/test_display_base.c |    2 +-
> >  4 files changed, 58 insertions(+), 43 deletions(-)
> >
> >diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
> >index 3dfd4e5..996e1ed 100644
> >--- a/server/red_dispatcher.c
> >+++ b/server/red_dispatcher.c
> >@@ -210,9 +210,7 @@ static void update_client_mouse_allowed(void)
> >  }
> >
> >  static void qxl_worker_update_area_helper(QXLWorker *qxl_worker, uint32_t surface_id,
> >-                                   QXLRect *qxl_area, QXLRect *qxl_dirty_rects,
> >-                                   uint32_t num_dirty_rects, uint32_t clear_dirty_region,
> >-                                   int async, uint64_t cookie)
> >+                                   QXLRect *qxl_area, int async, uint64_t cookie)
> >  {
> >      RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
> >      RedWorkerMessage message;
> >@@ -228,9 +226,6 @@ static void qxl_worker_update_area_helper(QXLWorker *qxl_worker, uint32_t surfac
> >      }
> >      send_data(dispatcher->channel,&surface_id, sizeof(uint32_t));
> >      send_data(dispatcher->channel,&qxl_area, sizeof(QXLRect *));
> >-    send_data(dispatcher->channel,&qxl_dirty_rects, sizeof(QXLRect *));
> >-    send_data(dispatcher->channel,&num_dirty_rects, sizeof(uint32_t));
> >-    send_data(dispatcher->channel,&clear_dirty_region, sizeof(uint32_t));
> >      if (async) {
> >          return;
> >      }
> >@@ -239,22 +234,17 @@ static void qxl_worker_update_area_helper(QXLWorker *qxl_worker, uint32_t surfac
> >  }
> >
> >  static void qxl_worker_update_area(QXLWorker *qxl_worker, uint32_t surface_id,
> >-                                   QXLRect *qxl_area, QXLRect *qxl_dirty_rects,
> >-                                   uint32_t num_dirty_rects, uint32_t clear_dirty_region)
> >+                                   QXLRect *qxl_area)
> >  {
> >-    qxl_worker_update_area_helper(qxl_worker, surface_id, qxl_area, qxl_dirty_rects, num_dirty_rects,
> >-        clear_dirty_region, 0, 0);
> >+    qxl_worker_update_area_helper(qxl_worker, surface_id, qxl_area, 0, 0);
> >  }
> >
> >  static void qxl_worker_update_area_async(QXLWorker *qxl_worker, uint32_t surface_id,
> >-                                   QXLRect *qxl_area, QXLRect *qxl_dirty_rects,
> >-                                   uint32_t num_dirty_rects, uint32_t clear_dirty_region, uint64_t cookie)
> >+                                         QXLRect *qxl_area, uint64_t cookie)
> >  {
> >-    qxl_worker_update_area_helper(qxl_worker, surface_id, qxl_area, qxl_dirty_rects, num_dirty_rects,
> >-        clear_dirty_region, 1, cookie);
> >+    qxl_worker_update_area_helper(qxl_worker, surface_id, qxl_area, 1, cookie);
> >  }
> >
> >-
> >  static void qxl_worker_add_memslot(QXLWorker *qxl_worker, QXLDevMemSlot *mem_slot)
> >  {
> >      RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
> >diff --git a/server/red_worker.c b/server/red_worker.c
> >index cb84754..f5b5570 100644
> >--- a/server/red_worker.c
> >+++ b/server/red_worker.c
> >@@ -9415,25 +9415,56 @@ static void red_wait_pipe_item_sent(RedChannel *channel, PipeItem *item)
> >      red_unref_channel(channel);
> >  }
> >
> >+static int surface_updated_available(RedWorker *worker)
> >+{
> >+    int minor = worker->qxl->st->qif->base.minor_version;
> >+    int major = worker->qxl->st->qif->base.major_version;
> >+
> >+    return (major>  3 || (major == 3&&  minor>= 1))&&
> >+            worker->qxl->st->qif->surface_updated != NULL;
> >+}
> Hi,
> can qxl < 3.1 be compiled with the interface changes to update_area?
> 

no. To use a newer spice a newer qxl will also need to be used.


More information about the Spice-devel mailing list