summaryrefslogtreecommitdiffstats
path: root/video/out/vo_opengl_cb.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/out/vo_opengl_cb.c')
-rw-r--r--video/out/vo_opengl_cb.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/video/out/vo_opengl_cb.c b/video/out/vo_opengl_cb.c
index a78b6a7fb7..2a8dfe2974 100644
--- a/video/out/vo_opengl_cb.c
+++ b/video/out/vo_opengl_cb.c
@@ -58,6 +58,7 @@ struct vo_priv {
struct mpv_opengl_cb_context {
struct mp_log *log;
+ struct mpv_global *global;
struct mp_client_api *client_api;
pthread_mutex_t lock;
@@ -70,6 +71,7 @@ struct mpv_opengl_cb_context {
struct vo_frame *next_frame; // next frame to draw
int64_t present_count; // incremented when next frame can be shown
int64_t expected_flip_count; // next vsync event for next_frame
+ bool redrawing; // next_frame was a redraw request
int64_t flip_count;
struct vo_frame *cur_frame;
struct mp_image_params img_params;
@@ -129,6 +131,7 @@ struct mpv_opengl_cb_context *mp_opengl_create(struct mpv_global *g,
ctx->gl = talloc_zero(ctx, GL);
+ ctx->global = g;
ctx->log = mp_log_new(ctx, g->log, "opengl-cb");
ctx->client_api = client_api;
@@ -173,11 +176,12 @@ int mpv_opengl_cb_init_gl(struct mpv_opengl_cb_context *ctx, const char *exts,
mpgl_load_functions2(ctx->gl, get_proc_address, get_proc_address_ctx,
exts, ctx->log);
- ctx->renderer = gl_video_init(ctx->gl, ctx->log, NULL);
+ ctx->renderer = gl_video_init(ctx->gl, ctx->log, ctx->global);
if (!ctx->renderer)
return MPV_ERROR_UNSUPPORTED;
- ctx->hwdec = gl_hwdec_load_api_id(ctx->log, ctx->gl, ctx->hwdec_api);
+ ctx->hwdec = gl_hwdec_load_api_id(ctx->log, ctx->gl, ctx->global,
+ ctx->hwdec_api);
gl_video_set_hwdec(ctx->renderer, ctx->hwdec);
if (ctx->hwdec)
ctx->hwdec_info.hwctx = ctx->hwdec->hwctx;
@@ -265,7 +269,8 @@ int mpv_opengl_cb_draw(mpv_opengl_cb_context *ctx, int fbo, int vp_w, int vp_h)
struct vo_priv *opts = ctx->new_opts ? ctx->new_opts : p;
if (opts) {
gl_video_set_options(ctx->renderer, opts->renderer_opts);
- gl_video_configure_queue(ctx->renderer, vo);
+ if (vo)
+ gl_video_configure_queue(ctx->renderer, vo);
ctx->gl->debug_context = opts->use_gl_debug;
gl_video_set_debug(ctx->renderer, opts->use_gl_debug);
}
@@ -350,6 +355,7 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
assert(!p->ctx->next_frame);
p->ctx->next_frame = vo_frame_ref(frame);
p->ctx->expected_flip_count = p->ctx->flip_count + 1;
+ p->ctx->redrawing = frame ? frame->redraw : false;
update(p);
pthread_mutex_unlock(&p->ctx->lock);
}
@@ -373,6 +379,9 @@ static void flip_page(struct vo *vo)
p->ctx->present_count += 1;
pthread_cond_signal(&p->ctx->wakeup);
+ if (p->ctx->redrawing)
+ goto done; // do not block for redrawing
+
// Wait until frame was presented
while (p->ctx->expected_flip_count > p->ctx->flip_count) {
// mpv_opengl_cb_report_flip() is declared as optional API.