[mutter] x11/window: Add tracing for X11 synchronization events



commit ffb88bffc508d95c043bc68872043a56a51fd37a
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Tue Feb 2 23:57:23 2021 +0100

    x11/window: Add tracing for X11 synchronization events
    
    Add tracing and data gathering for processing related to
    _NET_WM_FRAME_DRAWN and _NET_WM_FRAME_TIMINGS, used by some X11 clients
    for synchronized rendering.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1700>

 src/compositor/meta-window-actor-x11.c | 34 ++++++++++++++++++++++++++++++++++
 src/x11/window-x11.c                   | 15 +++++++++++++++
 2 files changed, 49 insertions(+)
---
diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c
index e18b1b28b4..44cf5a67c4 100644
--- a/src/compositor/meta-window-actor-x11.c
+++ b/src/compositor/meta-window-actor-x11.c
@@ -167,6 +167,9 @@ do_send_frame_drawn (MetaWindowActorX11 *actor_x11,
 
   XClientMessageEvent ev = { 0, };
 
+  COGL_TRACE_BEGIN (MetaWindowActorX11FrameDrawn,
+                    "X11: Send _NET_WM_FRAME_DRAWN");
+
   now_us = g_get_monotonic_time ();
   frame->frame_drawn_time =
     meta_compositor_monotonic_to_high_res_xserver_time (display->compositor,
@@ -186,6 +189,19 @@ do_send_frame_drawn (MetaWindowActorX11 *actor_x11,
   XSendEvent (xdisplay, ev.window, False, 0, (XEvent *) &ev);
   XFlush (xdisplay);
   meta_x11_error_trap_pop (display->x11_display);
+
+  if (G_UNLIKELY (cogl_is_tracing_enabled ()))
+    {
+      g_autofree char *description = NULL;
+
+      description = g_strdup_printf ("frame drawn time: %" G_GINT64_FORMAT ", "
+                                     "sync request serial: %" G_GINT64_FORMAT,
+                                     frame->frame_drawn_time,
+                                     frame->sync_request_serial);
+      COGL_TRACE_DESCRIBE (MetaWindowActorX11FrameDrawn,
+                           description);
+      COGL_TRACE_END (MetaWindowActorX11FrameDrawn);
+    }
 }
 
 static void
@@ -201,6 +217,9 @@ do_send_frame_timings (MetaWindowActorX11 *actor_x11,
 
   XClientMessageEvent ev = { 0, };
 
+  COGL_TRACE_BEGIN (MetaWindowActorX11FrameTimings,
+                    "X11: Send _NET_WM_FRAME_TIMINGS");
+
   ev.type = ClientMessage;
   ev.window = meta_window_get_xwindow (window);
   ev.message_type = display->x11_display->atom__NET_WM_FRAME_TIMINGS;
@@ -231,6 +250,21 @@ do_send_frame_timings (MetaWindowActorX11 *actor_x11,
   XSendEvent (xdisplay, ev.window, False, 0, (XEvent *) &ev);
   XFlush (xdisplay);
   meta_x11_error_trap_pop (display->x11_display);
+
+  if (G_UNLIKELY (cogl_is_tracing_enabled ()))
+    {
+      g_autofree char *description = NULL;
+
+      description =
+        g_strdup_printf ("refresh interval: %d, "
+                         "presentation time: %" G_GINT64_FORMAT ", "
+                         "sync request serial: %" G_GINT64_FORMAT,
+                         refresh_interval,
+                         frame->sync_request_serial,
+                         presentation_time);
+      COGL_TRACE_DESCRIBE (MetaWindowActorX11FrameTimings, description);
+      COGL_TRACE_END (MetaWindowActorX11FrameTimings);
+    }
 }
 
 static void
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index 204b49e93e..9152fde525 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -4025,6 +4025,8 @@ meta_window_x11_update_sync_request_counter (MetaWindow *window,
   gboolean needs_frame_drawn = FALSE;
   gboolean no_delay_frame = FALSE;
 
+  COGL_TRACE_BEGIN (MetaWindowSyncRequestCounter, "X11: Sync request counter");
+
   if (window->extended_sync_request_counter && new_counter_value % 2 == 0)
     {
       needs_frame_drawn = TRUE;
@@ -4071,6 +4073,19 @@ meta_window_x11_update_sync_request_counter (MetaWindow *window,
   if (needs_frame_drawn)
     meta_compositor_queue_frame_drawn (window->display->compositor, window,
                                        no_delay_frame);
+
+  if (G_UNLIKELY (cogl_is_tracing_enabled ()))
+    {
+      g_autofree char *description = NULL;
+
+      description =
+        g_strdup_printf ("sync request serial: %" G_GINT64_FORMAT ", "
+                         "needs frame drawn: %s",
+                         new_counter_value,
+                         needs_frame_drawn ? "yes" : "no");
+      COGL_TRACE_DESCRIBE (MetaWindowSyncRequestCounter, description);
+      COGL_TRACE_END (MetaWindowSyncRequestCounter);
+    }
 }
 
 Window


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]