On Fri, 21 Dec 2012 14:04:02 +0200
Pekka Paalanen <ppaala...@gmail.com> wrote:

> Modify surface list rebuilding in weston_output_repaint() to process
> sub-surface lists, if they are non-empty. The sub-surface list always
> contains the parent, too, if not empty.
> 
> The collection of frame_callback_list is moved to a later loop, to
> streamline the surface list rebuild functions. This should not change
> anything.
> 
> Signed-off-by: Pekka Paalanen <ppaala...@gmail.com>
> ---
>  src/compositor.c |   59 +++++++++++++++++++++++++++++++++++++++++------------
>  1 files changed, 45 insertions(+), 14 deletions(-)
> 
> diff --git a/src/compositor.c b/src/compositor.c
> index e7e1360..270b196 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1069,11 +1069,47 @@ surface_accumulate_damage(struct weston_surface 
> *surface,
>  }
>  
>  static void
> +surface_list_add(struct weston_compositor *compositor,
> +              struct weston_surface *surface)
> +{
> +     struct weston_subsurface *sub;
> +
> +     if (wl_list_empty(&surface->subsurface_list)) {
> +             weston_surface_update_transform(surface);
> +             wl_list_insert(compositor->surface_list.prev, &surface->link);
> +             return;
> +     }
> +
> +     wl_list_for_each(sub, &surface->subsurface_list, parent_link) {
> +             if (!weston_surface_is_mapped(sub->surface))
> +                     continue;
> +
> +             weston_surface_update_transform(sub->surface);
> +
> +             wl_list_insert(compositor->surface_list.prev,
> +                            &sub->surface->link);
> +     }
> +}

Jonas made an important observation here: the assigned output for
sub-surface is not guaranteed to be the same as for the parent.

Should it be or not?

Btw. as a side note: shell excplicitly assigns a certain output for
some surfaces like backgrounds, but the repaint machinery calls
update_transform and so reassigns it, possibly to something else.


In Jonas' behalf,
pq

> +
> +static void
> +weston_compositor_build_surface_list(struct weston_compositor *compositor)
> +{
> +     struct weston_surface *surface;
> +     struct weston_layer *layer;
> +
> +     wl_list_init(&compositor->surface_list);
> +     wl_list_for_each(layer, &compositor->layer_list, link) {
> +             wl_list_for_each(surface, &layer->surface_list, layer_link) {
> +                     surface_list_add(compositor, surface);
> +             }
> +     }
> +}
> +
> +static void
>  weston_output_repaint(struct weston_output *output, uint32_t msecs)
>  {
>       struct weston_compositor *ec = output->compositor;
>       struct weston_surface *es;
> -     struct weston_layer *layer;
>       struct weston_animation *animation, *next;
>       struct weston_frame_callback *cb, *cnext;
>       struct wl_list frame_callback_list;
> @@ -1082,19 +1118,7 @@ weston_output_repaint(struct weston_output *output, 
> uint32_t msecs)
>       weston_compositor_update_drag_surfaces(ec);
>  
>       /* Rebuild the surface list and update surface transforms up front. */
> -     wl_list_init(&ec->surface_list);
> -     wl_list_init(&frame_callback_list);
> -     wl_list_for_each(layer, &ec->layer_list, link) {
> -             wl_list_for_each(es, &layer->surface_list, layer_link) {
> -                     weston_surface_update_transform(es);
> -                     wl_list_insert(ec->surface_list.prev, &es->link);
> -                     if (es->output == output) {
> -                             wl_list_insert_list(&frame_callback_list,
> -                                                 &es->frame_callback_list);
> -                             wl_list_init(&es->frame_callback_list);
> -                     }
> -             }
> -     }
> +     weston_compositor_build_surface_list(ec);
>  
>       if (output->assign_planes && !output->disable_planes)
>               output->assign_planes(output);
> @@ -1107,7 +1131,14 @@ weston_output_repaint(struct weston_output *output, 
> uint32_t msecs)
>       pixman_region32_fini(&ec->primary_plane.opaque);
>       pixman_region32_init(&ec->primary_plane.opaque);
>  
> +     wl_list_init(&frame_callback_list);
>       wl_list_for_each(es, &ec->surface_list, link) {
> +             if (es->output == output) {
> +                     wl_list_insert_list(&frame_callback_list,
> +                                         &es->frame_callback_list);
> +                     wl_list_init(&es->frame_callback_list);
> +             }
> +
>               surface_accumulate_damage(es, &opaque);
>  
>               /* Both the renderer and the backend have seen the buffer

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to