[PATCH 2/4] shell: Fix repaint debugging

Ander Conselvan de Oliveira conselvan2 at gmail.com
Thu Aug 9 06:44:59 PDT 2012


Since weston_surface_update_transform() was changed so it called
surface_damage_below() instead of surface_damage(), the trick of
clearing the surface damage did not work anymore.

Fix this by moving the repaint surface to a special plane before
calling update_transform. The move is made manually (as opposed to
calling weston_surface_move_to_plane()) to avoid the call to
weston_surface_damage_below(). The transform update causes the
damage to be added to this special plane, which is simply ignored.
After the geometry.dirty bit is clear, the surface is moved back to
the primary plane.
---
 src/shell.c |   22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/shell.c b/src/shell.c
index 6c810ff..834e05e 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -124,6 +124,7 @@ struct desktop_shell {
 	uint32_t binding_modifier;
 	enum animation_type win_animation_type;
 	struct weston_surface *debug_repaint_surface;
+	struct weston_plane debug_repaint_plane;
 };
 
 enum shell_surface_type {
@@ -3137,16 +3138,17 @@ debug_repaint_binding(struct wl_seat *seat, uint32_t time, uint32_t key,
 		pixman_region32_init(&surface->input);
 
 		/* Here's the dirty little trick that makes the
-		 * repaint debugging work: we force an
-		 * update_transform first to update dependent state
-		 * and clear the geometry.dirty bit.  Then we clear
-		 * the surface damage so it only gets repainted
-		 * piecewise as we repaint other things.  */
-
+		 * repaint debugging work: we move the surface to a
+		 * different plane and force an update_transform to
+		 * update dependent state and clear the
+		 * geometry.dirty bit.  This way the call to
+		 * damage_below() in update_transform() does not
+		 * add damage to the primary plane.  */
+
+		surface->plane = &shell->debug_repaint_plane;
 		weston_surface_update_transform(surface);
-		pixman_region32_fini(&surface->damage);
-		pixman_region32_init(&surface->damage);
 		shell->debug_repaint_surface = surface;
+		surface->plane = &compositor->primary_plane;
 	}
 }
 
@@ -3219,6 +3221,8 @@ shell_destroy(struct wl_listener *listener, void *data)
 		container_of(listener, struct desktop_shell, destroy_listener);
 	struct workspace **ws;
 
+	weston_plane_release(&shell->debug_repaint_plane);
+
 	if (shell->child.client)
 		wl_client_destroy(shell->child.client);
 
@@ -3359,6 +3363,8 @@ shell_init(struct weston_compositor *ec)
 	wl_list_init(&shell->workspaces.animation.link);
 	shell->workspaces.animation.frame = animate_workspace_change_frame;
 
+	weston_plane_init(&shell->debug_repaint_plane, 0, 0);
+
 	if (wl_display_add_global(ec->wl_display, &wl_shell_interface,
 				  shell, bind_shell) == NULL)
 		return -1;
-- 
1.7.9.5



More information about the wayland-devel mailing list