From a743fef837bcab206b1e576db7e7a64b02890449 Mon Sep 17 00:00:00 2001 From: Rostislav Pehlivanov Date: Tue, 5 Dec 2017 08:26:24 +0000 Subject: vo: add support for externally driven renderloop and make wayland use it Fixes display-sync (though if you change virtual desktops you'll need to seek to re-enable display-sync) partially under wayland. As an advantage, rendering is completely disabled if you change desktops or alt+tab so you lose no performance if you leave mpv running elsewhere as long as it isn't visible. This could also be ported to other VOs which supports it. --- video/out/wayland_common.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'video/out/wayland_common.c') diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index a0e734703b..19adf01df0 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -767,6 +767,9 @@ static void frame_callback(void *data, struct wl_callback *callback, uint32_t ti wl->frame_callback = wl_surface_frame(wl->surface); wl_callback_add_listener(wl->frame_callback, &frame_listener, wl); + + if (!vo_render_frame_external(wl->vo)) + wl_surface_commit(wl->surface); } static const struct wl_callback_listener frame_listener = { @@ -785,6 +788,7 @@ static void registry_handle_add(void *data, struct wl_registry *reg, uint32_t id wl->surface = wl_compositor_create_surface(wl->compositor); wl->cursor_surface = wl_compositor_create_surface(wl->compositor); wl_surface_add_listener(wl->surface, &surface_listener, wl); + vo_enable_external_renderloop(wl->vo); wl->frame_callback = wl_surface_frame(wl->surface); wl_callback_add_listener(wl->frame_callback, &frame_listener, wl); } @@ -1295,6 +1299,17 @@ int vo_wayland_control(struct vo *vo, int *events, int request, void *arg) *(char ***)arg = get_displays_spanned(wl); return VO_TRUE; } + case VOCTRL_PAUSE: { + wl_callback_destroy(wl->frame_callback); + wl->frame_callback = NULL; + vo_disable_external_renderloop(wl->vo); + return VO_TRUE; + } + case VOCTRL_RESUME: { + vo_enable_external_renderloop(wl->vo); + frame_callback(wl, NULL, 0); + return VO_TRUE; + } case VOCTRL_GET_UNFS_WINDOW_SIZE: { int *s = arg; s[0] = mp_rect_w(wl->geometry)*wl->scaling; -- cgit v1.2.3