Make frame-timestamp logging optional
Instead of always logging frame timestamps for every frame - which was using >26 bytes of memory per frame, or 5MB per hour of continuous redrawing - make frame timestamps something that defaults off and is turned turned on using a new ShellGlobal::frame-timestamps property by the perf scripts. https://bugzilla.gnome.org/show_bug.cgi?id=732350
This commit is contained in:
parent
f0d4260c81
commit
e30925995f
@ -72,6 +72,9 @@ function run() {
|
|||||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
||||||
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
||||||
|
|
||||||
|
// Enable recording of timestamps for different points in the frame cycle
|
||||||
|
global.frame_timestamps = true;
|
||||||
|
|
||||||
Main.overview.connect('shown', function() {
|
Main.overview.connect('shown', function() {
|
||||||
Scripting.scriptEvent('overviewShowDone');
|
Scripting.scriptEvent('overviewShowDone');
|
||||||
});
|
});
|
||||||
|
@ -389,10 +389,18 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
|||||||
* can send this with a ust of 0. Simplify life for consumers
|
* can send this with a ust of 0. Simplify life for consumers
|
||||||
* by ignoring such events */
|
* by ignoring such events */
|
||||||
if (swap_complete_event->ust != 0)
|
if (swap_complete_event->ust != 0)
|
||||||
|
{
|
||||||
|
gboolean frame_timestamps;
|
||||||
|
g_object_get (shell_plugin->global,
|
||||||
|
"frame-timestamps", &frame_timestamps,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (frame_timestamps)
|
||||||
shell_perf_log_event_x (shell_perf_log_get_default (),
|
shell_perf_log_event_x (shell_perf_log_get_default (),
|
||||||
"glx.swapComplete",
|
"glx.swapComplete",
|
||||||
swap_complete_event->ust);
|
swap_complete_event->ust);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
if (meta_is_wayland_compositor ())
|
||||||
|
@ -96,6 +96,7 @@ struct _ShellGlobal {
|
|||||||
guint32 xdnd_timestamp;
|
guint32 xdnd_timestamp;
|
||||||
|
|
||||||
gboolean has_modal;
|
gboolean has_modal;
|
||||||
|
gboolean frame_timestamps;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -116,6 +117,7 @@ enum {
|
|||||||
PROP_IMAGEDIR,
|
PROP_IMAGEDIR,
|
||||||
PROP_USERDATADIR,
|
PROP_USERDATADIR,
|
||||||
PROP_FOCUS_MANAGER,
|
PROP_FOCUS_MANAGER,
|
||||||
|
PROP_FRAME_TIMESTAMPS,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Signals */
|
/* Signals */
|
||||||
@ -146,6 +148,9 @@ shell_global_set_property(GObject *object,
|
|||||||
g_clear_pointer (&global->session_mode, g_free);
|
g_clear_pointer (&global->session_mode, g_free);
|
||||||
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FRAME_TIMESTAMPS:
|
||||||
|
global->frame_timestamps = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -217,6 +222,9 @@ shell_global_get_property(GObject *object,
|
|||||||
case PROP_FOCUS_MANAGER:
|
case PROP_FOCUS_MANAGER:
|
||||||
g_value_set_object (value, global->focus_manager);
|
g_value_set_object (value, global->focus_manager);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FRAME_TIMESTAMPS:
|
||||||
|
g_value_set_boolean (value, global->frame_timestamps);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -500,6 +508,13 @@ shell_global_class_init (ShellGlobalClass *klass)
|
|||||||
"The shell's StFocusManager",
|
"The shell's StFocusManager",
|
||||||
ST_TYPE_FOCUS_MANAGER,
|
ST_TYPE_FOCUS_MANAGER,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_FRAME_TIMESTAMPS,
|
||||||
|
g_param_spec_boolean ("frame-timestamps",
|
||||||
|
"Frame Timestamps",
|
||||||
|
"Whether to log frame timestamps in the performance log",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -756,6 +771,9 @@ global_stage_notify_height (GObject *gobject,
|
|||||||
static gboolean
|
static gboolean
|
||||||
global_stage_before_paint (gpointer data)
|
global_stage_before_paint (gpointer data)
|
||||||
{
|
{
|
||||||
|
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||||
|
|
||||||
|
if (global->frame_timestamps)
|
||||||
shell_perf_log_event (shell_perf_log_get_default (),
|
shell_perf_log_event (shell_perf_log_get_default (),
|
||||||
"clutter.stagePaintStart");
|
"clutter.stagePaintStart");
|
||||||
|
|
||||||
@ -765,6 +783,9 @@ global_stage_before_paint (gpointer data)
|
|||||||
static gboolean
|
static gboolean
|
||||||
global_stage_after_paint (gpointer data)
|
global_stage_after_paint (gpointer data)
|
||||||
{
|
{
|
||||||
|
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||||
|
|
||||||
|
if (global->frame_timestamps)
|
||||||
shell_perf_log_event (shell_perf_log_get_default (),
|
shell_perf_log_event (shell_perf_log_get_default (),
|
||||||
"clutter.stagePaintDone");
|
"clutter.stagePaintDone");
|
||||||
|
|
||||||
@ -951,11 +972,11 @@ _shell_global_set_plugin (ShellGlobal *global,
|
|||||||
|
|
||||||
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT,
|
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT,
|
||||||
global_stage_before_paint,
|
global_stage_before_paint,
|
||||||
NULL, NULL);
|
global, NULL);
|
||||||
|
|
||||||
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
|
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
|
||||||
global_stage_after_paint,
|
global_stage_after_paint,
|
||||||
NULL, NULL);
|
global, NULL);
|
||||||
|
|
||||||
shell_perf_log_define_event (shell_perf_log_get_default(),
|
shell_perf_log_define_event (shell_perf_log_get_default(),
|
||||||
"clutter.stagePaintStart",
|
"clutter.stagePaintStart",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user