[Spice-devel] [PATCH 17/18] display: factor out draw_until
Fabiano Fidêncio
fidencio at redhat.com
Mon Nov 23 11:06:47 PST 2015
On Mon, Nov 23, 2015 at 8:05 PM, Fabiano Fidêncio <fidencio at redhat.com> wrote:
> On Mon, Nov 23, 2015 at 6:02 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
>> 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;
Ah, one minor: this change can be dropped from this patch.
>> 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 at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
> Looks good.
> Acked-by: Fabiano Fidêncio <fidencio at redhat.com>
More information about the Spice-devel
mailing list