presentation_feedback: add the sampled state

This commit is contained in:
Ivan Molodetskikh 2019-08-17 21:57:47 -07:00 committed by Simon Ser
parent c808613287
commit 020a33e057
2 changed files with 26 additions and 4 deletions

View File

@ -31,9 +31,15 @@ struct wlr_presentation_feedback {
struct wl_resource *resource; struct wl_resource *resource;
struct wlr_presentation *presentation; struct wlr_presentation *presentation;
struct wlr_surface *surface; struct wlr_surface *surface;
bool committed;
struct wl_list link; // wlr_presentation::feedbacks struct wl_list link; // wlr_presentation::feedbacks
// The surface contents were committed.
bool committed;
// The surface contents were sampled by the compositor and are to be
// presented on the next flip. Can become true only after committed becomes
// true.
bool sampled;
struct wl_listener surface_commit; struct wl_listener surface_commit;
struct wl_listener surface_destroy; struct wl_listener surface_destroy;
}; };
@ -55,5 +61,7 @@ void wlr_presentation_destroy(struct wlr_presentation *presentation);
void wlr_presentation_send_surface_presented( void wlr_presentation_send_surface_presented(
struct wlr_presentation *presentation, struct wlr_surface *surface, struct wlr_presentation *presentation, struct wlr_surface *surface,
struct wlr_presentation_event *event); struct wlr_presentation_event *event);
void wlr_presentation_surface_sampled(
struct wlr_presentation *presentation, struct wlr_surface *surface);
#endif #endif

View File

@ -61,8 +61,10 @@ static void feedback_handle_surface_commit(struct wl_listener *listener,
wl_container_of(listener, feedback, surface_commit); wl_container_of(listener, feedback, surface_commit);
if (feedback->committed) { if (feedback->committed) {
if (!feedback->sampled) {
// The content update has been superseded // The content update has been superseded
feedback_send_discarded(feedback); feedback_send_discarded(feedback);
}
} else { } else {
feedback->committed = true; feedback->committed = true;
} }
@ -216,8 +218,20 @@ void wlr_presentation_send_surface_presented(
struct wlr_presentation_feedback *feedback, *feedback_tmp; struct wlr_presentation_feedback *feedback, *feedback_tmp;
wl_list_for_each_safe(feedback, feedback_tmp, wl_list_for_each_safe(feedback, feedback_tmp,
&presentation->feedbacks, link) { &presentation->feedbacks, link) {
if (feedback->surface == surface && feedback->committed) { if (feedback->surface == surface && feedback->sampled) {
feedback_send_presented(feedback, event); feedback_send_presented(feedback, event);
} }
} }
} }
void wlr_presentation_surface_sampled(
struct wlr_presentation *presentation, struct wlr_surface *surface) {
// TODO: maybe use a hashtable to optimize this function
struct wlr_presentation_feedback *feedback, *feedback_tmp;
wl_list_for_each_safe(feedback, feedback_tmp,
&presentation->feedbacks, link) {
if (feedback->surface == surface && feedback->committed) {
feedback->sampled = true;
}
}
}