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

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


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>


More information about the Spice-devel mailing list