[Spice-devel] [PATCH 16/18] worker: move display_channel_update

Frediano Ziglio fziglio at redhat.com
Tue Nov 24 03:13:20 PST 2015


From: Marc-André Lureau <marcandre.lureau at gmail.com>

---
 server/display-channel.c | 39 +++++++++++++++++++++++++++++++++++++++
 server/display-channel.h |  6 ++++++
 server/red_worker.c      | 39 ---------------------------------------
 3 files changed, 45 insertions(+), 39 deletions(-)

diff --git a/server/display-channel.c b/server/display-channel.c
index 0fbddf5..fce9dd5 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -1403,6 +1403,45 @@ void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int su
     surface_update_dest(surface, area);
 }
 
+static void region_to_qxlrects(QRegion *region, QXLRect *qxl_rects, uint32_t num_rects)
+{
+    SpiceRect *rects;
+    int i;
+
+    rects = spice_new0(SpiceRect, num_rects);
+    region_ret_rects(region, rects, num_rects);
+    for (i = 0; i < num_rects; i++) {
+        qxl_rects[i].top    = rects[i].top;
+        qxl_rects[i].left   = rects[i].left;
+        qxl_rects[i].bottom = rects[i].bottom;
+        qxl_rects[i].right  = rects[i].right;
+    }
+    free(rects);
+}
+
+void display_channel_update(DisplayChannel *display,
+                            uint32_t surface_id, const QXLRect *area, uint32_t clear_dirty,
+                            QXLRect **qxl_dirty_rects, uint32_t *num_dirty_rects)
+{
+    SpiceRect rect;
+    RedSurface *surface;
+
+    spice_return_if_fail(validate_surface(display, surface_id));
+
+    red_get_rect_ptr(&rect, area);
+    display_channel_draw(display, &rect, surface_id);
+
+    surface = &display->surfaces[surface_id];
+    if (!*qxl_dirty_rects) {
+        *num_dirty_rects = pixman_region32_n_rects(&surface->draw_dirty_region);
+        *qxl_dirty_rects = spice_new0(QXLRect, *num_dirty_rects);
+    }
+
+    region_to_qxlrects(&surface->draw_dirty_region, *qxl_dirty_rects, *num_dirty_rects);
+    if (clear_dirty)
+        region_clear(&surface->draw_dirty_region);
+}
+
 static void clear_surface_drawables_from_pipes(DisplayChannel *display, int surface_id,
                                                int wait_if_used)
 {
diff --git a/server/display-channel.h b/server/display-channel.h
index 750362b..0d79463 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -266,6 +266,12 @@ void                       display_channel_draw_until                (DisplayCha
                                                                       const SpiceRect *area,
                                                                       int surface_id,
                                                                       Drawable *last);
+void                       display_channel_update                    (DisplayChannel *display,
+                                                                      uint32_t surface_id,
+                                                                      const QXLRect *area,
+                                                                      uint32_t clear_dirty,
+                                                                      QXLRect **qxl_dirty_rects,
+                                                                      uint32_t *num_dirty_rects);
 void                       display_channel_free_some                 (DisplayChannel *display);
 void                       display_channel_set_stream_video          (DisplayChannel *display,
                                                                       int stream_video);
diff --git a/server/red_worker.c b/server/red_worker.c
index 470f813..0816f63 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -3803,45 +3803,6 @@ static void cursor_connect(RedWorker *worker, RedClient *client, RedsStream *str
         cursor_channel_init(channel, ccc);
 }
 
-static void region_to_qxlrects(QRegion *region, QXLRect *qxl_rects, uint32_t num_rects)
-{
-    SpiceRect *rects;
-    int i;
-
-    rects = spice_new0(SpiceRect, num_rects);
-    region_ret_rects(region, rects, num_rects);
-    for (i = 0; i < num_rects; i++) {
-        qxl_rects[i].top    = rects[i].top;
-        qxl_rects[i].left   = rects[i].left;
-        qxl_rects[i].bottom = rects[i].bottom;
-        qxl_rects[i].right  = rects[i].right;
-    }
-    free(rects);
-}
-
-void display_channel_update(DisplayChannel *display,
-                            uint32_t surface_id, const QXLRect *area, uint32_t clear_dirty,
-                            QXLRect **qxl_dirty_rects, uint32_t *num_dirty_rects)
-{
-    SpiceRect rect;
-    RedSurface *surface;
-
-    spice_return_if_fail(validate_surface(display, surface_id));
-
-    red_get_rect_ptr(&rect, area);
-    display_channel_draw(display, &rect, surface_id);
-
-    surface = &display->surfaces[surface_id];
-    if (!*qxl_dirty_rects) {
-        *num_dirty_rects = pixman_region32_n_rects(&surface->draw_dirty_region);
-        *qxl_dirty_rects = spice_new0(QXLRect, *num_dirty_rects);
-    }
-
-    region_to_qxlrects(&surface->draw_dirty_region, *qxl_dirty_rects, *num_dirty_rects);
-    if (clear_dirty)
-        region_clear(&surface->draw_dirty_region);
-}
-
 static void handle_dev_update_async(void *opaque, void *payload)
 {
     RedWorker *worker = opaque;
-- 
2.4.3



More information about the Spice-devel mailing list