[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