[PATCH weston 3/5] compositor: add sub-surfaces to repaint list
Pekka Paalanen
ppaalanen at gmail.com
Fri Dec 21 04:48:15 PST 2012
On Fri, 21 Dec 2012 14:04:02 +0200
Pekka Paalanen <ppaalanen at 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 <ppaalanen at 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
More information about the wayland-devel
mailing list