[Spice-devel] [PATCH 05/19] display: reuse code in display_channel_draw_until

Fabiano Fidêncio fidencio at redhat.com
Wed Nov 25 08:47:55 PST 2015


On Wed, Nov 25, 2015 at 5:42 PM, Fabiano Fidêncio <fidencio at redhat.com> wrote:
> On Wed, Nov 25, 2015 at 4:27 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
>> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>>
>> ---
>>  server/display-channel.c | 44 ++++++++++++--------------------------------
>>  server/display-channel.h |  2 +-
>>  server/red_worker.c      |  5 ++---
>>  3 files changed, 15 insertions(+), 36 deletions(-)
>>
>> diff --git a/server/display-channel.c b/server/display-channel.c
>> index 65bcc1c..b8d5a81 100644
>> --- a/server/display-channel.c
>> +++ b/server/display-channel.c
>> @@ -1305,20 +1305,18 @@ static void draw_until(DisplayChannel *display, RedSurface *surface, Drawable *l
>>      } while (now != last);
>>  }
>>
>> -static Drawable* current_find_intersects_rect(Ring *current, const SpiceRect *area)
>> +static Drawable* current_find_intersects_rect(Ring *current, RingItem *from,
>> +                                              const SpiceRect *area)
>>  {
>> -    Ring *ring;
>> -    RingItem *ring_item;
>> +    RingItem *it;
>>      QRegion rgn;
>>      Drawable *last = NULL;
>>
>> -    ring = current;
>> -    ring_item = ring;
>>      region_init(&rgn);
>>      region_add(&rgn, area);
>>
>> -    while ((ring_item = ring_next(ring, ring_item))) {
>> -        Drawable *now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
>> +    for (it = from ?: ring_next(current, current); it != NULL; it = ring_next(current, it)) {
>
> Not sure if we should care, but Solaris CC doesn't support not
> expanded ternary expressions.
>
>
>> +        Drawable *now = SPICE_CONTAINEROF(it, Drawable, surface_list_link);
>>          if (region_intersects(&rgn, &now->tree_item.base.rgn)) {
>>              last = now;
>>              break;
>> @@ -1334,7 +1332,7 @@ static Drawable* current_find_intersects_rect(Ring *current, const SpiceRect *ar
>>   * than 'last' (exclusive).
>>   * FIXME: merge with display_channel_draw()?
>>   */
>> -void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, int surface_id,
>> +void display_channel_draw_until(DisplayChannel *display, const SpiceRect *area, int surface_id,
>>                                 Drawable *last)
>>  {
>>      RedSurface *surface;
>> @@ -1342,7 +1340,6 @@ void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, i
>>      Ring *ring;
>>      RingItem *ring_item;
>>      Drawable *now;
>> -    QRegion rgn;
>>
>>      spice_return_if_fail(last);
>>      spice_return_if_fail(ring_item_is_linked(&last->list_link));
>> @@ -1367,33 +1364,16 @@ void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, i
>>          }
>>      }
>>
>> -    if (!surface_last) {
>> +    if (!surface_last)
>>          return;
>> -    }
>
> Here we change from:
>   if (foo) {
>     returnl
>   }
> to:
>   if (foo)
>     return;
>
>> -
>> -    ring = &surface->current_list;
>> -    ring_item = &surface_last->surface_list_link;
>>
>> -    region_init(&rgn);
>> -    region_add(&rgn, area);
>> -
>> -    // find the first older drawable that intersects with the area
>> -    do {
>> -        now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
>> -        if (region_intersects(&rgn, &now->tree_item.base.rgn)) {
>> -            surface_last = now;
>> -            break;
>> -        }
>> -    } while ((ring_item = ring_next(ring, ring_item)));
>> -
>> -    region_destroy(&rgn);
>> -
>> -    if (!surface_last) {
>> +    last = current_find_intersects_rect(&surface->current_list,
>> +                                        &surface_last->surface_list_link, area);
>> +    if (!last) {
>>          return;
>>      }
>
> But here we kept it as it is ...
> Personally I would remove from here as well.
>
>>
>> -    draw_until(display, surface, surface_last);
>> -
>> +    draw_until(display, surface, last);
>>      surface_update_dest(surface, area);
>>  }
>>
>> @@ -1412,7 +1392,7 @@ void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int su
>>
>>      surface = &display->surfaces[surface_id];
>>
>> -    last = current_find_intersects_rect(&surface->current_list, area);
>> +    last = current_find_intersects_rect(&surface->current_list, NULL, area);
>>      if (last)
>>          draw_until(display, surface, last);
>>
>> diff --git a/server/display-channel.h b/server/display-channel.h
>> index 33caabe..0d79463 100644
>> --- a/server/display-channel.h
>> +++ b/server/display-channel.h
>> @@ -262,7 +262,7 @@ void                       display_channel_create_surface            (DisplayCha
>>  void                       display_channel_draw                      (DisplayChannel *display,
>>                                                                        const SpiceRect *area,
>>                                                                        int surface_id);
>> -void                       display_channel_draw_till                 (DisplayChannel *display,
>> +void                       display_channel_draw_until                (DisplayChannel *display,
>>                                                                        const SpiceRect *area,
>>                                                                        int surface_id,
>>                                                                        Drawable *last);
>> diff --git a/server/red_worker.c b/server/red_worker.c
>> index 678b581..6ea7cd5 100644
>> --- a/server/red_worker.c
>> +++ b/server/red_worker.c
>> @@ -405,7 +405,7 @@ static void dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
>>                      stream_id, stream->current != NULL);
>>          rect_debug(&upgrade_area);
>>          if (update_area_limit) {
>> -            display_channel_draw_till(DCC_TO_DC(dcc), &upgrade_area, 0, update_area_limit);
>> +            display_channel_draw_until(DCC_TO_DC(dcc), &upgrade_area, 0, update_area_limit);
>>          } else {
>>              display_channel_draw(DCC_TO_DC(dcc), &upgrade_area, 0);
>>          }
>> @@ -1524,8 +1524,7 @@ static void red_add_lossless_drawable_dependencies(RedChannelClient *rcc,
>>      } else {
>>          sync_rendered = FALSE;
>>          for (i = 0; i < num_deps; i++) {
>> -            display_channel_draw_till(display, deps_areas[i],
>> -                                 deps_surfaces_ids[i], item);
>> +            display_channel_draw_until(display, deps_areas[i], deps_surfaces_ids[i], item);
>>          }
>>      }
>>
>> --
>> 2.4.3
>>
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
> Seems okay.
> Acked-by: Fabiano Fidêncio <fidencio at redhat.com>

Suggested diff (can be squashed to the patch):
http://paste.fedoraproject.org/294452/48469978


More information about the Spice-devel mailing list