From 63fa79e8b11c8398786627fcfebcd003ed1f98c8 Mon Sep 17 00:00:00 2001 From: Daniel van Vugt Date: Tue, 3 Sep 2019 15:20:17 +0800 Subject: [PATCH] clutter/cogl: Query pending_swaps instead of counting them Cogl was already counting them internally with the `pending_frame_infos` queue. This allows us to remove the `pending_swaps` counter. https://gitlab.gnome.org/GNOME/mutter/merge_requests/770 --- clutter/clutter/clutter-stage-view-private.h | 2 + clutter/clutter/clutter-stage-view.c | 16 ++++++ clutter/clutter/clutter-stage-window.c | 22 ++++++++ clutter/clutter/clutter-stage-window.h | 2 + clutter/clutter/cogl/clutter-stage-cogl.c | 55 ++++---------------- clutter/clutter/cogl/clutter-stage-cogl.h | 1 - cogl/cogl/cogl-onscreen.c | 6 +++ cogl/cogl/cogl-onscreen.h | 3 ++ 8 files changed, 61 insertions(+), 46 deletions(-) diff --git a/clutter/clutter/clutter-stage-view-private.h b/clutter/clutter/clutter-stage-view-private.h index 36c52e8ad6..0f027d0ff6 100644 --- a/clutter/clutter/clutter-stage-view-private.h +++ b/clutter/clutter/clutter-stage-view-private.h @@ -62,4 +62,6 @@ void clutter_stage_view_transform_rect_to_onscreen (ClutterStageView int dst_height, cairo_rectangle_int_t *dst_rect); +unsigned int clutter_stage_view_get_pending_swaps (ClutterStageView *view); + #endif /* __CLUTTER_STAGE_VIEW_PRIVATE_H__ */ diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c index efc9d67a85..56418b2fb2 100644 --- a/clutter/clutter/clutter-stage-view.c +++ b/clutter/clutter/clutter-stage-view.c @@ -144,6 +144,22 @@ clutter_stage_view_create_framebuffer_pipeline (CoglFramebuffer *framebuffer) return pipeline; } +unsigned int +clutter_stage_view_get_pending_swaps (ClutterStageView *view) +{ + CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view); + unsigned int pending_swaps = 0; + + if (cogl_is_onscreen (framebuffer)) + { + CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); + + pending_swaps = cogl_onscreen_get_pending_swaps (onscreen); + } + + return pending_swaps; +} + static void clutter_stage_view_ensure_offscreen_blit_pipeline (ClutterStageView *view) { diff --git a/clutter/clutter/clutter-stage-window.c b/clutter/clutter/clutter-stage-window.c index fe09aa1dba..0f1e126c65 100644 --- a/clutter/clutter/clutter-stage-window.c +++ b/clutter/clutter/clutter-stage-window.c @@ -5,6 +5,7 @@ #include "clutter-actor.h" #include "clutter-stage-window.h" #include "clutter-private.h" +#include "clutter-stage-view-private.h" /** * SECTION:clutter-stage-window @@ -221,3 +222,24 @@ _clutter_stage_window_get_frame_counter (ClutterStageWindow *window) else return 0; } + +unsigned int +clutter_stage_window_get_pending_swaps (ClutterStageWindow *stage_window) +{ + GList *l; + unsigned int max_pending_swaps = 0; + + for (l = _clutter_stage_window_get_views (stage_window); l; l = l->next) + { + ClutterStageView *view = l->data; + unsigned int pending_swaps = clutter_stage_view_get_pending_swaps (view); + + /* Different views (monitors) should complete their swaps in parallel + * so we only need to find the one with the highest number. + */ + if (pending_swaps > max_pending_swaps) + max_pending_swaps = pending_swaps; + } + + return max_pending_swaps; +} diff --git a/clutter/clutter/clutter-stage-window.h b/clutter/clutter/clutter-stage-window.h index 9f78ed25c2..218245a845 100644 --- a/clutter/clutter/clutter-stage-window.h +++ b/clutter/clutter/clutter-stage-window.h @@ -96,6 +96,8 @@ void _clutter_stage_window_finish_frame (ClutterStageWin int64_t _clutter_stage_window_get_frame_counter (ClutterStageWindow *window); +unsigned int clutter_stage_window_get_pending_swaps (ClutterStageWindow *window); + G_END_DECLS #endif /* __CLUTTER_STAGE_WINDOW_H__ */ diff --git a/clutter/clutter/cogl/clutter-stage-cogl.c b/clutter/clutter/cogl/clutter-stage-cogl.c index f7f71e6e16..edee329c06 100644 --- a/clutter/clutter/cogl/clutter-stage-cogl.c +++ b/clutter/clutter/cogl/clutter-stage-cogl.c @@ -92,22 +92,7 @@ _clutter_stage_cogl_presented (ClutterStageCogl *stage_cogl, CoglFrameEvent frame_event, ClutterFrameInfo *frame_info) { - - if (frame_event == COGL_FRAME_EVENT_SYNC) - { - /* Early versions of the swap_event implementation in Mesa - * deliver BufferSwapComplete event when not selected for, - * so if we get a swap event we aren't expecting, just ignore it. - * - * https://bugs.freedesktop.org/show_bug.cgi?id=27962 - * - * FIXME: This issue can be hidden inside Cogl so we shouldn't - * need to care about this bug here. - */ - if (stage_cogl->pending_swaps > 0) - stage_cogl->pending_swaps--; - } - else if (frame_event == COGL_FRAME_EVENT_COMPLETE) + if (frame_event == COGL_FRAME_EVENT_COMPLETE) { gint64 presentation_time_cogl = frame_info->presentation_time; @@ -240,7 +225,7 @@ clutter_stage_cogl_get_update_time (ClutterStageWindow *stage_window) { ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); - if (stage_cogl->pending_swaps) + if (clutter_stage_window_get_pending_swaps (stage_window)) return -1; /* in the future, indefinite */ return stage_cogl->update_time; @@ -355,7 +340,7 @@ paint_damage_region (ClutterStageWindow *stage_window, cogl_framebuffer_pop_matrix (framebuffer); } -static gboolean +static void swap_framebuffer (ClutterStageWindow *stage_window, ClutterStageView *view, cairo_region_t *swap_region, @@ -392,8 +377,6 @@ swap_framebuffer (ClutterStageWindow *stage_window, cogl_onscreen_swap_region (onscreen, damage, n_rects); - - return FALSE; } else { @@ -402,8 +385,6 @@ swap_framebuffer (ClutterStageWindow *stage_window, cogl_onscreen_swap_buffers_with_damage (onscreen, damage, n_rects); - - return TRUE; } } else @@ -411,8 +392,6 @@ swap_framebuffer (ClutterStageWindow *stage_window, CLUTTER_NOTE (BACKEND, "cogl_framebuffer_finish (framebuffer: %p)", framebuffer); cogl_framebuffer_finish (framebuffer); - - return FALSE; } } @@ -539,7 +518,7 @@ is_buffer_age_enabled (void) cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE); } -static gboolean +static void clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window, ClutterStageView *view) { @@ -562,7 +541,6 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window, float fb_scale; int fb_width, fb_height; int buffer_age = 0; - gboolean res; clutter_stage_view_get_layout (view, &view_rect); fb_scale = clutter_stage_view_get_scale (view); @@ -629,7 +607,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window, redraw_clip = cairo_region_create_rectangle (&view_rect); } - g_return_val_if_fail (!cairo_region_is_empty (fb_clip_region), FALSE); + g_return_if_fail (!cairo_region_is_empty (fb_clip_region)); swap_with_damage = FALSE; if (has_buffer_age) @@ -730,14 +708,12 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window, cairo_region_destroy (queued_redraw_clip); } - res = swap_framebuffer (stage_window, - view, - swap_region, - swap_with_damage); + swap_framebuffer (stage_window, + view, + swap_region, + swap_with_damage); cairo_region_destroy (swap_region); - - return res; } static void @@ -758,7 +734,6 @@ static void clutter_stage_cogl_redraw (ClutterStageWindow *stage_window) { ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); - gboolean swap_event = FALSE; GList *l; COGL_TRACE_BEGIN (ClutterStageCoglRedraw, "Paint (Cogl Redraw)"); @@ -777,11 +752,10 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window) clutter_stage_cogl_scanout_view (stage_cogl, view, scanout); - swap_event = TRUE; } else { - swap_event |= clutter_stage_cogl_redraw_view (stage_window, view); + clutter_stage_cogl_redraw_view (stage_window, view); } } @@ -789,15 +763,6 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window) _clutter_stage_window_finish_frame (stage_window); - if (swap_event) - { - /* If we have swap buffer events then cogl_onscreen_swap_buffers - * will return immediately and we need to track that there is a - * swap in progress... */ - if (clutter_feature_available (CLUTTER_FEATURE_SWAP_EVENTS)) - stage_cogl->pending_swaps++; - } - stage_cogl->frame_count++; COGL_TRACE_END (ClutterStageCoglRedraw); diff --git a/clutter/clutter/cogl/clutter-stage-cogl.h b/clutter/clutter/cogl/clutter-stage-cogl.h index 1eaa02e8fe..7f500be660 100644 --- a/clutter/clutter/cogl/clutter-stage-cogl.h +++ b/clutter/clutter/cogl/clutter-stage-cogl.h @@ -43,7 +43,6 @@ struct _ClutterStageCogl ClutterBackend *backend; float refresh_rate; - int pending_swaps; gint64 last_presentation_time; gint64 update_time; diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c index 892a0af3b4..5f9607c5c4 100644 --- a/cogl/cogl/cogl-onscreen.c +++ b/cogl/cogl/cogl-onscreen.c @@ -606,3 +606,9 @@ cogl_onscreen_get_frame_counter (CoglOnscreen *onscreen) { return onscreen->frame_counter; } + +unsigned int +cogl_onscreen_get_pending_swaps (CoglOnscreen *onscreen) +{ + return onscreen->pending_frame_infos.length; +} diff --git a/cogl/cogl/cogl-onscreen.h b/cogl/cogl/cogl-onscreen.h index 8454703501..7a39526dcd 100644 --- a/cogl/cogl/cogl-onscreen.h +++ b/cogl/cogl/cogl-onscreen.h @@ -774,6 +774,9 @@ cogl_is_onscreen (void *object); COGL_EXPORT int64_t cogl_onscreen_get_frame_counter (CoglOnscreen *onscreen); +COGL_EXPORT unsigned int +cogl_onscreen_get_pending_swaps (CoglOnscreen *onscreen); + G_END_DECLS #endif /* __COGL_ONSCREEN_H */ -- GitLab