summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/out/opengl/context_wayland.c3
-rw-r--r--video/out/vulkan/context_wayland.c3
-rw-r--r--video/out/wayland_common.c31
-rw-r--r--video/out/wayland_common.h3
4 files changed, 10 insertions, 30 deletions
diff --git a/video/out/opengl/context_wayland.c b/video/out/opengl/context_wayland.c
index f951b9466a..49835668f0 100644
--- a/video/out/opengl/context_wayland.c
+++ b/video/out/opengl/context_wayland.c
@@ -92,7 +92,6 @@ static void feedback_presented(void *data, struct wp_presentation_feedback *fbac
wl->sync[index].sbc = wl->user_sbc;
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].refresh_usec = (uint64_t)refresh_nsec/1000;
wl->sync[index].filled = true;
}
@@ -153,7 +152,7 @@ static void wayland_egl_swap_buffers(struct ra_ctx *ctx)
static void wayland_egl_get_vsync(struct ra_ctx *ctx, struct vo_vsync_info *info)
{
struct vo_wayland_state *wl = ctx->vo->wl;
- if (wl->presentation && !wl->hidden) {
+ if (wl->presentation) {
info->vsync_duration = wl->vsync_duration;
info->skipped_vsyncs = wl->last_skipped_vsyncs;
info->last_queue_display_time = wl->last_queue_display_time;
diff --git a/video/out/vulkan/context_wayland.c b/video/out/vulkan/context_wayland.c
index 83d4617057..ffe1e0facc 100644
--- a/video/out/vulkan/context_wayland.c
+++ b/video/out/vulkan/context_wayland.c
@@ -82,7 +82,6 @@ static void feedback_presented(void *data, struct wp_presentation_feedback *fbac
wl->sync[index].sbc = wl->user_sbc;
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].refresh_usec = (uint64_t)refresh_nsec/1000;
wl->sync[index].filled = true;
}
@@ -122,7 +121,7 @@ static void wayland_vk_swap_buffers(struct ra_ctx *ctx)
static void wayland_vk_get_vsync(struct ra_ctx *ctx, struct vo_vsync_info *info)
{
struct vo_wayland_state *wl = ctx->vo->wl;
- if (wl->presentation && !wl->hidden) {
+ if (wl->presentation) {
info->vsync_duration = wl->vsync_duration;
info->skipped_vsyncs = wl->last_skipped_vsyncs;
info->last_queue_display_time = wl->last_queue_display_time;
diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c
index 55a4c36f1e..70e72b491c 100644
--- a/video/out/wayland_common.c
+++ b/video/out/wayland_common.c
@@ -1581,16 +1581,19 @@ void queue_new_sync(struct vo_wayland_state *wl)
void wayland_sync_swap(struct vo_wayland_state *wl)
{
int index = wl->sync_size - 1;
+ int64_t mp_time = mp_time_us();
wl->last_skipped_vsyncs = 0;
- // If these are the same (can happen if a frame takes too long), update
- // the ust/msc/sbc based on when the next frame is expected to arrive.
+ // 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 += wl->sync[index].refresh_usec;
+ wl->sync[index].ust += mp_time - wl->sync[index].last_mp_time;
wl->sync[index].msc += 1;
wl->sync[index].sbc += 1;
}
+ wl->sync[index].last_mp_time = mp_time;
int64_t ust_passed = wl->sync[index].ust ? wl->sync[index].ust - wl->last_ust: 0;
wl->last_ust = wl->sync[index].ust;
@@ -1609,7 +1612,7 @@ void wayland_sync_swap(struct vo_wayland_state *wl)
}
uint64_t now_monotonic = ts.tv_sec * 1000000LL + ts.tv_nsec / 1000;
- uint64_t ust_mp_time = mp_time_us() - (now_monotonic - wl->sync[index].ust);
+ uint64_t ust_mp_time = mp_time - (now_monotonic - wl->sync[index].ust);
wl->last_sbc_mp_time = ust_mp_time;
}
@@ -1650,26 +1653,6 @@ void vo_wayland_wait_frame(struct vo_wayland_state *wl)
wl_display_read_events(wl->display);
wl_display_roundtrip(wl->display);
}
-
- if (wl->frame_wait) {
- if (!wl->hidden) {
- wl->timeout_count += 1;
- } else {
- wl->timeout_count = 0;
- }
- } else {
- if (wl->hidden) {
- wl->timeout_count -= 1;
- } else {
- wl->timeout_count = 0;
- }
- }
-
- if (wl->timeout_count > wl->current_output->refresh_rate) {
- wl->hidden = true;
- } else if (wl->timeout_count < -1*wl->current_output->refresh_rate) {
- wl->hidden = false;
- }
}
void vo_wayland_wait_events(struct vo *vo, int64_t until_time_us)
diff --git a/video/out/wayland_common.h b/video/out/wayland_common.h
index 0c27472e3f..4d26b0130d 100644
--- a/video/out/wayland_common.h
+++ b/video/out/wayland_common.h
@@ -35,7 +35,7 @@ struct vo_wayland_sync {
int64_t ust;
int64_t msc;
int64_t sbc;
- int64_t refresh_usec;
+ int64_t last_mp_time;
bool filled;
};
@@ -75,7 +75,6 @@ struct vo_wayland_state {
int reduced_height;
bool configured;
bool frame_wait;
- bool hidden;
int timeout_count;
int wakeup_pipe[2];
int pending_vo_events;