[Spice-devel] [PATCH 16/18] worker: move display_channel_update

Pavel Grunt pgrunt at redhat.com
Tue Nov 24 23:07:08 PST 2015


On Tue, 2015-11-24 at 11:13 +0000, Frediano Ziglio wrote:
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> ---
>  server/display-channel.c | 39 +++++++++++++++++++++++++++++++++++++++
>  server/display-channel.h |  6 ++++++
>  server/red_worker.c      | 39 ---------------------------------------
>  3 files changed, 45 insertions(+), 39 deletions(-)
> 
> diff --git a/server/display-channel.c b/server/display-channel.c
> index 0fbddf5..fce9dd5 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -1403,6 +1403,45 @@ void display_channel_draw(DisplayChannel *display,
> const SpiceRect *area, int su
>      surface_update_dest(surface, area);
>  }
>  
> +static void region_to_qxlrects(QRegion *region, QXLRect *qxl_rects, uint32_t
> num_rects)
> +{
> +    SpiceRect *rects;
> +    int i;
> +
> +    rects = spice_new0(SpiceRect, num_rects);
> +    region_ret_rects(region, rects, num_rects);
> +    for (i = 0; i < num_rects; i++) {
> +        qxl_rects[i].top    = rects[i].top;
> +        qxl_rects[i].left   = rects[i].left;
> +        qxl_rects[i].bottom = rects[i].bottom;
> +        qxl_rects[i].right  = rects[i].right;
> +    }
> +    free(rects);
> +}
> +
> +void display_channel_update(DisplayChannel *display,
> +                            uint32_t surface_id, const QXLRect *area,
> uint32_t clear_dirty,
> +                            QXLRect **qxl_dirty_rects, uint32_t
> *num_dirty_rects)
> +{
> +    SpiceRect rect;
> +    RedSurface *surface;
> +
> +    spice_return_if_fail(validate_surface(display, surface_id));
> +
> +    red_get_rect_ptr(&rect, area);
> +    display_channel_draw(display, &rect, surface_id);
> +
> +    surface = &display->surfaces[surface_id];
> +    if (!*qxl_dirty_rects) {

I prefer comparison to NULL.

> +        *num_dirty_rects = pixman_region32_n_rects(&surface-
> >draw_dirty_region);
> +        *qxl_dirty_rects = spice_new0(QXLRect, *num_dirty_rects);
> +    }
> +
> +    region_to_qxlrects(&surface->draw_dirty_region, *qxl_dirty_rects,
> *num_dirty_rects);
> +    if (clear_dirty)
> +        region_clear(&surface->draw_dirty_region);
> +}
> +
>  static void clear_surface_drawables_from_pipes(DisplayChannel *display, int
> surface_id,
>                                                 int wait_if_used)
>  {
> diff --git a/server/display-channel.h b/server/display-channel.h
> index 750362b..0d79463 100644
> --- a/server/display-channel.h
> +++ b/server/display-channel.h
> @@ -266,6 +266,12 @@
> void                       display_channel_draw_until                (DisplayC
> ha
>                                                                        const
> SpiceRect *area,
>                                                                        int
> surface_id,
>                                                                        Drawabl
> e *last);
> +void                       display_channel_update                    (Display
> Channel *display,
> +                                                                      uint32_
> t surface_id,
> +                                                                      const
> QXLRect *area,
> +                                                                      uint32_
> t clear_dirty,
> +                                                                      QXLRect
> **qxl_dirty_rects,
> +                                                                      uint32_
> t *num_dirty_rects);
>  void                       display_channel_free_some                 (Display
> Channel *display);
>  void                       display_channel_set_stream_video          (Display
> Channel *display,
>                                                                        int
> stream_video);
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 470f813..0816f63 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -3803,45 +3803,6 @@ static void cursor_connect(RedWorker *worker, RedClient
> *client, RedsStream *str
>          cursor_channel_init(channel, ccc);
>  }
>  
> -static void region_to_qxlrects(QRegion *region, QXLRect *qxl_rects, uint32_t
> num_rects)
> -{
> -    SpiceRect *rects;
> -    int i;
> -
> -    rects = spice_new0(SpiceRect, num_rects);
> -    region_ret_rects(region, rects, num_rects);
> -    for (i = 0; i < num_rects; i++) {
> -        qxl_rects[i].top    = rects[i].top;
> -        qxl_rects[i].left   = rects[i].left;
> -        qxl_rects[i].bottom = rects[i].bottom;
> -        qxl_rects[i].right  = rects[i].right;
> -    }
> -    free(rects);
> -}
> -
> -void display_channel_update(DisplayChannel *display,
> -                            uint32_t surface_id, const QXLRect *area,
> uint32_t clear_dirty,
> -                            QXLRect **qxl_dirty_rects, uint32_t
> *num_dirty_rects)
> -{
> -    SpiceRect rect;
> -    RedSurface *surface;
> -
> -    spice_return_if_fail(validate_surface(display, surface_id));
> -
> -    red_get_rect_ptr(&rect, area);
> -    display_channel_draw(display, &rect, surface_id);
> -
> -    surface = &display->surfaces[surface_id];
> -    if (!*qxl_dirty_rects) {
> -        *num_dirty_rects = pixman_region32_n_rects(&surface-
> >draw_dirty_region);
> -        *qxl_dirty_rects = spice_new0(QXLRect, *num_dirty_rects);
> -    }
> -
> -    region_to_qxlrects(&surface->draw_dirty_region, *qxl_dirty_rects,
> *num_dirty_rects);
> -    if (clear_dirty)
> -        region_clear(&surface->draw_dirty_region);
> -}
> -
>  static void handle_dev_update_async(void *opaque, void *payload)
>  {
>      RedWorker *worker = opaque;

Acked-by: Pavel Grunt <pgrunt at redhat.com>



More information about the Spice-devel mailing list