[Spice-devel] [PATCH 15/18] display: simplify create_canvas_for_surface

Frediano Ziglio fziglio at redhat.com
Tue Nov 24 06:09:49 PST 2015


> 
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> ---
>  server/display-channel.c | 45 +++++++++++++++++----------------------------
>  1 file changed, 17 insertions(+), 28 deletions(-)
> 
> diff --git a/server/display-channel.c b/server/display-channel.c
> index 051d597..0fbddf5 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -1483,16 +1483,14 @@ static void send_create_surface(DisplayChannel
> *display, int surface_id, int ima
>  }
>  
>  static SpiceCanvas*
> -create_canvas_for_surface(DisplayChannel *display, RedSurface *surface,
> -                          uint32_t renderer, uint32_t width, uint32_t
> height,
> -                          int32_t stride, uint32_t format, void *line_0)
> +create_canvas_for_surface(DisplayChannel *display, RedSurface *surface,
> uint32_t renderer)
>  {
>      SpiceCanvas *canvas;
>  
>      switch (renderer) {
>      case RED_RENDERER_SW:
> -        canvas = canvas_create_for_data(width, height, format,
> -                                        line_0, stride,
> +        canvas = canvas_create_for_data(surface->context.width,
> surface->context.height, surface->context.format,
> +                                        surface->context.line_0,
> surface->context.stride,
>                                          &display->image_cache.base,
>                                          &display->image_surfaces, NULL,
>                                          NULL, NULL);
>          surface->context.top_down = TRUE;
> @@ -1510,7 +1508,6 @@ void display_channel_create_surface(DisplayChannel
> *display, uint32_t surface_id
>                                      void *line_0, int data_is_valid, int
>                                      send_client)
>  {
>      RedSurface *surface = &display->surfaces[surface_id];
> -    uint32_t i;
>  
>      spice_warn_if(surface->context.canvas);
>  
> @@ -1534,32 +1531,24 @@ void display_channel_create_surface(DisplayChannel
> *display, uint32_t surface_id
>      ring_init(&surface->depend_on_me);
>      region_init(&surface->draw_dirty_region);
>      surface->refs = 1;
> -    if (display->renderer != RED_RENDERER_INVALID) {
> -        surface->context.canvas = create_canvas_for_surface(display,
> surface, display->renderer,
> -                                                            width, height,
> stride,
> -
> surface->context.format,
> line_0);
> -        if (!surface->context.canvas) {
> -            spice_critical("drawing canvas creating failed - can`t create
> same type canvas");
> -        }
> -
> -        if (send_client)
> -            send_create_surface(display, surface_id, data_is_valid);
> -        return;
> -    }
>  
> -    for (i = 0; i < display->num_renderers; i++) {
> -        surface->context.canvas = create_canvas_for_surface(display,
> surface, display->renderers[i],
> -                                                            width, height,
> stride,
> -
> surface->context.format,
> line_0);
> -        if (surface->context.canvas) { //no need canvas check
> -            display->renderer = display->renderers[i];
> -            if (send_client)
> -                send_create_surface(display, surface_id, data_is_valid);
> -            return;
> +    if (display->renderer == RED_RENDERER_INVALID) {
> +        int i;
> +        for (i = 0; i < display->num_renderers; i++) {
> +            surface->context.canvas = create_canvas_for_surface(display,
> surface, display->renderers[i]);
> +            if (surface->context.canvas) {
> +                display->renderer = display->renderers[i];
> +                break;
> +            }
>          }
> +    } else {
> +        surface->context.canvas = create_canvas_for_surface(display,
> surface, display->renderer);
> +        spice_warn_if_fail(surface->context.canvas);

This line is useless, code will then check again canvas with a spice_return_if_fail

>      }
>  

Here the logic is different. Before the known renderer was tried and
then the list of all renderer while now the list is tried only if
there are not a known renderer

> -    spice_critical("unable to create drawing canvas");
> +    spice_return_if_fail(surface->context.canvas);
> +    if (send_client)
> +        send_create_surface(display, surface_id, data_is_valid);
>  }
>  
>  static void on_disconnect(RedChannelClient *rcc)

Frediano


More information about the Spice-devel mailing list