summaryrefslogtreecommitdiffstats
path: root/video/out
diff options
context:
space:
mode:
authorDudemanguy <random342@airmail.cc>2022-04-06 23:01:21 -0500
committerDudemanguy <random342@airmail.cc>2022-04-11 18:14:22 +0000
commit2c2a856f2512843d12931a1f6f5b15ea76db8502 (patch)
tree075f6fd3e2d1b44b01b86861bc03f4a56ae90137 /video/out
parent5edc49adc96b45479383483a0d53db7f48d1e362 (diff)
downloadmpv-2c2a856f2512843d12931a1f6f5b15ea76db8502.tar.bz2
mpv-2c2a856f2512843d12931a1f6f5b15ea76db8502.tar.xz
wayland: unify visibility checking code
A bit of a personal pet peeve. vulkan, opengl, and wlshm all had different methods for doing wayland's "check for visibility before drawing" thing. The specific backend doesn't matter in this case and the logic should all be shared. Additionally, the external swapchain that the opengl code on wayland uses is done away with and it instead copies vulkan by using a param. This keeps things looking more uniform across backends and also makes it easier to extend to other platforms (see the next couple of commits).
Diffstat (limited to 'video/out')
-rw-r--r--video/out/opengl/context.c11
-rw-r--r--video/out/opengl/context.h4
-rw-r--r--video/out/opengl/context_wayland.c22
-rw-r--r--video/out/vo_wlshm.c3
-rw-r--r--video/out/vulkan/context_wayland.c6
-rw-r--r--video/out/wayland_common.c8
-rw-r--r--video/out/wayland_common.h2
7 files changed, 33 insertions, 23 deletions
diff --git a/video/out/opengl/context.c b/video/out/opengl/context.c
index 7940faf2b9..377b678cde 100644
--- a/video/out/opengl/context.c
+++ b/video/out/opengl/context.c
@@ -223,6 +223,17 @@ int ra_gl_ctx_color_depth(struct ra_swapchain *sw)
bool ra_gl_ctx_start_frame(struct ra_swapchain *sw, struct ra_fbo *out_fbo)
{
struct priv *p = sw->priv;
+
+ bool visible = true;
+ if (p->params.check_visible)
+ visible = p->params.check_visible(sw->ctx);
+ if (!visible)
+ return false;
+
+ // If out_fbo is NULL, this was called from vo_gpu_next. Bail out.
+ if (out_fbo == NULL || !visible)
+ return visible;
+
if (!out_fbo)
return true;
*out_fbo = (struct ra_fbo) {
diff --git a/video/out/opengl/context.h b/video/out/opengl/context.h
index 222661ad83..19521ff54b 100644
--- a/video/out/opengl/context.h
+++ b/video/out/opengl/context.h
@@ -21,6 +21,10 @@ enum gles_mode ra_gl_ctx_get_glesmode(struct ra_ctx *ctx);
// clean them up)
struct ra_gl_ctx_params {
+ // For special contexts (i.e. wayland) that want to check visibility
+ // before drawing a frame.
+ bool (*check_visible)(struct ra_ctx *ctx);
+
// Set to the platform-specific function to swap buffers, like
// glXSwapBuffers, eglSwapBuffers etc. This will be called by
// ra_gl_ctx_swap_buffers. Required unless you either never call that
diff --git a/video/out/opengl/context_wayland.c b/video/out/opengl/context_wayland.c
index a7a8f4f3b4..98d702c386 100644
--- a/video/out/opengl/context_wayland.c
+++ b/video/out/opengl/context_wayland.c
@@ -54,19 +54,13 @@ static void resize(struct ra_ctx *ctx)
wl->vo->dheight = height;
}
-static bool wayland_egl_start_frame(struct ra_swapchain *sw, struct ra_fbo *out_fbo)
+static bool wayland_egl_check_visible(struct ra_ctx *ctx)
{
- struct ra_ctx *ctx = sw->ctx;
- struct vo_wayland_state *wl = ctx->vo->wl;
- bool render = !wl->hidden || wl->opts->disable_vsync;
- wl->frame_wait = true;
-
- return render ? ra_gl_ctx_start_frame(sw, out_fbo) : false;
+ return vo_wayland_check_visible(ctx->vo);
}
-static void wayland_egl_swap_buffers(struct ra_swapchain *sw)
+static void wayland_egl_swap_buffers(struct ra_ctx *ctx)
{
- struct ra_ctx *ctx = sw->ctx;
struct priv *p = ctx->priv;
struct vo_wayland_state *wl = ctx->vo->wl;
@@ -79,11 +73,6 @@ static void wayland_egl_swap_buffers(struct ra_swapchain *sw)
vo_wayland_sync_swap(wl);
}
-static const struct ra_swapchain_fns wayland_egl_swapchain = {
- .start_frame = wayland_egl_start_frame,
- .swap_buffers = wayland_egl_swap_buffers,
-};
-
static void wayland_egl_get_vsync(struct ra_ctx *ctx, struct vo_vsync_info *info)
{
struct vo_wayland_state *wl = ctx->vo->wl;
@@ -116,8 +105,9 @@ static bool egl_create_context(struct ra_ctx *ctx)
mpegl_load_functions(&p->gl, wl->log);
struct ra_gl_ctx_params params = {
- .external_swapchain = &wayland_egl_swapchain,
- .get_vsync = &wayland_egl_get_vsync,
+ .check_visible = wayland_egl_check_visible,
+ .swap_buffers = wayland_egl_swap_buffers,
+ .get_vsync = wayland_egl_get_vsync,
};
if (!ra_gl_ctx_init(ctx, &p->gl, params))
diff --git a/video/out/vo_wlshm.c b/video/out/vo_wlshm.c
index 4744e505f3..76abb9c6a0 100644
--- a/video/out/vo_wlshm.c
+++ b/video/out/vo_wlshm.c
@@ -218,9 +218,8 @@ static void draw_image(struct vo *vo, struct mp_image *src)
struct priv *p = vo->priv;
struct vo_wayland_state *wl = vo->wl;
struct buffer *buf;
- bool render = !wl->hidden || wl->opts->disable_vsync;
- wl->frame_wait = true;
+ bool render = vo_wayland_check_visible(vo);
if (!render)
return;
diff --git a/video/out/vulkan/context_wayland.c b/video/out/vulkan/context_wayland.c
index 0770004b4c..ab54789890 100644
--- a/video/out/vulkan/context_wayland.c
+++ b/video/out/vulkan/context_wayland.c
@@ -28,11 +28,7 @@ struct priv {
static bool wayland_vk_check_visible(struct ra_ctx *ctx)
{
- struct vo_wayland_state *wl = ctx->vo->wl;
- bool render = !wl->hidden || wl->opts->disable_vsync;
- wl->frame_wait = true;
-
- return render;
+ return vo_wayland_check_visible(ctx->vo);
}
static void wayland_vk_swap_buffers(struct ra_ctx *ctx)
diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c
index ee6b3e885d..eddaae952d 100644
--- a/video/out/wayland_common.c
+++ b/video/out/wayland_common.c
@@ -1562,6 +1562,14 @@ static void vo_wayland_dispatch_events(struct vo_wayland_state *wl, int nfds, in
}
/* Non-static */
+bool vo_wayland_check_visible(struct vo *vo)
+{
+ struct vo_wayland_state *wl = vo->wl;
+ bool render = !wl->hidden || wl->opts->disable_vsync;
+ wl->frame_wait = true;
+ return render;
+}
+
int vo_wayland_control(struct vo *vo, int *events, int request, void *arg)
{
struct vo_wayland_state *wl = vo->wl;
diff --git a/video/out/wayland_common.h b/video/out/wayland_common.h
index 14b5fdce09..faca1cd19b 100644
--- a/video/out/wayland_common.h
+++ b/video/out/wayland_common.h
@@ -125,6 +125,8 @@ struct vo_wayland_state {
uint32_t pointer_id;
};
+bool vo_wayland_check_visible(struct vo *vo);
+
int vo_wayland_control(struct vo *vo, int *events, int request, void *arg);
int vo_wayland_init(struct vo *vo);
int vo_wayland_reconfig(struct vo *vo);