[PATCH] Make damage debug more useful.
Scott Moreau
oreaus at gmail.com
Sun Aug 12 01:12:08 PDT 2012
Damage debug wasn't very useful since it only used a single static color.
This patch makes it so a random color is assigned for each damage event,
making debug damage much more helpful as a debugging tool.
---
src/compositor.c | 33 +++++++++++++++++++++++++++++++++
src/compositor.h | 1 +
src/shell.c | 25 ++++---------------------
3 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/src/compositor.c b/src/compositor.c
index 7c161d0..8b88124 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1127,6 +1127,34 @@ surface_accumulate_damage(struct weston_surface *surface,
}
static void
+show_repaint(struct weston_compositor *ec)
+{
+ struct weston_surface *surface;
+ struct weston_plane plane;
+ float r, g, b;
+
+ surface = ec->debug_repaint_surface;
+ r = random() % 25 / 100.0;
+ g = random() % 25 / 100.0;
+ b = random() % 25 / 100.0;
+ weston_surface_set_color(surface, r, g, b, 0.3);
+
+ /* Here's the dirty little trick that makes the
+ * 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. */
+
+ weston_plane_init(&plane, 0, 0);
+ surface->plane = &plane;
+ weston_surface_update_transform(surface);
+ surface->plane = &ec->primary_plane;
+ weston_plane_release(&plane);
+}
+
+static void
weston_output_repaint(struct weston_output *output, uint32_t msecs)
{
struct weston_compositor *ec = output->compositor;
@@ -1146,6 +1174,9 @@ weston_output_repaint(struct weston_output *output, uint32_t msecs)
output->border.top + output->border.bottom;
glViewport(0, 0, width, height);
+ if (ec->debug_repaint_surface)
+ show_repaint(ec);
+
/* Rebuild the surface list and update surface transforms up front. */
wl_list_init(&ec->surface_list);
wl_list_init(&frame_callback_list);
@@ -3175,6 +3206,8 @@ weston_compositor_init(struct weston_compositor *ec,
ec->ping_handler = NULL;
+ ec->debug_repaint_surface = NULL;
+
screenshooter_create(ec);
text_cursor_position_notifier_create(ec);
diff --git a/src/compositor.h b/src/compositor.h
index 7a8058e..1dd78e8 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -335,6 +335,7 @@ struct weston_compositor {
PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
PFNEGLQUERYWAYLANDBUFFERWL query_buffer;
int has_bind_display;
+ struct weston_surface *debug_repaint_surface;
void (*destroy)(struct weston_compositor *ec);
void (*restore)(struct weston_compositor *ec);
diff --git a/src/shell.c b/src/shell.c
index 13a7fd0..44bafa7 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -131,7 +131,6 @@ struct desktop_shell {
uint32_t binding_modifier;
enum animation_type win_animation_type;
- struct weston_surface *debug_repaint_surface;
};
enum shell_surface_type {
@@ -3189,34 +3188,18 @@ debug_repaint_binding(struct wl_seat *seat, uint32_t time, uint32_t key,
struct desktop_shell *shell = data;
struct weston_compositor *compositor = shell->compositor;
struct weston_surface *surface;
- struct weston_plane plane;
- if (shell->debug_repaint_surface) {
- weston_surface_destroy(shell->debug_repaint_surface);
- shell->debug_repaint_surface = NULL;
+ if (compositor->debug_repaint_surface) {
+ weston_surface_destroy(compositor->debug_repaint_surface);
+ compositor->debug_repaint_surface = NULL;
} else {
surface = weston_surface_create(compositor);
- weston_surface_set_color(surface, 1.0, 0.0, 0.0, 0.2);
+ compositor->debug_repaint_surface = surface;
weston_surface_configure(surface, 0, 0, 8192, 8192);
wl_list_insert(&compositor->fade_layer.surface_list,
&surface->layer_link);
weston_surface_assign_output(surface);
pixman_region32_init(&surface->input);
-
- /* Here's the dirty little trick that makes the
- * 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. */
-
- weston_plane_init(&plane, 0, 0);
- surface->plane = &plane;
- weston_surface_update_transform(surface);
- shell->debug_repaint_surface = surface;
- surface->plane = &compositor->primary_plane;
- weston_plane_release(&plane);
}
}
--
1.7.11.2
More information about the wayland-devel
mailing list