[RFC Weston 04/10] compositor: add sub-surfaces to repaint list

Pekka Paalanen ppaalanen at gmail.com
Fri Feb 22 07:07:48 PST 2013


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 file changed, 45 insertions(+), 14 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 9c14423..5db255a 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1120,11 +1120,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);
+	}
+}
+
+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;
@@ -1133,19 +1169,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);
@@ -1158,7 +1182,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
-- 
1.7.12.4



More information about the wayland-devel mailing list