[Spice-devel] [PATCH 17/18] display: factor out draw_until

Frediano Ziglio fziglio at redhat.com
Mon Nov 23 09:02:03 PST 2015


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

---
 server/display-channel.c | 70 ++++++++++++++++++++++--------------------------
 1 file changed, 32 insertions(+), 38 deletions(-)

diff --git a/server/display-channel.c b/server/display-channel.c
index c5a69e3..a78f86a 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -1281,6 +1281,24 @@ static void surface_update_dest(RedSurface *surface, const SpiceRect *area)
     canvas->ops->read_bits(canvas, dest, -stride, area);
 }
 
+static void draw_until(DisplayChannel *display, RedSurface *surface, Drawable *last)
+{
+    RingItem *ring_item;
+    Container *container;
+    Drawable *now;
+
+    do {
+        ring_item = ring_get_tail(&surface->current_list);
+        now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
+        now->refs++;
+        container = now->tree_item.base.container;
+        current_remove_drawable(display, now);
+        container_cleanup(container);
+        drawable_draw(display, now);
+        display_channel_drawable_unref(display, now);
+    } while (now != last);
+}
+
 /*
  * Renders drawables for updating the requested area, but only drawables that are older
  * than 'last' (exclusive).
@@ -1340,27 +1358,18 @@ void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, i
 
     region_destroy(&rgn);
 
-    if (!surface_last) {
-        return;
-    }
-
-    do {
-        Container *container;
+    /* drawable_draw may call display_channel_draw for the surfaces
+     * 'now' depends on. Notice, that it is valid to call
+     * display_channel_draw in this case and not
+     * display_channel_draw_till: It is impossible that there was
+     * newer item then 'last' in one of the surfaces that
+     * display_channel_draw is called for, Otherwise, 'now' would have
+     * already been rendered.  See the call for
+     * red_handle_depends_on_target_surface in red_process_draw
+     */
+    if (surface_last)
+        draw_until(display, surface, surface_last);
 
-        ring_item = ring_get_tail(&surface->current_list);
-        now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
-        now->refs++;
-        container = now->tree_item.base.container;
-        current_remove_drawable(display, now);
-        container_cleanup(container);
-        /* drawable_draw may call display_channel_draw for the surfaces 'now' depends on. Notice,
-           that it is valid to call display_channel_draw in this case and not display_channel_draw_till:
-           It is impossible that there was newer item then 'last' in one of the surfaces
-           that display_channel_draw is called for, Otherwise, 'now' would have already been rendered.
-           See the call for red_handle_depends_on_target_surface in red_process_draw */
-        drawable_draw(display, now);
-        display_channel_drawable_unref(display, now);
-    } while (now != surface_last);
     surface_update_dest(surface, area);
 }
 
@@ -1370,8 +1379,7 @@ void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int su
     Ring *ring;
     RingItem *ring_item;
     QRegion rgn;
-    Drawable *last;
-    Drawable *now;
+    Drawable *last, *now;
     spice_debug("surface %d: area ==>", surface_id);
     rect_debug(area);
 
@@ -1397,22 +1405,8 @@ void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int su
     }
     region_destroy(&rgn);
 
-    if (!last) {
-        surface_update_dest(surface, area);
-        return;
-    }
-
-    do {
-        Container *container;
+    if (last)
+        draw_until(display, surface, last);
 
-        ring_item = ring_get_tail(&surface->current_list);
-        now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
-        now->refs++;
-        container = now->tree_item.base.container;
-        current_remove_drawable(display, now);
-        container_cleanup(container);
-        drawable_draw(display, now);
-        display_channel_drawable_unref(display, now);
-    } while (now != last);
     surface_update_dest(surface, area);
 }
-- 
2.4.3



More information about the Spice-devel mailing list