From c00a8e98a3cea96db9ff859d59640f00623bff58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 22 May 2020 22:30:45 +0200 Subject: [PATCH] clutter/cogl: Take over global frame count responsibility The native backend had a plain counter, and the X11 backend used the CoglOnscreen of the screen; change it into a plain counter in ClutterStageCogl. This also moves the global frame count setting to the frame info constuctor. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1285 --- clutter/clutter/cogl/clutter-stage-cogl.c | 28 +++++++++++++++++-- cogl/cogl/cogl-frame-info-private.h | 2 +- cogl/cogl/cogl-frame-info.c | 3 +- src/backends/native/meta-renderer-native.c | 20 ++----------- src/backends/native/meta-renderer-native.h | 2 -- src/backends/native/meta-stage-native.c | 11 -------- src/backends/x11/meta-stage-x11.c | 9 ------ .../x11/nested/meta-stage-x11-nested.c | 2 +- 8 files changed, 33 insertions(+), 44 deletions(-) diff --git a/clutter/clutter/cogl/clutter-stage-cogl.c b/clutter/clutter/cogl/clutter-stage-cogl.c index 44cb37acc..565f2f9fb 100644 --- a/clutter/clutter/cogl/clutter-stage-cogl.c +++ b/clutter/clutter/cogl/clutter-stage-cogl.c @@ -60,12 +60,18 @@ typedef struct _ClutterStageViewCoglPrivate G_DEFINE_TYPE_WITH_PRIVATE (ClutterStageViewCogl, clutter_stage_view_cogl, CLUTTER_TYPE_STAGE_VIEW) +typedef struct _ClutterStageCoglPrivate +{ + int64_t global_frame_counter; +} ClutterStageCoglPrivate; + static void clutter_stage_window_iface_init (ClutterStageWindowInterface *iface); G_DEFINE_TYPE_WITH_CODE (ClutterStageCogl, _clutter_stage_cogl, G_TYPE_OBJECT, + G_ADD_PRIVATE (ClutterStageCogl) G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_STAGE_WINDOW, clutter_stage_window_iface_init)); @@ -158,6 +164,16 @@ clutter_stage_cogl_realize (ClutterStageWindow *stage_window) return TRUE; } +static int64_t +clutter_stage_cogl_get_frame_counter (ClutterStageWindow *stage_window) +{ + ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); + ClutterStageCoglPrivate *priv = + _clutter_stage_cogl_get_instance_private (stage_cogl); + + return priv->global_frame_counter; +} + static void clutter_stage_cogl_schedule_update (ClutterStageWindow *stage_window, gint sync_delay) @@ -361,6 +377,9 @@ swap_framebuffer (ClutterStageWindow *stage_window, cairo_region_t *swap_region, gboolean swap_with_damage) { + ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); + ClutterStageCoglPrivate *priv = + _clutter_stage_cogl_get_instance_private (stage_cogl); CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view); clutter_stage_view_before_swap_buffer (view, swap_region); @@ -384,7 +403,8 @@ swap_framebuffer (ClutterStageWindow *stage_window, damage[i * 4 + 3] = rect.height; } - frame_info = cogl_frame_info_new (); + frame_info = cogl_frame_info_new (priv->global_frame_counter); + priv->global_frame_counter++; /* push on the screen */ if (n_rects > 0 && !swap_with_damage) @@ -750,6 +770,8 @@ clutter_stage_cogl_scanout_view (ClutterStageCogl *stage_cogl, ClutterStageView *view, CoglScanout *scanout) { + ClutterStageCoglPrivate *priv = + _clutter_stage_cogl_get_instance_private (stage_cogl); CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view); CoglOnscreen *onscreen; CoglFrameInfo *frame_info; @@ -758,7 +780,8 @@ clutter_stage_cogl_scanout_view (ClutterStageCogl *stage_cogl, onscreen = COGL_ONSCREEN (framebuffer); - frame_info = cogl_frame_info_new (); + frame_info = cogl_frame_info_new (priv->global_frame_counter); + priv->global_frame_counter++; cogl_onscreen_direct_scanout (onscreen, scanout, frame_info); } @@ -821,6 +844,7 @@ clutter_stage_window_iface_init (ClutterStageWindowInterface *iface) iface->resize = clutter_stage_cogl_resize; iface->show = clutter_stage_cogl_show; iface->hide = clutter_stage_cogl_hide; + iface->get_frame_counter = clutter_stage_cogl_get_frame_counter; iface->schedule_update = clutter_stage_cogl_schedule_update; iface->get_update_time = clutter_stage_cogl_get_update_time; iface->clear_update_time = clutter_stage_cogl_clear_update_time; diff --git a/cogl/cogl/cogl-frame-info-private.h b/cogl/cogl/cogl-frame-info-private.h index 585e2c2e7..13d856175 100644 --- a/cogl/cogl/cogl-frame-info-private.h +++ b/cogl/cogl/cogl-frame-info-private.h @@ -46,6 +46,6 @@ struct _CoglFrameInfo }; COGL_EXPORT -CoglFrameInfo *cogl_frame_info_new (void); +CoglFrameInfo *cogl_frame_info_new (int64_t global_frame_counter); #endif /* __COGL_FRAME_INFO_PRIVATE_H */ diff --git a/cogl/cogl/cogl-frame-info.c b/cogl/cogl/cogl-frame-info.c index a6e9f3260..b5da21110 100644 --- a/cogl/cogl/cogl-frame-info.c +++ b/cogl/cogl/cogl-frame-info.c @@ -39,11 +39,12 @@ COGL_OBJECT_DEFINE (FrameInfo, frame_info); COGL_GTYPE_DEFINE_CLASS (FrameInfo, frame_info); CoglFrameInfo * -cogl_frame_info_new (void) +cogl_frame_info_new (int64_t global_frame_counter) { CoglFrameInfo *info; info = g_slice_new0 (CoglFrameInfo); + info->global_frame_counter = global_frame_counter; return _cogl_frame_info_object_new (info); } diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 8d50a828d..255a4ce72 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -224,7 +224,6 @@ struct _MetaRendererNative CoglClosure *swap_notify_idle; - int64_t frame_counter; gboolean pending_unset_disabled_crtcs; GList *power_save_page_flip_onscreens; @@ -2105,9 +2104,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, 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; - update_secondary_gpu_state_pre_swap_buffers (onscreen); parent_vtable->onscreen_swap_buffers_with_damage (onscreen, @@ -2148,7 +2144,8 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, ensure_crtc_modes (onscreen, kms_update); - onscreen_native->pending_queue_swap_notify_frame_count = renderer_native->frame_counter; + onscreen_native->pending_queue_swap_notify_frame_count = + cogl_frame_info_get_global_frame_counter (frame_info); meta_onscreen_native_flip_crtcs (onscreen, kms_update); /* @@ -2320,9 +2317,6 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen, wait_for_pending_flips (onscreen); - frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos); - frame_info->global_frame_counter = renderer_native->frame_counter; - renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native, render_gpu); @@ -2334,7 +2328,7 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen, ensure_crtc_modes (onscreen, kms_update); onscreen_native->pending_queue_swap_notify_frame_count = - renderer_native->frame_counter; + cogl_frame_info_get_global_frame_counter (frame_info); meta_onscreen_native_flip_crtcs (onscreen, kms_update); meta_kms_post_pending_update_sync (kms); @@ -3309,8 +3303,6 @@ meta_renderer_native_finish_frame (MetaRendererNative *renderer_native) MetaKms *kms = meta_backend_native_get_kms (backend_native); MetaKmsUpdate *kms_update = NULL; - renderer_native->frame_counter++; - if (renderer_native->pending_unset_disabled_crtcs) { GList *l; @@ -3350,12 +3342,6 @@ meta_renderer_native_finish_frame (MetaRendererNative *renderer_native) } } -int64_t -meta_renderer_native_get_frame_counter (MetaRendererNative *renderer_native) -{ - return renderer_native->frame_counter; -} - static gboolean create_secondary_egl_config (MetaEgl *egl, MetaRendererNativeMode mode, diff --git a/src/backends/native/meta-renderer-native.h b/src/backends/native/meta-renderer-native.h index 3ea2c9cc0..91afca766 100644 --- a/src/backends/native/meta-renderer-native.h +++ b/src/backends/native/meta-renderer-native.h @@ -55,8 +55,6 @@ MetaGpuKms * meta_renderer_native_get_primary_gpu (MetaRendererNative *renderer_ void meta_renderer_native_finish_frame (MetaRendererNative *renderer_native); -int64_t meta_renderer_native_get_frame_counter (MetaRendererNative *renderer_native); - gboolean meta_onscreen_native_is_buffer_scanout_compatible (CoglOnscreen *onscreen, uint32_t drm_format, uint64_t drm_modifier, diff --git a/src/backends/native/meta-stage-native.c b/src/backends/native/meta-stage-native.c index 9a3d11cb9..4b0551d91 100644 --- a/src/backends/native/meta-stage-native.c +++ b/src/backends/native/meta-stage-native.c @@ -186,16 +186,6 @@ meta_stage_native_get_views (ClutterStageWindow *stage_window) return meta_renderer_get_views (renderer); } -static int64_t -meta_stage_native_get_frame_counter (ClutterStageWindow *stage_window) -{ - MetaBackend *backend = meta_get_backend (); - MetaRenderer *renderer = meta_backend_get_renderer (backend); - MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer); - - return meta_renderer_native_get_frame_counter (renderer_native); -} - static void meta_stage_native_finish_frame (ClutterStageWindow *stage_window) { @@ -225,6 +215,5 @@ clutter_stage_window_iface_init (ClutterStageWindowInterface *iface) iface->can_clip_redraws = meta_stage_native_can_clip_redraws; iface->get_geometry = meta_stage_native_get_geometry; iface->get_views = meta_stage_native_get_views; - iface->get_frame_counter = meta_stage_native_get_frame_counter; iface->finish_frame = meta_stage_native_finish_frame; } diff --git a/src/backends/x11/meta-stage-x11.c b/src/backends/x11/meta-stage-x11.c index c5ed60b16..2367454ed 100644 --- a/src/backends/x11/meta-stage-x11.c +++ b/src/backends/x11/meta-stage-x11.c @@ -480,14 +480,6 @@ meta_stage_x11_get_views (ClutterStageWindow *stage_window) return meta_renderer_get_views (renderer); } -static int64_t -meta_stage_x11_get_frame_counter (ClutterStageWindow *stage_window) -{ - MetaStageX11 *stage_x11 = META_STAGE_X11 (stage_window); - - return cogl_onscreen_get_frame_counter (stage_x11->onscreen); -} - static void meta_stage_x11_finalize (GObject *object) { @@ -548,7 +540,6 @@ clutter_stage_window_iface_init (ClutterStageWindowInterface *iface) iface->unrealize = meta_stage_x11_unrealize; iface->can_clip_redraws = meta_stage_x11_can_clip_redraws; iface->get_views = meta_stage_x11_get_views; - iface->get_frame_counter = meta_stage_x11_get_frame_counter; } static inline void diff --git a/src/backends/x11/nested/meta-stage-x11-nested.c b/src/backends/x11/nested/meta-stage-x11-nested.c index 00683a569..be0ece2fa 100644 --- a/src/backends/x11/nested/meta-stage-x11-nested.c +++ b/src/backends/x11/nested/meta-stage-x11-nested.c @@ -194,7 +194,7 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window) draw_view (stage_nested, renderer_view, texture); } - frame_info = cogl_frame_info_new (); + frame_info = cogl_frame_info_new (0); cogl_onscreen_swap_buffers (stage_x11->onscreen, frame_info); }