diff --git a/clutter/clutter/clutter-stage-view-private.h b/clutter/clutter/clutter-stage-view-private.h index 36c52e8ad61ab956d83addfcc6fd1d53b36b6d90..0f027d0ff68db1d7e578486206b9cc2c10901895 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 efc9d67a8544b663fc22ba3b4234eccd54fbd419..56418b2fb225d88860d210795e438247ad9da297 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 fe09aa1dba11481142e21d23ba6451db28f1362d..0f1e126c65245d478ea1b944d3fa3874377db9b6 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 9f78ed25c2f56cf885d6a8a019839286ccbccac6..218245a84553d09eef87bf94322b82b561b84f55 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 f7f71e6e169b0c41e5bd6d4d8176083bd1daa938..edee329c06bf30ff306e5d111cdd37af66f860b1 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 1eaa02e8fe3923a3aa8a65b38a7271732dcb3f48..7f500be660869b77c159c65dd17499dd44f060e3 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 892a0af3b46cd38fc61cd3df3a3f5211595da3c9..5f9607c5c4d149d6e323d25458111a7541ecdf76 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 8454703501730c9667d54c2af0e9603a610b4777..7a39526dcd126be198f2de4336fd4e1a3d135a19 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 */