On 06/03/15 05:04 AM, Pekka Paalanen wrote:
> From: Pekka Paalanen <[email protected]>
> 
> Move code from draw_view() into a new function draw_view_translated().
> This new function is correct only if
> view_transformation_is_translation().
> 
> The functional change in this is that if view->alpha is not 1.0, we do
> not bother computing and painting the non-opaque and opaque regions
> separately. Both need to be blended anyway, so just paint it all in one
> op=OVER call.

Good refactor, good optimization - but I don't like seeing them in the
same patch.  Can these be split?

> Signed-off-by: Pekka Paalanen <[email protected]>
> ---
>  src/pixman-renderer.c | 85 
> ++++++++++++++++++++++++++++++---------------------
>  1 file changed, 51 insertions(+), 34 deletions(-)
> 
> diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
> index 2da6a2b..fc7613c 100644
> --- a/src/pixman-renderer.c
> +++ b/src/pixman-renderer.c
> @@ -402,6 +402,54 @@ repaint_region(struct weston_view *ev, struct 
> weston_output *output,
>  }
>  
>  static void
> +draw_view_translated(struct weston_view *view, struct weston_output *output,
> +                  pixman_region32_t *repaint_global)
> +{
> +     struct weston_surface *surface = view->surface;
> +     /* non-opaque region in surface coordinates: */
> +     pixman_region32_t surface_blend;
> +     /* region to be painted in output coordinates: */
> +     pixman_region32_t repaint_output;
> +
> +     pixman_region32_init(&repaint_output);
> +
> +     /* Blended region is whole surface minus opaque region,
> +      * unless surface alpha forces us to blend all.
> +      */
> +     pixman_region32_init_rect(&surface_blend, 0, 0,
> +                               surface->width, surface->height);
> +
> +     if (!(view->alpha < 1.0)) {
> +             pixman_region32_subtract(&surface_blend, &surface_blend,
> +                                      &surface->opaque);
> +
> +             if (pixman_region32_not_empty(&surface->opaque)) {
> +                     region_intersect_only_translation(&repaint_output,
> +                                                       repaint_global,
> +                                                       &surface->opaque,
> +                                                       view);
> +                     region_global_to_output(output, &repaint_output);
> +
> +                     repaint_region(view, output, &repaint_output, NULL,
> +                                    PIXMAN_OP_SRC);
> +             }
> +     }
> +
> +     if (pixman_region32_not_empty(&surface_blend)) {
> +             region_intersect_only_translation(&repaint_output,
> +                                               repaint_global,
> +                                               &surface_blend, view);
> +             region_global_to_output(output, &repaint_output);
> +
> +             repaint_region(view, output, &repaint_output, NULL,
> +                            PIXMAN_OP_OVER);
> +     }
> +
> +     pixman_region32_fini(&surface_blend);
> +     pixman_region32_fini(&repaint_output);
> +}
> +
> +static void
>  draw_view(struct weston_view *ev, struct weston_output *output,
>         pixman_region32_t *damage) /* in global coordinates */
>  {
> @@ -409,9 +457,6 @@ draw_view(struct weston_view *ev, struct weston_output 
> *output,
>       struct pixman_surface_state *ps = get_surface_state(ev->surface);
>       /* repaint bounding region in global coordinates: */
>       pixman_region32_t repaint;
> -     /* non-opaque region in surface coordinates: */
> -     pixman_region32_t surface_blend;
> -     pixman_region32_t repaint_output;
>  
>       /* No buffer attached */
>       if (!ps->image)
> @@ -431,41 +476,13 @@ draw_view(struct weston_view *ev, struct weston_output 
> *output,
>       }
>  
>       /* TODO: Implement repaint_region_complex() using 
> pixman_composite_trapezoids() */
> -     if (ev->alpha != 1.0 || !view_transformation_is_translation(ev)) {
> +     if (view_transformation_is_translation(ev)) {
> +             draw_view_translated(ev, output, &repaint);
> +     } else {
>               region_global_to_output(output, &repaint);
>               repaint_region(ev, output, &repaint, NULL, PIXMAN_OP_OVER);
> -     } else {
> -             pixman_region32_init(&repaint_output);
> -
> -             /* blended region is whole surface minus opaque region: */
> -             pixman_region32_init_rect(&surface_blend, 0, 0,
> -                                       ev->surface->width, 
> ev->surface->height);
> -             pixman_region32_subtract(&surface_blend, &surface_blend, 
> &ev->surface->opaque);
> -
> -             if (pixman_region32_not_empty(&ev->surface->opaque)) {
> -                     region_intersect_only_translation(&repaint_output,
> -                                                       &repaint,
> -                                                       &ev->surface->opaque,
> -                                                       ev);
> -                     region_global_to_output(output, &repaint_output);
> -                     repaint_region(ev, output, &repaint_output, NULL,
> -                                    PIXMAN_OP_SRC);
> -             }
> -
> -             if (pixman_region32_not_empty(&surface_blend)) {
> -                     region_intersect_only_translation(&repaint_output,
> -                                                       &repaint,
> -                                                       &surface_blend,
> -                                                       ev);
> -                     region_global_to_output(output, &repaint_output);
> -                     repaint_region(ev, output, &repaint_output, NULL,
> -                                    PIXMAN_OP_OVER);
> -             }
> -             pixman_region32_fini(&surface_blend);
> -             pixman_region32_fini(&repaint_output);
>       }
>  
> -
>  out:
>       pixman_region32_fini(&repaint);
>  }
> 

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to