On Mon, Nov 23, 2015 at 6:02 PM, Frediano Ziglio <fziglio@xxxxxxxxxx> wrote: > From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> > > --- > 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 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel Looks good. Acked-by: Fabiano Fidêncio <fidencio@xxxxxxxxxx> _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel