[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