clutter: Add ClutterFrameInfo::view_frame_counter

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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4306>
This commit is contained in:
Michel Dänzer 2025-03-05 16:45:24 +01:00 committed by Michel Dänzer
parent 7bcbd253c2
commit 84135e51b0
10 changed files with 45 additions and 17 deletions

View File

@ -121,6 +121,7 @@ typedef enum
struct _ClutterFrameInfo struct _ClutterFrameInfo
{ {
int64_t global_frame_counter; int64_t global_frame_counter;
int64_t view_frame_counter;
int64_t presentation_time; /* microseconds; CLOCK_MONOTONIC */ int64_t presentation_time; /* microseconds; CLOCK_MONOTONIC */
int64_t target_presentation_time; /* microseconds; CLOCK_MONOTONIC */ int64_t target_presentation_time; /* microseconds; CLOCK_MONOTONIC */
float refresh_rate; float refresh_rate;

View File

@ -68,6 +68,7 @@ struct _CoglFrameInfo
float refresh_rate; float refresh_rate;
int64_t global_frame_counter; int64_t global_frame_counter;
int64_t view_frame_counter;
CoglFrameInfoFlag flags; CoglFrameInfoFlag flags;
@ -84,7 +85,8 @@ struct _CoglFrameInfo
COGL_EXPORT COGL_EXPORT
CoglFrameInfo *cogl_frame_info_new (CoglContext *context, CoglFrameInfo *cogl_frame_info_new (CoglContext *context,
int64_t global_frame_counter); int64_t global_frame_counter,
int64_t view_frame_counter);
COGL_EXPORT COGL_EXPORT
void cogl_frame_info_set_target_presentation_time (CoglFrameInfo *info, void cogl_frame_info_set_target_presentation_time (CoglFrameInfo *info,

View File

@ -61,13 +61,15 @@ cogl_frame_info_class_init (CoglFrameInfoClass *class)
CoglFrameInfo * CoglFrameInfo *
cogl_frame_info_new (CoglContext *context, cogl_frame_info_new (CoglContext *context,
int64_t global_frame_counter) int64_t global_frame_counter,
int64_t view_frame_counter)
{ {
CoglFrameInfo *info; CoglFrameInfo *info;
info = g_object_new (COGL_TYPE_FRAME_INFO, NULL); info = g_object_new (COGL_TYPE_FRAME_INFO, NULL);
info->context = context; info->context = context;
info->global_frame_counter = global_frame_counter; info->global_frame_counter = global_frame_counter;
info->view_frame_counter = view_frame_counter;
return info; return info;
} }
@ -111,6 +113,12 @@ cogl_frame_info_get_global_frame_counter (CoglFrameInfo *info)
return info->global_frame_counter; return info->global_frame_counter;
} }
int64_t
cogl_frame_info_get_view_frame_counter (CoglFrameInfo *info)
{
return info->view_frame_counter;
}
gboolean gboolean
cogl_frame_info_get_is_symbolic (CoglFrameInfo *info) cogl_frame_info_get_is_symbolic (CoglFrameInfo *info)
{ {

View File

@ -124,6 +124,9 @@ float cogl_frame_info_get_refresh_rate (CoglFrameInfo *info);
COGL_EXPORT COGL_EXPORT
int64_t cogl_frame_info_get_global_frame_counter (CoglFrameInfo *info); 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 COGL_EXPORT
gboolean cogl_frame_info_get_is_symbolic (CoglFrameInfo *info); gboolean cogl_frame_info_get_is_symbolic (CoglFrameInfo *info);

View File

@ -63,7 +63,8 @@ GType meta_stage_impl_get_type (void) G_GNUC_CONST;
MetaBackend * meta_stage_impl_get_backend (MetaStageImpl *stage_impl); MetaBackend * meta_stage_impl_get_backend (MetaStageImpl *stage_impl);
void meta_stage_impl_add_onscreen_frame_info (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); void meta_stage_impl_rebuild_views (MetaStageImpl *stage_impl);

View File

@ -276,7 +276,8 @@ swap_framebuffer (ClutterStageWindow *stage_window,
frame_info = 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++; priv->global_frame_counter++;
if (clutter_frame_get_target_presentation_time (frame, if (clutter_frame_get_target_presentation_time (frame,
@ -319,7 +320,8 @@ swap_framebuffer (ClutterStageWindow *stage_window,
framebuffer); framebuffer);
cogl_framebuffer_flush (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++; priv->global_frame_counter++;
} }
} }
@ -760,7 +762,8 @@ meta_stage_impl_scanout_view (MetaStageImpl *stage_impl,
onscreen = COGL_ONSCREEN (framebuffer); 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, if (!cogl_onscreen_direct_scanout (onscreen,
scanout, scanout,
@ -818,7 +821,8 @@ meta_stage_impl_redraw_view (ClutterStageWindow *stage_window,
void void
meta_stage_impl_add_onscreen_frame_info (MetaStageImpl *stage_impl, meta_stage_impl_add_onscreen_frame_info (MetaStageImpl *stage_impl,
ClutterStageView *stage_view) ClutterStageView *stage_view,
ClutterFrame *frame)
{ {
MetaStageImplPrivate *priv = MetaStageImplPrivate *priv =
meta_stage_impl_get_instance_private (stage_impl); 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); CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglFrameInfo *frame_info; 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++; priv->global_frame_counter++;
cogl_onscreen_add_frame_info (COGL_ONSCREEN (framebuffer), frame_info); cogl_onscreen_add_frame_info (COGL_ONSCREEN (framebuffer), frame_info);

View File

@ -37,4 +37,5 @@ struct _MetaStageViewClass
ClutterDamageHistory * meta_stage_view_get_damage_history (MetaStageView *view); ClutterDamageHistory * meta_stage_view_get_damage_history (MetaStageView *view);
void meta_stage_view_perform_fake_swap (MetaStageView *view, void meta_stage_view_perform_fake_swap (MetaStageView *view,
int64_t counter); int64_t global_frame_counter,
int64_t view_frame_counter);

View File

@ -72,6 +72,7 @@ frame_cb (CoglOnscreen *onscreen,
clutter_frame_info = (ClutterFrameInfo) { clutter_frame_info = (ClutterFrameInfo) {
.global_frame_counter = cogl_frame_info_get_global_frame_counter (frame_info), .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), .refresh_rate = cogl_frame_info_get_refresh_rate (frame_info),
.presentation_time = .presentation_time =
cogl_frame_info_get_presentation_time_us (frame_info), cogl_frame_info_get_presentation_time_us (frame_info),
@ -202,7 +203,8 @@ notify_presented_idle (gpointer user_data)
void void
meta_stage_view_perform_fake_swap (MetaStageView *view, 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); ClutterStageView *clutter_view = CLUTTER_STAGE_VIEW (view);
MetaStageViewPrivate *priv = MetaStageViewPrivate *priv =
@ -212,7 +214,8 @@ meta_stage_view_perform_fake_swap (MetaStageView *view,
closure = g_new0 (NotifyPresentedClosure, 1); closure = g_new0 (NotifyPresentedClosure, 1);
closure->view = clutter_view; closure->view = clutter_view;
closure->frame_info = (ClutterFrameInfo) { 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), .refresh_rate = clutter_stage_view_get_refresh_rate (clutter_view),
.presentation_time = g_get_monotonic_time (), .presentation_time = g_get_monotonic_time (),
.flags = CLUTTER_FRAME_INFO_FLAG_NONE, .flags = CLUTTER_FRAME_INFO_FLAG_NONE,

View File

@ -147,6 +147,7 @@ maybe_post_next_frame (CoglOnscreen *onscreen);
static void static void
post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native, post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native,
ClutterFrame *frame,
MetaKmsUpdate *kms_update); MetaKmsUpdate *kms_update);
static gboolean static gboolean
@ -1670,7 +1671,7 @@ maybe_post_next_frame (CoglOnscreen *onscreen)
region)) region))
{ {
kms_update = meta_frame_native_steal_kms_update (frame_native); 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; return;
} }
@ -1897,7 +1898,8 @@ meta_onscreen_native_get_window_handles (CoglOnscreen *onscreen,
} }
static void static void
add_onscreen_frame_info (MetaCrtc *crtc) add_onscreen_frame_info (MetaCrtc *crtc,
ClutterFrame *frame)
{ {
MetaGpu *gpu = meta_crtc_get_gpu (crtc); MetaGpu *gpu = meta_crtc_get_gpu (crtc);
MetaBackend *backend = meta_gpu_get_backend (gpu); 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); MetaRendererView *view = meta_renderer_get_view_for_crtc (renderer, crtc);
meta_stage_impl_add_onscreen_frame_info (META_STAGE_IMPL (stage_window), meta_stage_impl_add_onscreen_frame_info (META_STAGE_IMPL (stage_window),
CLUTTER_STAGE_VIEW (view)); CLUTTER_STAGE_VIEW (view),
frame);
} }
void void
@ -2122,13 +2125,14 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
onscreen_native->needs_flush = FALSE; 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); clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_PENDING_PRESENTED);
} }
static void static void
post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native, post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native,
ClutterFrame *frame,
MetaKmsUpdate *kms_update) MetaKmsUpdate *kms_update)
{ {
MetaCrtc *crtc = onscreen_native->crtc; MetaCrtc *crtc = onscreen_native->crtc;
@ -2148,7 +2152,7 @@ post_nonprimary_plane_update (MetaOnscreenNative *onscreen_native,
NULL, NULL,
g_object_ref (onscreen_native->view), g_object_ref (onscreen_native->view),
g_object_unref); g_object_unref);
add_onscreen_frame_info (crtc); add_onscreen_frame_info (crtc, frame);
meta_topic (META_DEBUG_KMS, meta_topic (META_DEBUG_KMS,
"Posting non-primary plane update for CRTC %u (%s)", "Posting non-primary plane update for CRTC %u (%s)",

View File

@ -178,7 +178,7 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window,
draw_view (stage_nested, renderer_view, texture); 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, cogl_onscreen_egl_maybe_create_timestamp_query (stage_x11->onscreen,
frame_info); frame_info);
cogl_onscreen_swap_buffers (stage_x11->onscreen, frame_info, frame); cogl_onscreen_swap_buffers (stage_x11->onscreen, frame_info, frame);