[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