mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 19:40:43 -05:00
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:
parent
89a0d514b4
commit
92ddaa9c13
@ -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:
|
||||||
*
|
*
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ();
|
||||||
|
Loading…
Reference in New Issue
Block a user