summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/out/gl_common.h4
-rw-r--r--video/out/gl_video.c7
-rw-r--r--video/out/gl_video.h1
-rw-r--r--video/out/gl_wayland.c7
-rw-r--r--video/out/vo_opengl.c12
5 files changed, 31 insertions, 0 deletions
diff --git a/video/out/gl_common.h b/video/out/gl_common.h
index 1cb3a5c441..1d33682f3e 100644
--- a/video/out/gl_common.h
+++ b/video/out/gl_common.h
@@ -109,6 +109,10 @@ typedef struct MPGLContext {
void (*register_resize_callback)(struct vo *vo,
void (*cb)(struct vo *vo, int w, int h));
+ // Optional activity state of context.
+ // If false, OpenGL renderers should not draw anything.
+ bool (*is_active)(struct MPGLContext *);
+
// For free use by the backend.
void *priv;
} MPGLContext;
diff --git a/video/out/gl_video.c b/video/out/gl_video.c
index 07b3b9ebb6..7b6976685f 100644
--- a/video/out/gl_video.c
+++ b/video/out/gl_video.c
@@ -1976,6 +1976,13 @@ static bool get_image(struct gl_video *p, struct mp_image *mpi)
return true;
}
+void gl_video_skip_image(struct gl_video *p, struct mp_image *mpi)
+{
+ struct video_image *vimg = &p->image;
+ talloc_free(vimg->mpi);
+ vimg->mpi = mpi;
+}
+
void gl_video_upload_image(struct gl_video *p, struct mp_image *mpi)
{
GL *gl = p->gl;
diff --git a/video/out/gl_video.h b/video/out/gl_video.h
index 6ed39c71d3..d55486d34f 100644
--- a/video/out/gl_video.h
+++ b/video/out/gl_video.h
@@ -73,6 +73,7 @@ bool gl_video_check_format(struct gl_video *p, int mp_format);
void gl_video_config(struct gl_video *p, struct mp_image_params *params);
void gl_video_set_output_depth(struct gl_video *p, int r, int g, int b);
void gl_video_set_lut3d(struct gl_video *p, struct lut3d *lut3d);
+void gl_video_skip_image(struct gl_video *p, struct mp_image *mpi);
void gl_video_upload_image(struct gl_video *p, struct mp_image *img);
void gl_video_render_frame(struct gl_video *p, int fbo, struct frame_timing *t);
void gl_video_resize(struct gl_video *p, int vp_w, int vp_h,
diff --git a/video/out/gl_wayland.c b/video/out/gl_wayland.c
index d86faa8d95..0fcec82377 100644
--- a/video/out/gl_wayland.c
+++ b/video/out/gl_wayland.c
@@ -215,6 +215,12 @@ static int control(struct vo *vo, int *events, int request, void *data)
return r;
}
+static bool is_active(struct MPGLContext *ctx)
+{
+ struct vo_wayland_state *wl = ctx->vo->wayland;
+ return wl->frame.pending;
+}
+
void mpgl_set_backend_wayland(MPGLContext *ctx)
{
ctx->config_window = config_window_wayland;
@@ -223,4 +229,5 @@ void mpgl_set_backend_wayland(MPGLContext *ctx)
ctx->vo_control = control;
ctx->vo_init = vo_wayland_init;
ctx->vo_uninit = vo_wayland_uninit;
+ ctx->is_active = is_active;
}
diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
index 84381e42d1..25e25a2e9d 100644
--- a/video/out/vo_opengl.c
+++ b/video/out/vo_opengl.c
@@ -122,6 +122,9 @@ static void flip_page(struct vo *vo)
struct gl_priv *p = vo->priv;
GL *gl = p->gl;
+ if (p->glctx->is_active && !p->glctx->is_active(p->glctx))
+ return;
+
mpgl_lock(p->glctx);
p->glctx->swapGlBuffers(p->glctx);
@@ -160,6 +163,12 @@ static void draw_image_timed(struct vo *vo, mp_image_t *mpi,
struct gl_priv *p = vo->priv;
GL *gl = p->gl;
+ if (p->glctx->is_active && !p->glctx->is_active(p->glctx)) {
+ if (mpi)
+ gl_video_skip_image(p->renderer, mpi);
+ return;
+ }
+
if (p->vo_flipped)
mp_image_vflip(mpi);
@@ -376,6 +385,9 @@ static int control(struct vo *vo, uint32_t request, void *data)
request_hwdec_api(p, data);
return true;
case VOCTRL_REDRAW_FRAME:
+ if (p->glctx->is_active && !p->glctx->is_active(p->glctx))
+ return true;
+
mpgl_lock(p->glctx);
gl_video_render_frame(p->renderer, 0, NULL);
mpgl_unlock(p->glctx);