[clutter: 11/19] actor: visualize culling with CLUTTER_PAINT=redraws
- From: Robert Bragg <rbragg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter: 11/19] actor: visualize culling with CLUTTER_PAINT=redraws
- Date: Mon, 11 Apr 2011 17:44:36 +0000 (UTC)
commit 8557bc3d264544458f9f901741fcf63858ebbadd
Author: Robert Bragg <robert linux intel com>
Date: Tue Mar 15 12:08:46 2011 +0000
actor: visualize culling with CLUTTER_PAINT=redraws
This extends visualization for CLUTTER_PAINT=redraws so it now also
draws outlines for actors to show how they are being culled. Actors get
a green outline if they are fully inside the clip region, blue if fully
outside and greeny-blue if only partially inside.
clutter/clutter-actor.c | 158 +++++++++++++++++++++++++++------------
clutter/glx/clutter-stage-glx.c | 13 +++-
2 files changed, 122 insertions(+), 49 deletions(-)
---
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index b6e1833..b01e399 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -2402,42 +2402,19 @@ _clutter_actor_apply_modelview_transform_recursive (ClutterActor *self,
}
static void
-_clutter_actor_draw_paint_volume (ClutterActor *self)
+_clutter_actor_draw_paint_volume_full (ClutterActor *self,
+ ClutterPaintVolume *pv,
+ const char *label,
+ const CoglColor *color)
{
static CoglMaterial *outline = NULL;
CoglHandle vbo;
- ClutterPaintVolume *pv;
- gboolean free_fake_pv;
- ClutterPaintVolume fake_pv;
ClutterVertex line_ends[12 * 2];
int n_vertices;
- PangoLayout *layout;
- CoglColor color;
if (outline == NULL)
outline = cogl_material_new ();
- pv = _clutter_actor_get_paint_volume_mutable (self);
- if (!pv)
- {
- gfloat width, height;
- ClutterActor *stage = _clutter_actor_get_stage_internal (self);
- _clutter_paint_volume_init_static (&fake_pv, stage);
- free_fake_pv = TRUE;
-
- clutter_actor_get_size (self, &width, &height);
- clutter_paint_volume_set_width (&fake_pv, width);
- clutter_paint_volume_set_height (&fake_pv, height);
-
- pv = &fake_pv;
- cogl_color_init_from_4f (&color, 0, 0, 1, 1);
- }
- else
- {
- cogl_color_init_from_4f (&color, 0, 1, 0, 1);
- free_fake_pv = FALSE;
- }
-
_clutter_paint_volume_complete (pv);
n_vertices = pv->is_2d ? 4 * 2 : 12 * 2;
@@ -2472,23 +2449,103 @@ _clutter_actor_draw_paint_volume (ClutterActor *self)
0, /* stride */
line_ends);
- cogl_material_set_color (outline, &color);
+ cogl_material_set_color (outline, color);
cogl_set_source (outline);
cogl_vertex_buffer_draw (vbo, COGL_VERTICES_MODE_LINES,
0 , n_vertices);
cogl_object_unref (vbo);
- layout = pango_layout_new (clutter_actor_get_pango_context (self));
- pango_layout_set_text (layout, G_OBJECT_TYPE_NAME (self), -1);
- cogl_pango_render_layout (layout,
- pv->vertices[0].x,
- pv->vertices[0].y,
- &color,
- 0);
- g_object_unref (layout);
+ if (label)
+ {
+ PangoLayout *layout;
+ layout = pango_layout_new (clutter_actor_get_pango_context (self));
+ pango_layout_set_text (layout, label, -1);
+ cogl_pango_render_layout (layout,
+ pv->vertices[0].x,
+ pv->vertices[0].y,
+ color,
+ 0);
+ g_object_unref (layout);
+ }
+}
+
+static void
+_clutter_actor_draw_paint_volume (ClutterActor *self)
+{
+ ClutterPaintVolume *pv;
+ CoglColor color;
+
+ pv = _clutter_actor_get_paint_volume_mutable (self);
+ if (!pv)
+ {
+ gfloat width, height;
+ ClutterPaintVolume fake_pv;
+
+ ClutterActor *stage = _clutter_actor_get_stage_internal (self);
+ _clutter_paint_volume_init_static (&fake_pv, stage);
+
+ clutter_actor_get_size (self, &width, &height);
+ clutter_paint_volume_set_width (&fake_pv, width);
+ clutter_paint_volume_set_height (&fake_pv, height);
+
+ cogl_color_init_from_4f (&color, 0, 0, 1, 1);
+ _clutter_actor_draw_paint_volume_full (self, &fake_pv,
+ G_OBJECT_TYPE_NAME (self),
+ &color);
+
+ clutter_paint_volume_free (&fake_pv);
+ }
+ else
+ {
+ cogl_color_init_from_4f (&color, 0, 1, 0, 1);
+ _clutter_actor_draw_paint_volume_full (self, pv,
+ G_OBJECT_TYPE_NAME (self),
+ &color);
+ }
+}
+
+static void
+_clutter_actor_paint_cull_result (ClutterActor *self,
+ gboolean success,
+ ClutterCullResult result)
+{
+ ClutterPaintVolume *pv;
+ CoglColor color;
+
+ if (success)
+ {
+ if (result == CLUTTER_CULL_RESULT_IN)
+ cogl_color_init_from_4f (&color, 0, 1, 0, 1);
+ else if (result == CLUTTER_CULL_RESULT_OUT)
+ cogl_color_init_from_4f (&color, 0, 0, 1, 1);
+ else
+ cogl_color_init_from_4f (&color, 0, 1, 1, 1);
+ }
+ else
+ cogl_color_init_from_4f (&color, 1, 1, 1, 1);
+
+ if (success && (pv = _clutter_actor_get_paint_volume_mutable (self)))
+ _clutter_actor_draw_paint_volume_full (self, pv,
+ G_OBJECT_TYPE_NAME (self),
+ &color);
+ else
+ {
+ PangoLayout *layout;
+ char *label =
+ g_strdup_printf ("CULL FAILURE: %s", G_OBJECT_TYPE_NAME (self));
+ cogl_color_init_from_4f (&color, 1, 1, 1, 1);
+ cogl_set_source_color (&color);
- if (free_fake_pv)
- clutter_paint_volume_free (&fake_pv);
+ layout = pango_layout_new (clutter_actor_get_pango_context (self));
+ pango_layout_set_text (layout, label, -1);
+ cogl_pango_render_layout (layout,
+ 0,
+ 0,
+ &color,
+ 0);
+ g_free (label);
+ g_object_unref (layout);
+ }
}
static int clone_paint_level = 0;
@@ -2517,12 +2574,11 @@ in_clone_paint (void)
* means there's no point in trying to cull descendants of the current
* node. */
static gboolean
-cull_actor (ClutterActor *self)
+cull_actor (ClutterActor *self, ClutterCullResult *result_out)
{
ClutterActorPrivate *priv = self->priv;
ClutterActor *stage;
const ClutterPlane *stage_clip;
- ClutterCullResult result;
if (!priv->last_paint_volume_valid)
{
@@ -2554,12 +2610,9 @@ cull_actor (ClutterActor *self)
return FALSE;
}
- result = _clutter_paint_volume_cull (&priv->last_paint_volume, stage_clip);
- if (result == CLUTTER_CULL_RESULT_IN ||
- result == CLUTTER_CULL_RESULT_PARTIAL)
- return FALSE;
- else
- return TRUE;
+ *result_out =
+ _clutter_paint_volume_cull (&priv->last_paint_volume, stage_clip);
+ return TRUE;
}
static void
@@ -2718,6 +2771,11 @@ clutter_actor_paint (ClutterActor *self)
*/
if (!in_clone_paint ())
{
+ gboolean success;
+ /* annoyingly gcc warns if uninitialized even though
+ * the initialization is redundant :-( */
+ ClutterCullResult result = CLUTTER_CULL_RESULT_IN;
+
if (G_LIKELY ((clutter_paint_debug_flags &
(CLUTTER_DEBUG_DISABLE_CULLING |
CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS)) !=
@@ -2725,7 +2783,11 @@ clutter_actor_paint (ClutterActor *self)
CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS)))
_clutter_actor_update_last_paint_volume (self);
- if (cull_actor (self))
+ success = cull_actor (self, &result);
+
+ if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_REDRAWS))
+ _clutter_actor_paint_cull_result (self, success, result);
+ else if (result == CLUTTER_CULL_RESULT_OUT && success)
goto done;
}
diff --git a/clutter/glx/clutter-stage-glx.c b/clutter/glx/clutter-stage-glx.c
index 6e20369..76d11f6 100644
--- a/clutter/glx/clutter-stage-glx.c
+++ b/clutter/glx/clutter-stage-glx.c
@@ -442,7 +442,18 @@ clutter_stage_glx_redraw (ClutterStageWindow *stage_window)
else
{
CLUTTER_NOTE (CLIPPING, "Unclipped stage paint\n");
- _clutter_stage_do_paint (stage_x11->wrapper, NULL);
+
+ /* If we are trying to debug redraw issues then we want to pass
+ * the bounding_redraw_clip so it can be visualized */
+ if (G_UNLIKELY (clutter_paint_debug_flags &
+ CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS) &&
+ may_use_clipped_redraw)
+ {
+ _clutter_stage_do_paint (stage_x11->wrapper,
+ &stage_glx->bounding_redraw_clip);
+ }
+ else
+ _clutter_stage_do_paint (stage_x11->wrapper, NULL);
}
if (may_use_clipped_redraw &&
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]