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

Reply via email to