On Fri, 06 Mar 2015 13:46:26 -0600 Derek Foreman <[email protected]> wrote:
> 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? I'm not sure what I was thinking... I think this commit message is wrong. Previously, if view->alpha != 1.0, it called > > region_global_to_output(output, &repaint); > > repaint_region(ev, output, &repaint, NULL, PIXMAN_OP_OVER); which does paint the whole area as one OVER call. And it does the same after this patch too, by not subtracting opaque region. I think I just need to remove that paragraph from the commit message, no? Thanks, pq > > 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
