wayland: Discard stale presentation feedbacks in _present_feedbacks
Any feedbacks for the same stage view but older frames than the one being presented are discarded. Since we now use per-frame lists of feedbacks, there can no longer be any stale feedbacks where we previously discarded them, so remove that dead code. v2: * Use ClutterFrameInfo::frame_count. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4306>
This commit is contained in:

committed by
Michel Dänzer

parent
903f6281f9
commit
1837c1b299
@@ -116,20 +116,6 @@ meta_wayland_presentation_time_ensure_feedbacks (MetaWaylandPresentationTime *pr
|
|||||||
ClutterStageView *stage_view,
|
ClutterStageView *stage_view,
|
||||||
int64_t view_frame_counter);
|
int64_t view_frame_counter);
|
||||||
|
|
||||||
static void
|
|
||||||
discard_non_cursor_feedbacks (struct wl_list *feedbacks)
|
|
||||||
{
|
|
||||||
MetaWaylandPresentationFeedback *feedback, *next;
|
|
||||||
|
|
||||||
wl_list_for_each_safe (feedback, next, feedbacks, link)
|
|
||||||
{
|
|
||||||
if (META_IS_WAYLAND_CURSOR_SURFACE (feedback->surface->role))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
meta_wayland_presentation_feedback_discard (feedback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_after_paint (ClutterStage *stage,
|
on_after_paint (ClutterStage *stage,
|
||||||
ClutterStageView *stage_view,
|
ClutterStageView *stage_view,
|
||||||
@@ -139,20 +125,9 @@ on_after_paint (ClutterStage *stage,
|
|||||||
struct wl_list *feedbacks;
|
struct wl_list *feedbacks;
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
/*
|
|
||||||
* We just painted this stage view, which means that all non-cursor feedbacks
|
|
||||||
* that didn't fire (e.g. due to page flip failing) are now obsolete and
|
|
||||||
* should be discarded.
|
|
||||||
*
|
|
||||||
* Cursor feedbacks have a similar mechanism done separately, mainly because
|
|
||||||
* they are painted earlier, in prepare_frame(). This means that the feedbacks
|
|
||||||
* list currently contains stale non-cursor feedbacks and up-to-date cursor
|
|
||||||
* feedbacks.
|
|
||||||
*/
|
|
||||||
feedbacks =
|
feedbacks =
|
||||||
meta_wayland_presentation_time_ensure_feedbacks (&compositor->presentation_time,
|
meta_wayland_presentation_time_ensure_feedbacks (&compositor->presentation_time,
|
||||||
stage_view, frame->frame_count);
|
stage_view, frame->frame_count);
|
||||||
discard_non_cursor_feedbacks (feedbacks);
|
|
||||||
|
|
||||||
l = compositor->presentation_time.feedback_surfaces;
|
l = compositor->presentation_time.feedback_surfaces;
|
||||||
while (l)
|
while (l)
|
||||||
@@ -453,27 +428,39 @@ meta_wayland_presentation_time_present_feedbacks (MetaWaylandCompositor *composi
|
|||||||
ClutterStageView *stage_view,
|
ClutterStageView *stage_view,
|
||||||
ClutterFrameInfo *frame_info)
|
ClutterFrameInfo *frame_info)
|
||||||
{
|
{
|
||||||
MetaWaylandPresentationFeedback *feedback, *next;
|
|
||||||
struct wl_list *feedbacks;
|
struct wl_list *feedbacks;
|
||||||
MetaWaylandOutput *output;
|
|
||||||
GHashTable *hash_table;
|
GHashTable *hash_table;
|
||||||
|
GHashTableIter iter;
|
||||||
|
int64_t *key;
|
||||||
|
|
||||||
hash_table = g_hash_table_lookup (compositor->presentation_time.feedbacks,
|
hash_table = g_hash_table_lookup (compositor->presentation_time.feedbacks,
|
||||||
stage_view);
|
stage_view);
|
||||||
if (!hash_table)
|
if (!hash_table)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
feedbacks = g_hash_table_lookup (hash_table, &frame_info->view_frame_counter);
|
g_hash_table_iter_init (&iter, hash_table);
|
||||||
if (!feedbacks)
|
while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *)&feedbacks))
|
||||||
return;
|
|
||||||
|
|
||||||
output = get_output_for_stage_view (compositor, stage_view);
|
|
||||||
|
|
||||||
wl_list_for_each_safe (feedback, next, feedbacks, link)
|
|
||||||
{
|
{
|
||||||
meta_wayland_presentation_feedback_present (feedback,
|
MetaWaylandPresentationFeedback *feedback, *next;
|
||||||
frame_info,
|
|
||||||
output);
|
if (*key > frame_info->view_frame_counter)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (*key == frame_info->view_frame_counter)
|
||||||
|
{
|
||||||
|
MetaWaylandOutput *output;
|
||||||
|
|
||||||
|
output = get_output_for_stage_view (compositor, stage_view);
|
||||||
|
wl_list_for_each_safe (feedback, next, feedbacks, link)
|
||||||
|
{
|
||||||
|
meta_wayland_presentation_feedback_present (feedback,
|
||||||
|
frame_info,
|
||||||
|
output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This discards feedbacks for older frames which were never presented */
|
||||||
|
g_hash_table_iter_remove (&iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_remove (hash_table, &frame_info->view_frame_counter);
|
g_hash_table_remove (hash_table, &frame_info->view_frame_counter);
|
||||||
@@ -485,28 +472,19 @@ meta_wayland_presentation_time_cursor_painted (MetaWaylandPresentationTime *pres
|
|||||||
int64_t view_frame_counter,
|
int64_t view_frame_counter,
|
||||||
MetaWaylandCursorSurface *cursor_surface)
|
MetaWaylandCursorSurface *cursor_surface)
|
||||||
{
|
{
|
||||||
struct wl_list *feedbacks;
|
|
||||||
MetaWaylandPresentationFeedback *feedback, *next;
|
|
||||||
MetaWaylandSurfaceRole *role = META_WAYLAND_SURFACE_ROLE (cursor_surface);
|
MetaWaylandSurfaceRole *role = META_WAYLAND_SURFACE_ROLE (cursor_surface);
|
||||||
MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (role);
|
MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (role);
|
||||||
|
struct wl_list *feedbacks;
|
||||||
|
|
||||||
|
if (wl_list_empty (&surface->presentation_time.feedback_list))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Add new feedbacks. */
|
||||||
feedbacks =
|
feedbacks =
|
||||||
meta_wayland_presentation_time_ensure_feedbacks (presentation_time,
|
meta_wayland_presentation_time_ensure_feedbacks (presentation_time,
|
||||||
stage_view,
|
stage_view,
|
||||||
view_frame_counter);
|
view_frame_counter);
|
||||||
|
wl_list_insert_list (feedbacks,
|
||||||
/* Discard previous feedbacks for this cursor as now it has gone stale. */
|
&surface->presentation_time.feedback_list);
|
||||||
wl_list_for_each_safe (feedback, next, feedbacks, link)
|
wl_list_init (&surface->presentation_time.feedback_list);
|
||||||
{
|
|
||||||
if (feedback->surface->role == role)
|
|
||||||
meta_wayland_presentation_feedback_discard (feedback);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add new feedbacks. */
|
|
||||||
if (!wl_list_empty (&surface->presentation_time.feedback_list))
|
|
||||||
{
|
|
||||||
wl_list_insert_list (feedbacks,
|
|
||||||
&surface->presentation_time.feedback_list);
|
|
||||||
wl_list_init (&surface->presentation_time.feedback_list);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user