From 92ddaa9c1304e422331ca2f1a8d5dfb9edb95a8f Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 18 Feb 2011 12:56:17 +0000 Subject: [PATCH] stage: Move stage redraw logic into clutter-stage.c The _clutter_do_redraw() function should really be moved inside ClutterStage, since all it does is calling private stage and backend functions. This also allows us to change a long-standing issue with a global fps counter for all stages, instead of a\ per-stage one. --- clutter/clutter-main.c | 48 ------------------------- clutter/clutter-private.h | 3 -- clutter/clutter-stage.c | 55 +++++++++++++++++++++++++++-- tests/interactive/test-multistage.c | 27 +++++++------- 4 files changed, 68 insertions(+), 65 deletions(-) diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c index 32ed33cc6..b98f720df 100644 --- a/clutter/clutter-main.c +++ b/clutter/clutter-main.c @@ -227,54 +227,6 @@ clutter_get_accessibility_enabled (void) return cally_get_cally_initialized (); } -void -_clutter_do_redraw (ClutterStage *stage) -{ - static GTimer *timer = NULL; - static guint timer_n_frames = 0; - ClutterMainContext *ctx; - - ctx = _clutter_context_get_default (); - - _clutter_stage_set_pick_buffer_valid (stage, FALSE, -1); - _clutter_stage_reset_picks_per_frame_counter (stage); - - _clutter_backend_ensure_context (ctx->backend, stage); - - /* Setup FPS count - not currently across *all* stages rather than per */ - if (G_UNLIKELY (clutter_get_show_fps ())) - { - if (!timer) - timer = g_timer_new (); - } - - /* The code below can't go in stage paint as base actor_paint - * will get called before it (and break picking, etc) - */ - _clutter_stage_maybe_setup_viewport (stage); - - /* Call through to the actual backend to do the painting down from - * the stage. It will likely need to swap buffers, vblank sync etc - * which will be windowing system dependent - */ - _clutter_backend_redraw (ctx->backend, stage); - - /* Complete FPS info */ - if (G_UNLIKELY (clutter_get_show_fps ())) - { - timer_n_frames++; - - if (g_timer_elapsed (timer, NULL) >= 1.0) - { - g_print ("*** FPS: %i ***\n", timer_n_frames); - timer_n_frames = 0; - g_timer_start (timer); - } - } - - CLUTTER_TIMESTAMP (SCHEDULER, "Redraw finish for stage:%p", stage); -} - /** * clutter_redraw: * diff --git a/clutter/clutter-private.h b/clutter/clutter-private.h index 9a7c3bed1..9d2d3ee55 100644 --- a/clutter/clutter-private.h +++ b/clutter/clutter-private.h @@ -210,9 +210,6 @@ ClutterActor *_clutter_do_pick (ClutterStage *stage, gint y, ClutterPickMode mode); -/* the actual redraw */ -void _clutter_do_redraw (ClutterStage *stage); - guint _clutter_pixel_to_id (guchar pixel[4]); void _clutter_id_to_color (guint id, diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index 57b66e103..e6ce158d9 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -137,6 +137,9 @@ struct _ClutterStagePrivate GHashTable *devices; + GTimer *fps_timer; + gint32 timer_n_frames; + guint relayout_pending : 1; guint redraw_pending : 1; guint is_fullscreen : 1; @@ -798,6 +801,52 @@ _clutter_stage_maybe_relayout (ClutterActor *actor) } } +static void +clutter_stage_do_redraw (ClutterStage *stage) +{ + ClutterBackend *backend = clutter_get_default_backend (); + ClutterActor *actor = CLUTTER_ACTOR (stage); + ClutterStagePrivate *priv = stage->priv; + + CLUTTER_TIMESTAMP (SCHEDULER, "Redraw started for %s[%p]", + _clutter_actor_get_debug_name (actor), + stage); + + _clutter_stage_set_pick_buffer_valid (stage, FALSE, -1); + _clutter_stage_reset_picks_per_frame_counter (stage); + + _clutter_backend_ensure_context (backend, stage); + + if (clutter_get_show_fps ()) + { + if (priv->fps_timer == NULL) + priv->fps_timer = g_timer_new (); + } + + _clutter_stage_maybe_setup_viewport (stage); + + _clutter_backend_redraw (backend, stage); + + if (clutter_get_show_fps ()) + { + priv->timer_n_frames += 1; + + if (g_timer_elapsed (priv->fps_timer, NULL) >= 1.0) + { + g_print ("*** FPS for %s: %i ***\n", + _clutter_actor_get_debug_name (actor), + priv->timer_n_frames); + + priv->timer_n_frames = 0; + g_timer_start (priv->fps_timer); + } + } + + CLUTTER_TIMESTAMP (SCHEDULER, "Redraw finished for %s[%p]", + _clutter_actor_get_debug_name (actor), + stage); +} + /** * _clutter_stage_do_update: * @stage: A #ClutterStage @@ -829,8 +878,7 @@ _clutter_stage_do_update (ClutterStage *stage) _clutter_stage_maybe_finish_queue_redraws (stage); - CLUTTER_NOTE (PAINT, "redrawing via idle for stage[%p]", stage); - _clutter_do_redraw (stage); + clutter_stage_do_redraw (stage); /* reset the guard, so that new redraws are possible */ priv->redraw_pending = FALSE; @@ -1199,6 +1247,9 @@ clutter_stage_finalize (GObject *object) g_hash_table_destroy (priv->devices); + if (priv->fps_timer != NULL) + g_timer_destroy (priv->fps_timer); + G_OBJECT_CLASS (clutter_stage_parent_class)->finalize (object); } diff --git a/tests/interactive/test-multistage.c b/tests/interactive/test-multistage.c index 7f7af0d51..d0a87d9b4 100644 --- a/tests/interactive/test-multistage.c +++ b/tests/interactive/test-multistage.c @@ -30,17 +30,22 @@ on_button_press (ClutterActor *actor, ClutterActor *new_stage; ClutterActor *label, *tex; gint width, height; - gchar *stage_label, *win_title; - ClutterTimeline *timeline; - ClutterAlpha *alpha; + gchar *stage_label, *stage_name; + ClutterTimeline *timeline; + ClutterAlpha *alpha; ClutterBehaviour *r_behave; new_stage = clutter_stage_new (); if (new_stage == NULL) return FALSE; - clutter_stage_set_color (CLUTTER_STAGE (new_stage), CLUTTER_COLOR_DarkScarletRed); + stage_name = g_strdup_printf ("Stage [%d]", ++n_stages); + + clutter_stage_set_title (CLUTTER_STAGE (new_stage), stage_name); + clutter_stage_set_color (CLUTTER_STAGE (new_stage), + CLUTTER_COLOR_DarkScarletRed); clutter_actor_set_size (new_stage, 320, 240); + clutter_actor_set_name (new_stage, stage_name); g_signal_connect (new_stage, "destroy", G_CALLBACK (on_destroy), NULL); @@ -58,7 +63,7 @@ on_button_press (ClutterActor *actor, clutter_container_add_actor (CLUTTER_CONTAINER (new_stage), tex); - stage_label = g_strdup_printf ("Stage: %d", ++n_stages); + stage_label = g_strconcat ("", stage_name, "", NULL); label = clutter_text_new_with_text ("Mono 12", stage_label); clutter_text_set_color (CLUTTER_TEXT (label), CLUTTER_COLOR_White); @@ -78,9 +83,6 @@ on_button_press (ClutterActor *actor, NULL); */ - win_title = g_strdup_printf ("Stage:%p", new_stage); - clutter_stage_set_title (CLUTTER_STAGE(new_stage), win_title); - timeline = clutter_timeline_new (2000); clutter_timeline_set_loop (timeline, TRUE); @@ -102,6 +104,8 @@ on_button_press (ClutterActor *actor, stages = g_list_prepend (stages, new_stage); + g_free (stage_name); + return TRUE; } @@ -111,11 +115,13 @@ test_multistage_main (int argc, char *argv[]) ClutterActor *stage_default; ClutterActor *label; gint width, height; - gchar *win_title; clutter_init (&argc, &argv); stage_default = clutter_stage_get_default (); + clutter_stage_set_title (CLUTTER_STAGE (stage_default), "Default Stage"); + clutter_actor_set_name (stage_default, "Default Stage"); + g_signal_connect (stage_default, "button-press-event", G_CALLBACK (on_button_press), NULL); @@ -131,9 +137,6 @@ test_multistage_main (int argc, char *argv[]) clutter_container_add_actor (CLUTTER_CONTAINER (stage_default), label); clutter_actor_show (label); - win_title = g_strdup_printf ("Stage:%p", stage_default); - clutter_stage_set_title (CLUTTER_STAGE(stage_default), win_title); - clutter_actor_show (stage_default); clutter_main ();