int mpv_opengl_cb_init_gl(struct mpv_opengl_cb_context *ctx, const char *exts, mpv_opengl_cb_get_proc_address_fn get_proc_address, void *get_proc_address_ctx) { if (ctx->renderer) return MPV_ERROR_INVALID_PARAMETER; mpgl_load_functions2(ctx->gl, get_proc_address, get_proc_address_ctx, exts, ctx->log); ctx->renderer = gl_video_init(ctx->gl, ctx->log, ctx->osd); if (!ctx->renderer) return MPV_ERROR_UNSUPPORTED; ctx->hwdec = gl_hwdec_load_api(ctx->log, ctx->gl, ctx->hwapi, &ctx->hwdec_info); gl_video_set_hwdec(ctx->renderer, ctx->hwdec); pthread_mutex_lock(&ctx->lock); for (int n = IMGFMT_START; n < IMGFMT_END; n++) { ctx->imgfmt_supported[n - IMGFMT_START] = gl_video_check_format(ctx->renderer, n); } ctx->initialized = true; pthread_mutex_unlock(&ctx->lock); gl_video_unset_gl_state(ctx->renderer); return 0; }
static int preinit(struct vo *vo) { struct gl_priv *p = vo->priv; p->vo = vo; p->log = vo->log; int vo_flags = 0; if (p->renderer_opts->alpha_mode == 1) vo_flags |= VOFLAG_ALPHA; if (p->use_gl_debug) vo_flags |= VOFLAG_GL_DEBUG; if (p->es == 1) vo_flags |= VOFLAG_GLES; if (p->es == -1) vo_flags |= VOFLAG_NO_GLES; if (p->allow_sw) vo_flags |= VOFLAG_SW; p->glctx = mpgl_init(vo, p->backend, vo_flags); if (!p->glctx) goto err_out; p->gl = p->glctx->gl; p->glctx->dwm_flush_opt = p->dwm_flush; if (p->gl->SwapInterval) { p->gl->SwapInterval(p->swap_interval); } else { MP_VERBOSE(vo, "swap_control extension missing.\n"); } p->cms = gl_lcms_init(p, vo->log, vo->global); if (!p->cms) goto err_out; p->renderer = gl_video_init(p->gl, vo->log, vo->global, p->cms); if (!p->renderer) goto err_out; gl_video_set_osd_source(p->renderer, vo->osd); gl_video_set_options(p->renderer, p->renderer_opts); gl_video_configure_queue(p->renderer, vo); gl_lcms_set_options(p->cms, p->icc_opts); get_and_update_icc_profile(p, &(int){0});
static int preinit(struct vo *vo, const char *arg) { struct gl_priv *p = vo->priv; p->vo = vo; p->glctx = mpgl_init(vo, p->backend); if (!p->glctx) goto err_out; p->gl = p->glctx->gl; if (!config_window(p, 320, 200, VOFLAG_HIDDEN)) goto err_out; mpgl_set_context(p->glctx); if (p->gl->SwapInterval) p->gl->SwapInterval(p->swap_interval); p->renderer = gl_video_init(p->gl); gl_video_set_output_depth(p->renderer, p->glctx->depth_r, p->glctx->depth_g, p->glctx->depth_b); gl_video_set_options(p->renderer, p->renderer_opts); if (p->icc_opts->profile) { struct lut3d *lut3d = mp_load_icc(p->icc_opts); if (!lut3d) goto err_out; gl_video_set_lut3d(p->renderer, lut3d); talloc_free(lut3d); } mpgl_unset_context(p->glctx); return 0; err_out: uninit(vo); return -1; }
int mpv_opengl_cb_init_gl(struct mpv_opengl_cb_context *ctx, const char *exts, mpv_opengl_cb_get_proc_address_fn get_proc_address, void *get_proc_address_ctx) { if (ctx->renderer) return MPV_ERROR_INVALID_PARAMETER; ctx->gl = talloc_zero(ctx, GL); mpgl_load_functions2(ctx->gl, get_proc_address, get_proc_address_ctx, exts, ctx->log); 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->global, ctx->hwdec_api); gl_video_set_hwdec(ctx->renderer, ctx->hwdec); if (ctx->hwdec) ctx->hwdec_info.hwctx = ctx->hwdec->hwctx; pthread_mutex_lock(&ctx->lock); // We don't know the exact caps yet - use a known superset ctx->eq.capabilities = MP_CSP_EQ_CAPS_GAMMA | MP_CSP_EQ_CAPS_BRIGHTNESS | MP_CSP_EQ_CAPS_COLORMATRIX; ctx->eq_changed = true; for (int n = IMGFMT_START; n < IMGFMT_END; n++) { ctx->imgfmt_supported[n - IMGFMT_START] = gl_video_check_format(ctx->renderer, n); } ctx->initialized = true; pthread_mutex_unlock(&ctx->lock); gl_video_unset_gl_state(ctx->renderer); return 0; }
static int preinit(struct vo *vo) { struct gl_priv *p = vo->priv; p->vo = vo; p->log = vo->log; int vo_flags = 0; if (p->renderer_opts->alpha_mode == 1) vo_flags |= VOFLAG_ALPHA; if (p->use_gl_debug) vo_flags |= VOFLAG_GL_DEBUG; if (p->es == 1) vo_flags |= VOFLAG_GLES; if (p->es == -1) vo_flags |= VOFLAG_NO_GLES; if (p->allow_sw) vo_flags |= VOFLAG_SW; p->glctx = mpgl_init(vo, p->backend, vo_flags); if (!p->glctx) goto err_out; p->gl = p->glctx->gl; p->glctx->dwm_flush_opt = p->dwm_flush; if (p->gl->SwapInterval) { p->gl->SwapInterval(p->swap_interval); } else { MP_VERBOSE(vo, "swap_control extension missing.\n"); } p->renderer = gl_video_init(p->gl, vo->log, vo->global); if (!p->renderer) goto err_out; gl_video_set_osd_source(p->renderer, vo->osd); gl_video_set_options(p->renderer, p->renderer_opts); gl_video_configure_queue(p->renderer, vo); get_and_update_icc_profile(p); vo->hwdec_devs = hwdec_devices_create(); hwdec_devices_set_loader(vo->hwdec_devs, call_request_hwdec_api, vo); int hwdec = vo->opts->hwdec_preload_api; if (hwdec == HWDEC_NONE) hwdec = vo->global->opts->hwdec_api; if (hwdec != HWDEC_NONE) { p->hwdec = gl_hwdec_load_api(p->vo->log, p->gl, vo->global, vo->hwdec_devs, hwdec); gl_video_set_hwdec(p->renderer, p->hwdec); } p->original_opts = m_sub_options_copy(p, &opengl_conf, p); return 0; err_out: uninit(vo); return -1; }