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.
This commit is contained in:
Emmanuele Bassi 2011-02-18 12:56:17 +00:00
parent 89a0d514b4
commit 92ddaa9c13
4 changed files with 68 additions and 65 deletions

View File

@ -227,54 +227,6 @@ clutter_get_accessibility_enabled (void)
return cally_get_cally_initialized (); 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: * clutter_redraw:
* *

View File

@ -210,9 +210,6 @@ ClutterActor *_clutter_do_pick (ClutterStage *stage,
gint y, gint y,
ClutterPickMode mode); ClutterPickMode mode);
/* the actual redraw */
void _clutter_do_redraw (ClutterStage *stage);
guint _clutter_pixel_to_id (guchar pixel[4]); guint _clutter_pixel_to_id (guchar pixel[4]);
void _clutter_id_to_color (guint id, void _clutter_id_to_color (guint id,

View File

@ -137,6 +137,9 @@ struct _ClutterStagePrivate
GHashTable *devices; GHashTable *devices;
GTimer *fps_timer;
gint32 timer_n_frames;
guint relayout_pending : 1; guint relayout_pending : 1;
guint redraw_pending : 1; guint redraw_pending : 1;
guint is_fullscreen : 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: * _clutter_stage_do_update:
* @stage: A #ClutterStage * @stage: A #ClutterStage
@ -829,8 +878,7 @@ _clutter_stage_do_update (ClutterStage *stage)
_clutter_stage_maybe_finish_queue_redraws (stage); _clutter_stage_maybe_finish_queue_redraws (stage);
CLUTTER_NOTE (PAINT, "redrawing via idle for stage[%p]", stage); clutter_stage_do_redraw (stage);
_clutter_do_redraw (stage);
/* reset the guard, so that new redraws are possible */ /* reset the guard, so that new redraws are possible */
priv->redraw_pending = FALSE; priv->redraw_pending = FALSE;
@ -1199,6 +1247,9 @@ clutter_stage_finalize (GObject *object)
g_hash_table_destroy (priv->devices); 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); G_OBJECT_CLASS (clutter_stage_parent_class)->finalize (object);
} }

View File

@ -30,7 +30,7 @@ on_button_press (ClutterActor *actor,
ClutterActor *new_stage; ClutterActor *new_stage;
ClutterActor *label, *tex; ClutterActor *label, *tex;
gint width, height; gint width, height;
gchar *stage_label, *win_title; gchar *stage_label, *stage_name;
ClutterTimeline *timeline; ClutterTimeline *timeline;
ClutterAlpha *alpha; ClutterAlpha *alpha;
ClutterBehaviour *r_behave; ClutterBehaviour *r_behave;
@ -39,8 +39,13 @@ on_button_press (ClutterActor *actor,
if (new_stage == NULL) if (new_stage == NULL)
return FALSE; 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_size (new_stage, 320, 240);
clutter_actor_set_name (new_stage, stage_name);
g_signal_connect (new_stage, "destroy", G_CALLBACK (on_destroy), NULL); 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); clutter_container_add_actor (CLUTTER_CONTAINER (new_stage), tex);
stage_label = g_strdup_printf ("<b>Stage: %d</b>", ++n_stages); stage_label = g_strconcat ("<b>", stage_name, "</b>", NULL);
label = clutter_text_new_with_text ("Mono 12", stage_label); label = clutter_text_new_with_text ("Mono 12", stage_label);
clutter_text_set_color (CLUTTER_TEXT (label), CLUTTER_COLOR_White); clutter_text_set_color (CLUTTER_TEXT (label), CLUTTER_COLOR_White);
@ -78,9 +83,6 @@ on_button_press (ClutterActor *actor,
NULL); 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); timeline = clutter_timeline_new (2000);
clutter_timeline_set_loop (timeline, TRUE); clutter_timeline_set_loop (timeline, TRUE);
@ -102,6 +104,8 @@ on_button_press (ClutterActor *actor,
stages = g_list_prepend (stages, new_stage); stages = g_list_prepend (stages, new_stage);
g_free (stage_name);
return TRUE; return TRUE;
} }
@ -111,11 +115,13 @@ test_multistage_main (int argc, char *argv[])
ClutterActor *stage_default; ClutterActor *stage_default;
ClutterActor *label; ClutterActor *label;
gint width, height; gint width, height;
gchar *win_title;
clutter_init (&argc, &argv); clutter_init (&argc, &argv);
stage_default = clutter_stage_get_default (); 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_signal_connect (stage_default, "button-press-event",
G_CALLBACK (on_button_press), G_CALLBACK (on_button_press),
NULL); NULL);
@ -131,9 +137,6 @@ test_multistage_main (int argc, char *argv[])
clutter_container_add_actor (CLUTTER_CONTAINER (stage_default), label); clutter_container_add_actor (CLUTTER_CONTAINER (stage_default), label);
clutter_actor_show (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_actor_show (stage_default);
clutter_main (); clutter_main ();