On 09/03/15 05:52 AM, Pekka Paalanen wrote: > 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?
Ok, that makes sense. Reviewed-By: Derek Foreman <[email protected]> > 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
