From 84135e51b02a67f9b9f920c9ab9b5ad6dd176d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Wed, 5 Mar 2025 16:45:24 +0100 Subject: [PATCH] clutter: Add ClutterFrameInfo::view_frame_counter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit And plumb it through from ClutterFrame::frame_count. Preparation for later changes, no functional change intended. v2: * Rename to view_frame_counter. (Jonas Ã…dahl) Part-of: --- clutter/clutter/clutter-stage.h | 1 + cogl/cogl/cogl-frame-info-private.h | 4 +++- cogl/cogl/cogl-frame-info.c | 10 +++++++++- cogl/cogl/cogl-frame-info.h | 3 +++ src/backends/meta-stage-impl-private.h | 3 ++- src/backends/meta-stage-impl.c | 15 ++++++++++----- src/backends/meta-stage-view-private.h | 3 ++- src/backends/meta-stage-view.c | 7 +++++-- src/backends/native/meta-onscreen-native.c | 14 +++++++++----- src/backends/x11/nested/meta-stage-x11-nested.c | 2 +- 10 files changed, 45 insertions(+), 17 deletions(-) diff --git a/clutter/clutter/clutter-stage.h b/clutter/clutter/clutter-stage.h index 812a5e032..fef2bb629 100644 --- a/clutter/clutter/clutter-stage.h +++ b/clutter/clutter/clutter-stage.h @@ -121,6 +121,7 @@ typedef enum struct _ClutterFrameInfo { int64_t global_frame_counter; + int64_t view_frame_counter; int64_t presentation_time; /* microseconds; CLOCK_MONOTONIC */ int64_t target_presentation_time; /* microseconds; CLOCK_MONOTONIC */ float refresh_rate; diff --git a/cogl/cogl/cogl-frame-info-private.h b/cogl/cogl/cogl-frame-info-private.h index 89a1eb3a9..6cedcea1b 100644 --- a/cogl/cogl/cogl-frame-info-private.h +++ b/cogl/cogl/cogl-frame-info-private.h @@ -68,6 +68,7 @@ struct _CoglFrameInfo float refresh_rate; int64_t global_frame_counter; + int64_t view_frame_counter; CoglFrameInfoFlag flags; @@ -84,7 +85,8 @@ struct _CoglFrameInfo COGL_EXPORT CoglFrameInfo *cogl_frame_info_new (CoglContext *context, - int64_t global_frame_counter); + int64_t global_frame_counter, + int64_t view_frame_counter); COGL_EXPORT void cogl_frame_info_set_target_presentation_time (CoglFrameInfo *info, diff --git a/cogl/cogl/cogl-frame-info.c b/cogl/cogl/cogl-frame-info.c index a6e384ccd..b108c3d92 100644 --- a/cogl/cogl/cogl-frame-info.c +++ b/cogl/cogl/cogl-frame-info.c @@ -61,13 +61,15 @@ cogl_frame_info_class_init (CoglFrameInfoClass *class) CoglFrameInfo * cogl_frame_info_new (CoglContext *context, - int64_t global_frame_counter) + int64_t global_frame_counter, + int64_t view_frame_counter) { CoglFrameInfo *info; info = g_object_new (COGL_TYPE_FRAME_INFO, NULL); info->context = context; info->global_frame_counter = global_frame_counter; + info->view_frame_counter = view_frame_counter; return info; } @@ -111,6 +113,12 @@ cogl_frame_info_get_global_frame_counter (CoglFrameInfo *info) return info->global_frame_counter; } +int64_t +cogl_frame_info_get_view_frame_counter (CoglFrameInfo *info) +{ + return info->view_frame_counter; +} + gboolean cogl_frame_info_get_is_symbolic (CoglFrameInfo *info) { diff --git a/cogl/cogl/cogl-frame-info.h b/cogl/cogl/cogl-frame-info.h index a26c4b966..b84da052a 100644 --- a/cogl/cogl/cogl-frame-info.h +++ b/cogl/cogl/cogl-frame-info.h @@ -124,6 +124,9 @@ float cogl_frame_info_get_refresh_rate (CoglFrameInfo *info); COGL_EXPORT int64_t cogl_frame_info_get_global_frame_counter (CoglFrameInfo *info); +COGL_EXPORT +int64_t cogl_frame_info_get_view_frame_counter (CoglFrameInfo *info); + COGL_EXPORT gboolean cogl_frame_info_get_is_symbolic (CoglFrameInfo *info); diff --git a/src/backends/meta-stage-impl-private.h b/src/backends/meta-stage-impl-private.h index fa90468e1..5fe652869 100644 --- a/src/backends/meta-stage-impl-private.h +++ b/src/backends/meta-stage-impl-private.h @@ -63,7 +63,8 @@ GType meta_stage_impl_get_type (void) G_GNUC_CONST; MetaBackend * meta_stage_impl_get_backend (MetaStageImpl *stage_impl); void meta_stage_impl_add_onscreen_frame_info (MetaStageImpl *stage_impl, - ClutterStageView *view); + ClutterStageView *view, + ClutterFrame *frame); void meta_stage_impl_rebuild_views (MetaStageImpl *stage_impl); diff --git a/src/backends/meta-stage-impl.c b/src/backends/meta-stage-impl.c index 1c15c851a..7936f3af4 100644 --- a/src/backends/meta-stage-impl.c +++ b/src/backends/meta-stage-impl.c @@ -276,7 +276,8 @@ swap_framebuffer (ClutterStageWindow *stage_window, frame_info = - cogl_frame_info_new (cogl_context, priv->global_frame_counter); + cogl_frame_info_new (cogl_context, priv->global_frame_counter, + frame->frame_count); priv->global_frame_counter++; if (clutter_frame_get_target_presentation_time (frame, @@ -319,7 +320,8 @@ swap_framebuffer (ClutterStageWindow *stage_window, framebuffer); cogl_framebuffer_flush (framebuffer); - meta_stage_view_perform_fake_swap (view, priv->global_frame_counter); + meta_stage_view_perform_fake_swap (view, priv->global_frame_counter, + frame->frame_count); priv->global_frame_counter++; } } @@ -760,7 +762,8 @@ meta_stage_impl_scanout_view (MetaStageImpl *stage_impl, onscreen = COGL_ONSCREEN (framebuffer); - frame_info = cogl_frame_info_new (cogl_context, priv->global_frame_counter); + frame_info = cogl_frame_info_new (cogl_context, priv->global_frame_counter, + frame->frame_count); if (!cogl_onscreen_direct_scanout (onscreen, scanout, @@ -818,7 +821,8 @@ meta_stage_impl_redraw_view (ClutterStageWindow *stage_window, void meta_stage_impl_add_onscreen_frame_info (MetaStageImpl *stage_impl, - ClutterStageView *stage_view) + ClutterStageView *stage_view, + ClutterFrame *frame) { MetaStageImplPrivate *priv = meta_stage_impl_get_instance_private (stage_impl); @@ -826,7 +830,8 @@ meta_stage_impl_add_onscreen_frame_info (MetaStageImpl *stage_impl, CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer); CoglFrameInfo *frame_info; - frame_info = cogl_frame_info_new (cogl_context, priv->global_frame_counter); + frame_info = cogl_frame_info_new (cogl_context, priv->global_frame_counter, + frame->frame_count); priv->global_frame_counter++; cogl_onscreen_add_frame_info (COGL_ONSCREEN (framebuffer), frame_info); diff --git a/src/backends/meta-stage-view-private.h b/src/backends/meta-stage-view-private.h index 838ea3e87..d379bfbf1 100644 --- a/src/backends/meta-stage-view-private.h +++ b/src/backends/meta-stage-view-private.h @@ -37,4 +37,5 @@ struct _MetaStageViewClass ClutterDamageHistory * meta_stage_view_get_damage_history (MetaStageView *view); void meta_stage_view_perform_fake_swap (MetaStageView *view, - int64_t counter); + int64_t global_frame_counter, + int64_t view_frame_counter); diff --git a/src/backends/meta-stage-view.c b/src/backends/meta-stage-view.c index d80dee4bd..6963fc37c 100644 --- a/src/backends/meta-stage-view.c +++ b/src/backends/meta-stage-view.c @@ -72,6 +72,7 @@ frame_cb (CoglOnscreen *onscreen, clutter_frame_info = (ClutterFrameInfo) { .global_frame_counter = cogl_frame_info_get_global_frame_counter (frame_info), + .view_frame_counter = cogl_frame_info_get_view_frame_counter (frame_info), .refresh_rate = cogl_frame_info_get_refresh_rate (frame_info), .presentation_time = cogl_frame_info_get_presentation_time_us (frame_info), @@ -202,7 +203,8 @@ notify_presented_idle (gpointer user_data) void meta_stage_view_perform_fake_swap (MetaStageView *view, - int64_t counter) + int64_t global_frame_counter, + int64_t view_frame_counter) { ClutterStageView *clutter_view = CLUTTER_STAGE_VIEW (view); MetaStageViewPrivate *priv = @@ -212,7 +214,8 @@ meta_stage_view_perform_fake_swap (MetaStageView *view, closure = g_new0 (NotifyPresentedClosure, 1); closure->view = clutter_view; closure->frame_info = (ClutterFrameInfo) { - .global_frame_counter = counter, + .global_frame_counter = global_frame_counter, + .view_frame_counter = view_frame_counter, .refresh_rate = clutter_stage_view_get_refresh_rate (clutter_view), .presentation_time = g_get_monotonic_time (), .flags = CLUTTER_FRAME_INFO_FLAG_NONE, diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index e6e59684b..a8d7d7aa2 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -147,6 +147,7 @@ maybe_post_next_frame (CoglOnscreen *onscreen); static void post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native, + ClutterFrame *frame, MetaKmsUpdate *kms_update); static gboolean @@ -1670,7 +1671,7 @@ maybe_post_next_frame (CoglOnscreen *onscreen) region)) { kms_update = meta_frame_native_steal_kms_update (frame_native); - post_nonprimary_plane_update (onscreen_native, kms_update); + post_nonprimary_plane_update (onscreen_native, frame, kms_update); return; } @@ -1897,7 +1898,8 @@ meta_onscreen_native_get_window_handles (CoglOnscreen *onscreen, } static void -add_onscreen_frame_info (MetaCrtc *crtc) +add_onscreen_frame_info (MetaCrtc *crtc, + ClutterFrame *frame) { MetaGpu *gpu = meta_crtc_get_gpu (crtc); MetaBackend *backend = meta_gpu_get_backend (gpu); @@ -1907,7 +1909,8 @@ add_onscreen_frame_info (MetaCrtc *crtc) MetaRendererView *view = meta_renderer_get_view_for_crtc (renderer, crtc); meta_stage_impl_add_onscreen_frame_info (META_STAGE_IMPL (stage_window), - CLUTTER_STAGE_VIEW (view)); + CLUTTER_STAGE_VIEW (view), + frame); } void @@ -2122,13 +2125,14 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen, onscreen_native->needs_flush = FALSE; } - post_nonprimary_plane_update (onscreen_native, kms_update); + post_nonprimary_plane_update (onscreen_native, frame, kms_update); clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_PENDING_PRESENTED); } static void post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native, + ClutterFrame *frame, MetaKmsUpdate *kms_update) { MetaCrtc *crtc = onscreen_native->crtc; @@ -2148,7 +2152,7 @@ post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native, NULL, g_object_ref (onscreen_native->view), g_object_unref); - add_onscreen_frame_info (crtc); + add_onscreen_frame_info (crtc, frame); meta_topic (META_DEBUG_KMS, "Posting non-primary plane update for CRTC %u (%s)", diff --git a/src/backends/x11/nested/meta-stage-x11-nested.c b/src/backends/x11/nested/meta-stage-x11-nested.c index b6f2e5493..da25f8b37 100644 --- a/src/backends/x11/nested/meta-stage-x11-nested.c +++ b/src/backends/x11/nested/meta-stage-x11-nested.c @@ -178,7 +178,7 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window, draw_view (stage_nested, renderer_view, texture); } - frame_info = cogl_frame_info_new (context, 0); + frame_info = cogl_frame_info_new (context, 0, frame->frame_count); cogl_onscreen_egl_maybe_create_timestamp_query (stage_x11->onscreen, frame_info); cogl_onscreen_swap_buffers (stage_x11->onscreen, frame_info, frame);