summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ã…dahl <jadahl@gmail.com>2020-11-30 12:06:16 +0100
committerMarge Bot <marge-bot@gnome.org>2020-12-01 11:41:11 +0000
commit48a90e3a8623d0ae08067f56d3ee844a77352697 (patch)
tree1091f316e012e2460b283bccba64051be740035f
parentc56433d6eeddc3b41025d5f155f8ada70b6c360e (diff)
downloadmutter-48a90e3a8623d0ae08067f56d3ee844a77352697.tar.gz
stack: Add some trace instrumentation
The stack and stack tracker tend to cause missed frames from time to time, especially when there are many open windows. Add some instrumentation to make it this easily verifiable when profiling. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1616>
-rw-r--r--src/core/stack-tracker.c16
-rw-r--r--src/core/stack.c4
2 files changed, 20 insertions, 0 deletions
diff --git a/src/core/stack-tracker.c b/src/core/stack-tracker.c
index a1f8e709d..11a1f0707 100644
--- a/src/core/stack-tracker.c
+++ b/src/core/stack-tracker.c
@@ -1185,9 +1185,13 @@ meta_stack_tracker_restack_managed (MetaStackTracker *tracker,
int n_windows;
int old_pos, new_pos;
+ COGL_TRACE_BEGIN_SCOPED (StackTrackerRestackManaged,
+ "StackTracker: Restack Managed");
if (n_managed == 0)
return;
+ COGL_TRACE_BEGIN (StackTrackerRestackManagedGet,
+ "StackTracker: Restack Managed (get)");
meta_stack_tracker_get_stack (tracker, &windows, &n_windows);
/* If the top window has to be restacked, we don't want to move it to the very
@@ -1204,7 +1208,10 @@ meta_stack_tracker_restack_managed (MetaStackTracker *tracker,
break;
}
g_assert (old_pos >= 0);
+ COGL_TRACE_END (StackTrackerRestackManagedGet);
+ COGL_TRACE_BEGIN (StackTrackerRestackManagedRaise,
+ "StackTracker: Restack Managed (raise)");
new_pos = n_managed - 1;
if (managed[new_pos] != windows[old_pos])
{
@@ -1213,10 +1220,13 @@ meta_stack_tracker_restack_managed (MetaStackTracker *tracker,
meta_stack_tracker_get_stack (tracker, &windows, &n_windows);
/* Moving managed[new_pos] above windows[old_pos], moves the window at old_pos down by one */
}
+ COGL_TRACE_END (StackTrackerRestackManagedRaise);
old_pos--;
new_pos--;
+ COGL_TRACE_BEGIN (StackTrackerRestackManagedRestack,
+ "StackTracker: Restack Managed (restack)");
while (old_pos >= 0 && new_pos >= 0)
{
if (meta_stack_tracker_is_guard_window (tracker, windows[old_pos]))
@@ -1243,12 +1253,16 @@ meta_stack_tracker_restack_managed (MetaStackTracker *tracker,
old_pos--;
new_pos--;
}
+ COGL_TRACE_END (StackTrackerRestackManagedRestack);
+ COGL_TRACE_BEGIN (StackTrackerRestackManagedLower,
+ "StackTracker: Restack Managed (lower)");
while (new_pos > 0)
{
meta_stack_tracker_lower_below (tracker, managed[new_pos], managed[new_pos - 1]);
new_pos--;
}
+ COGL_TRACE_END (StackTrackerRestackManagedLower);
}
void
@@ -1260,6 +1274,8 @@ meta_stack_tracker_restack_at_bottom (MetaStackTracker *tracker,
int n_windows;
int pos;
+ COGL_TRACE_BEGIN_SCOPED (StackTrackerRestackAtBottom,
+ "Stack tracker: Restack at bottom");
meta_stack_tracker_get_stack (tracker, &windows, &n_windows);
for (pos = 0; pos < n_new_order; pos++)
diff --git a/src/core/stack.c b/src/core/stack.c
index 44dce7098..e1e73867d 100644
--- a/src/core/stack.c
+++ b/src/core/stack.c
@@ -78,6 +78,8 @@ on_stack_changed (MetaStack *stack)
GArray *hidden_stack_ids;
GList *sorted;
+ COGL_TRACE_BEGIN_SCOPED (StackChanged, "Stack changed");
+
meta_topic (META_DEBUG_STACK, "Syncing window stack to server");
all_root_children_stacked = g_array_new (FALSE, FALSE, sizeof (uint64_t));
@@ -259,6 +261,8 @@ meta_stack_changed (MetaStack *stack)
if (stack->freeze_count > 0)
return;
+ COGL_TRACE_BEGIN_SCOPED (MetaStackChangedSort, "Stack: Changed");
+
stack_ensure_sorted (stack);
g_signal_emit (stack, signals[CHANGED], 0);
}