wayland: don't rely on presentation discarded

When using presentation time, we have to be sure to update the ust when
no presentation events are received to make sure playback is still
smooth and in sync. Part of the recent presentation time refactor was to
use the presentation discarded event to signal that the window is
hidden. Evidently, this doesn't work the same everywhere for whatever
reason (drivers?? hardware??) and at least one user experienced issues
with playback getting out of sync since (presumably) the discarded event
didn't occur when hiding the window. Instead, let's just go back to the
old way of checking if the last_ust is equal to the ust value of the
last member in the wayland sync queue. Fixes #8010.
This commit is contained in:
Dudemanguy 2020-08-16 16:29:00 -05:00
parent e9cde72536
commit 486516f723
4 changed files with 4 additions and 10 deletions

View File

@ -77,13 +77,10 @@ static void feedback_presented(void *data, struct wp_presentation_feedback *fbac
wl->sync[index].ust = sec * 1000000LL + (uint64_t) tv_nsec / 1000;
wl->sync[index].msc = (uint64_t) seq_lo + ((uint64_t) seq_hi << 32);
wl->sync[index].filled = true;
wl->presentation_discarded = false;
}
static void feedback_discarded(void *data, struct wp_presentation_feedback *fback)
{
struct vo_wayland_state *wl = data;
wl->presentation_discarded = true;
}
static const struct wp_presentation_feedback_listener feedback_listener = {

View File

@ -67,13 +67,10 @@ static void feedback_presented(void *data, struct wp_presentation_feedback *fbac
wl->sync[index].ust = sec * 1000000LL + (uint64_t) tv_nsec / 1000;
wl->sync[index].msc = (uint64_t) seq_lo + ((uint64_t) seq_hi << 32);
wl->sync[index].filled = true;
wl->presentation_discarded = false;
}
static void feedback_discarded(void *data, struct wp_presentation_feedback *fback)
{
struct vo_wayland_state *wl = data;
wl->presentation_discarded = true;
}
static const struct wp_presentation_feedback_listener feedback_listener = {

View File

@ -1607,9 +1607,10 @@ void wayland_sync_swap(struct vo_wayland_state *wl)
wl->last_skipped_vsyncs = 0;
// If the presentation event was discarded, update the values based on
// the difference in mp_time.
if (wl->presentation_discarded) {
// If these are the same, presentation feedback has not been received.
// This will happen if the window is obscured/hidden in some way. Update
// the values based on the difference in mp_time.
if (wl->sync[index].ust == wl->last_ust && wl->last_ust) {
wl->sync[index].ust += mp_time - wl->sync[index].last_mp_time;
wl->sync[index].msc += 1;
wl->sync[index].sbc += 1;

View File

@ -107,7 +107,6 @@ struct vo_wayland_state {
/* Presentation Feedback */
struct vo_wayland_sync *sync;
int sync_size;
bool presentation_discarded;
int64_t user_sbc;
int64_t last_ust;
int64_t last_msc;