From ab1107973bdc3bb69fd7864efe7652c5c5b5e19e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 27 Aug 2019 13:11:07 +0300 Subject: [PATCH] backends/native: Add various cogl traces Trace the time spent finishing a frame, posting KMS updates and some other things. https://gitlab.gnome.org/GNOME/mutter/merge_requests/757 --- cogl/cogl/winsys/cogl-winsys-egl.c | 4 ++++ src/backends/native/meta-backend-native.c | 7 +++++++ src/backends/native/meta-kms.c | 7 +++++++ src/backends/native/meta-renderer-native.c | 21 +++++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/cogl/cogl/winsys/cogl-winsys-egl.c b/cogl/cogl/winsys/cogl-winsys-egl.c index 611d93353..a6a0dca36 100644 --- a/cogl/cogl/winsys/cogl-winsys-egl.c +++ b/cogl/cogl/winsys/cogl-winsys-egl.c @@ -43,6 +43,7 @@ #include "cogl-onscreen-template-private.h" #include "cogl-egl.h" #include "cogl-private.h" +#include "cogl-trace.h" #include "winsys/cogl-winsys-egl-private.h" #include "winsys/cogl-winsys-private.h" @@ -753,6 +754,9 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, CoglRendererEGL *egl_renderer = renderer->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys; + COGL_TRACE_BEGIN_SCOPED (CoglOnscreenEGLSwapBuffersWithDamage, + "Onscreen (eglSwapBuffers)"); + /* The specification for EGL (at least in 1.4) says that the surface needs to be bound to the current context for the swap to work although it may change in future. Mesa explicitly checks for this diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c index 4df2d5235..0ef6e4231 100644 --- a/src/backends/native/meta-backend-native.c +++ b/src/backends/native/meta-backend-native.c @@ -59,6 +59,7 @@ #include "backends/native/meta-monitor-manager-kms.h" #include "backends/native/meta-renderer-native.h" #include "backends/native/meta-stage-native.h" +#include "cogl/cogl-trace.h" #include "core/meta-border.h" #include "meta/main.h" @@ -799,6 +800,9 @@ meta_backend_native_pause (MetaBackendNative *native) MetaMonitorManagerKms *monitor_manager_kms = META_MONITOR_MANAGER_KMS (monitor_manager); + COGL_TRACE_BEGIN_SCOPED (MetaBackendNativePause, + "Backend (pause)"); + meta_device_manager_native_release_devices (); clutter_stage_freeze_updates (stage); @@ -818,6 +822,9 @@ void meta_backend_native_resume (MetaBackendNative *native) MetaInputSettings *input_settings; MetaIdleMonitor *idle_monitor; + COGL_TRACE_BEGIN_SCOPED (MetaBackendNativeResume, + "Backend (resume)"); + meta_monitor_manager_kms_resume (monitor_manager_kms); connect_udev_device_added_handler (native); diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c index 13dc396d3..296e63be8 100644 --- a/src/backends/native/meta-kms.c +++ b/src/backends/native/meta-kms.c @@ -27,6 +27,7 @@ #include "backends/native/meta-kms-impl-simple.h" #include "backends/native/meta-kms-update-private.h" #include "backends/native/meta-udev.h" +#include "cogl/cogl-trace.h" /** * SECTION:kms @@ -205,6 +206,9 @@ meta_kms_post_update_sync (MetaKms *kms, { meta_kms_update_seal (update); + COGL_TRACE_BEGIN_SCOPED (MetaKmsPostUpdateSync, + "KMS (post update)"); + return meta_kms_run_impl_task_sync (kms, meta_kms_update_process_in_impl, update, @@ -441,6 +445,9 @@ meta_kms_update_states_in_impl (MetaKms *kms) { GList *l; + COGL_TRACE_BEGIN_SCOPED (MetaKmsUpdateStates, + "KMS (update states)"); + meta_assert_in_kms_impl (kms); for (l = kms->devices; l; l = l->next) diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index e468fc321..a58bab0fc 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -1666,6 +1666,9 @@ meta_onscreen_native_set_crtc_modes (CoglOnscreen *onscreen, MetaLogicalMonitor *logical_monitor; SetCrtcModeData data; + COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeSetCrtcModes, + "Onscreen (set CRTC modes)"); + logical_monitor = meta_renderer_view_get_logical_monitor (view); data = (SetCrtcModeData) { .renderer_gpu_data = renderer_gpu_data, @@ -1709,6 +1712,9 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen, MetaPowerSave power_save_mode; MetaLogicalMonitor *logical_monitor; + COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeFlipCrtcs, + "Onscreen (flip CRTCs)"); + power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager); if (power_save_mode == META_POWER_SAVE_ON) { @@ -2086,6 +2092,9 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen) GHashTableIter iter; MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state; + COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeGpuStatePreSwapBuffers, + "Onscreen (secondary gpu pre-swap-buffers)"); + g_hash_table_iter_init (&iter, onscreen_native->secondary_gpu_states); while (g_hash_table_iter_next (&iter, NULL, @@ -2135,6 +2144,9 @@ update_secondary_gpu_state_post_swap_buffers (CoglOnscreen *onscreen, GHashTableIter iter; MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state; + COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeGpuStatePostSwapBuffers, + "Onscreen (secondary gpu post-swap-buffers)"); + g_hash_table_iter_init (&iter, onscreen_native->secondary_gpu_states); while (g_hash_table_iter_next (&iter, NULL, @@ -2186,13 +2198,19 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, g_autoptr (GError) error = NULL; MetaDrmBufferGbm *buffer_gbm; + COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeSwapBuffers, + "Onscreen (swap-buffers)"); + kms_update = meta_kms_ensure_pending_update (kms); /* * Wait for the flip callback before continuing, as we might have started the * animation earlier due to the animation being driven by some other monitor. */ + COGL_TRACE_BEGIN (MetaRendererNativeSwapBuffersWait, + "Onscreen (waiting for page flips"); wait_for_pending_flips (onscreen); + COGL_TRACE_END (MetaRendererNativeSwapBuffersWait); frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos); frame_info->global_frame_counter = renderer_native->frame_counter; @@ -2257,11 +2275,14 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, if (egl_context_changed) _cogl_winsys_egl_ensure_current (cogl_display); + COGL_TRACE_BEGIN (MetaRendererNativePostKmsUpdate, + "Onscreen (post pending update"); if (!meta_kms_post_pending_update_sync (kms, &error)) { if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED)) g_warning ("Failed to post KMS update: %s", error->message); } + COGL_TRACE_END (MetaRendererNativePostKmsUpdate); } static gboolean