mirror of https://github.com/mpv-player/mpv
vo_gpu_next: move gpu-next opts to specific sub option
This matches the general workflow in the codebase. We keep a cache of these new options and update them if needed. Fixes #13481 and fixes #11518.
This commit is contained in:
parent
073858fcdd
commit
85e84f6d92
|
@ -75,6 +75,7 @@ extern const struct m_sub_options input_config;
|
||||||
extern const struct m_sub_options encode_config;
|
extern const struct m_sub_options encode_config;
|
||||||
extern const struct m_sub_options ra_ctx_conf;
|
extern const struct m_sub_options ra_ctx_conf;
|
||||||
extern const struct m_sub_options gl_video_conf;
|
extern const struct m_sub_options gl_video_conf;
|
||||||
|
extern const struct m_sub_options gl_next_conf;
|
||||||
extern const struct m_sub_options ao_alsa_conf;
|
extern const struct m_sub_options ao_alsa_conf;
|
||||||
|
|
||||||
extern const struct m_sub_options demux_conf;
|
extern const struct m_sub_options demux_conf;
|
||||||
|
@ -867,6 +868,7 @@ static const m_option_t mp_opts[] = {
|
||||||
|
|
||||||
{"", OPT_SUBSTRUCT(ra_ctx_opts, ra_ctx_conf)},
|
{"", OPT_SUBSTRUCT(ra_ctx_opts, ra_ctx_conf)},
|
||||||
{"", OPT_SUBSTRUCT(gl_video_opts, gl_video_conf)},
|
{"", OPT_SUBSTRUCT(gl_video_opts, gl_video_conf)},
|
||||||
|
{"", OPT_SUBSTRUCT(gl_next_opts, gl_next_conf)},
|
||||||
{"", OPT_SUBSTRUCT(spirv_opts, spirv_conf)},
|
{"", OPT_SUBSTRUCT(spirv_opts, spirv_conf)},
|
||||||
|
|
||||||
#if HAVE_GL
|
#if HAVE_GL
|
||||||
|
|
|
@ -366,6 +366,7 @@ typedef struct MPOpts {
|
||||||
|
|
||||||
struct ra_ctx_opts *ra_ctx_opts;
|
struct ra_ctx_opts *ra_ctx_opts;
|
||||||
struct gl_video_opts *gl_video_opts;
|
struct gl_video_opts *gl_video_opts;
|
||||||
|
struct gl_next_opts *gl_next_opts;
|
||||||
struct angle_opts *angle_opts;
|
struct angle_opts *angle_opts;
|
||||||
struct opengl_opts *opengl_opts;
|
struct opengl_opts *opengl_opts;
|
||||||
struct vulkan_opts *vulkan_opts;
|
struct vulkan_opts *vulkan_opts;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "common/common.h"
|
#include "common/common.h"
|
||||||
#include "options/m_config.h"
|
#include "options/m_config.h"
|
||||||
|
#include "options/options.h"
|
||||||
#include "options/path.h"
|
#include "options/path.h"
|
||||||
#include "osdep/io.h"
|
#include "osdep/io.h"
|
||||||
#include "osdep/threads.h"
|
#include "osdep/threads.h"
|
||||||
|
@ -137,21 +138,18 @@ struct priv {
|
||||||
|
|
||||||
pl_options pars;
|
pl_options pars;
|
||||||
struct m_config_cache *opts_cache;
|
struct m_config_cache *opts_cache;
|
||||||
|
struct m_config_cache *next_opts_cache;
|
||||||
|
struct gl_next_opts *next_opts;
|
||||||
struct cache shader_cache, icc_cache;
|
struct cache shader_cache, icc_cache;
|
||||||
struct mp_csp_equalizer_state *video_eq;
|
struct mp_csp_equalizer_state *video_eq;
|
||||||
struct scaler_params scalers[SCALER_COUNT];
|
struct scaler_params scalers[SCALER_COUNT];
|
||||||
const struct pl_hook **hooks; // storage for `params.hooks`
|
const struct pl_hook **hooks; // storage for `params.hooks`
|
||||||
enum pl_color_levels output_levels;
|
enum pl_color_levels output_levels;
|
||||||
char **raw_opts;
|
|
||||||
|
|
||||||
struct pl_icc_params icc_params;
|
struct pl_icc_params icc_params;
|
||||||
char *icc_path;
|
char *icc_path;
|
||||||
pl_icc_object icc_profile;
|
pl_icc_object icc_profile;
|
||||||
|
|
||||||
struct user_lut image_lut;
|
|
||||||
struct user_lut target_lut;
|
|
||||||
struct user_lut lut;
|
|
||||||
|
|
||||||
// Cached shaders, preserved across options updates
|
// Cached shaders, preserved across options updates
|
||||||
struct user_hook *user_hooks;
|
struct user_hook *user_hooks;
|
||||||
int num_user_hooks;
|
int num_user_hooks;
|
||||||
|
@ -159,17 +157,53 @@ struct priv {
|
||||||
// Performance data of last frame
|
// Performance data of last frame
|
||||||
struct frame_info perf_fresh;
|
struct frame_info perf_fresh;
|
||||||
struct frame_info perf_redraw;
|
struct frame_info perf_redraw;
|
||||||
|
|
||||||
bool delayed_peak;
|
|
||||||
bool inter_preserve;
|
|
||||||
bool target_hint;
|
|
||||||
|
|
||||||
float corner_rounding;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void update_render_options(struct vo *vo);
|
static void update_render_options(struct vo *vo);
|
||||||
static void update_lut(struct priv *p, struct user_lut *lut);
|
static void update_lut(struct priv *p, struct user_lut *lut);
|
||||||
|
|
||||||
|
struct gl_next_opts {
|
||||||
|
bool delayed_peak;
|
||||||
|
float corner_rounding;
|
||||||
|
bool inter_preserve;
|
||||||
|
struct user_lut lut;
|
||||||
|
struct user_lut image_lut;
|
||||||
|
struct user_lut target_lut;
|
||||||
|
bool target_hint;
|
||||||
|
char **raw_opts;
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct m_opt_choice_alternatives lut_types[] = {
|
||||||
|
{"auto", PL_LUT_UNKNOWN},
|
||||||
|
{"native", PL_LUT_NATIVE},
|
||||||
|
{"normalized", PL_LUT_NORMALIZED},
|
||||||
|
{"conversion", PL_LUT_CONVERSION},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define OPT_BASE_STRUCT struct gl_next_opts
|
||||||
|
const struct m_sub_options gl_next_conf = {
|
||||||
|
.opts = (const struct m_option[]) {
|
||||||
|
{"allow-delayed-peak-detect", OPT_BOOL(delayed_peak)},
|
||||||
|
{"corner-rounding", OPT_FLOAT(corner_rounding), M_RANGE(0, 1)},
|
||||||
|
{"interpolation-preserve", OPT_BOOL(inter_preserve)},
|
||||||
|
{"lut", OPT_STRING(lut.opt), .flags = M_OPT_FILE},
|
||||||
|
{"lut-type", OPT_CHOICE_C(lut.type, lut_types)},
|
||||||
|
{"image-lut", OPT_STRING(image_lut.opt), .flags = M_OPT_FILE},
|
||||||
|
{"image-lut-type", OPT_CHOICE_C(image_lut.type, lut_types)},
|
||||||
|
{"target-lut", OPT_STRING(target_lut.opt), .flags = M_OPT_FILE},
|
||||||
|
{"target-colorspace-hint", OPT_BOOL(target_hint)},
|
||||||
|
// No `target-lut-type` because we don't support non-RGB targets
|
||||||
|
{"libplacebo-opts", OPT_KEYVALUELIST(raw_opts)},
|
||||||
|
{0},
|
||||||
|
},
|
||||||
|
.defaults = &(struct gl_next_opts) {
|
||||||
|
.inter_preserve = true,
|
||||||
|
},
|
||||||
|
.size = sizeof(struct gl_next_opts),
|
||||||
|
.change_flags = UPDATE_VIDEO,
|
||||||
|
};
|
||||||
|
|
||||||
static pl_buf get_dr_buf(struct priv *p, const uint8_t *ptr)
|
static pl_buf get_dr_buf(struct priv *p, const uint8_t *ptr)
|
||||||
{
|
{
|
||||||
mp_mutex_lock(&p->dr_lock);
|
mp_mutex_lock(&p->dr_lock);
|
||||||
|
@ -671,9 +705,9 @@ static bool map_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *src
|
||||||
pl_icc_profile_compute_signature(&frame->profile);
|
pl_icc_profile_compute_signature(&frame->profile);
|
||||||
|
|
||||||
// Update LUT attached to this frame
|
// Update LUT attached to this frame
|
||||||
update_lut(p, &p->image_lut);
|
update_lut(p, &p->next_opts->image_lut);
|
||||||
frame->lut = p->image_lut.lut;
|
frame->lut = p->next_opts->image_lut.lut;
|
||||||
frame->lut_type = p->image_lut.type;
|
frame->lut_type = p->next_opts->image_lut.type;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -719,12 +753,14 @@ static void update_options(struct vo *vo)
|
||||||
{
|
{
|
||||||
struct priv *p = vo->priv;
|
struct priv *p = vo->priv;
|
||||||
pl_options pars = p->pars;
|
pl_options pars = p->pars;
|
||||||
if (m_config_cache_update(p->opts_cache))
|
bool changed = m_config_cache_update(p->opts_cache);
|
||||||
|
changed = m_config_cache_update(p->next_opts_cache) || changed;
|
||||||
|
if (changed)
|
||||||
update_render_options(vo);
|
update_render_options(vo);
|
||||||
|
|
||||||
update_lut(p, &p->lut);
|
update_lut(p, &p->next_opts->lut);
|
||||||
pars->params.lut = p->lut.lut;
|
pars->params.lut = p->next_opts->lut.lut;
|
||||||
pars->params.lut_type = p->lut.type;
|
pars->params.lut_type = p->next_opts->lut.type;
|
||||||
|
|
||||||
// Update equalizer state
|
// Update equalizer state
|
||||||
struct mp_csp_params cparams = MP_CSP_PARAMS_DEFAULTS;
|
struct mp_csp_params cparams = MP_CSP_PARAMS_DEFAULTS;
|
||||||
|
@ -736,7 +772,7 @@ static void update_options(struct vo *vo)
|
||||||
pars->color_adjustment.gamma = cparams.gamma;
|
pars->color_adjustment.gamma = cparams.gamma;
|
||||||
p->output_levels = cparams.levels_out;
|
p->output_levels = cparams.levels_out;
|
||||||
|
|
||||||
for (char **kv = p->raw_opts; kv && kv[0]; kv += 2)
|
for (char **kv = p->next_opts->raw_opts; kv && kv[0]; kv += 2)
|
||||||
pl_options_set_str(pars, kv[0], kv[1]);
|
pl_options_set_str(pars, kv[0], kv[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,9 +804,9 @@ static void apply_target_contrast(struct priv *p, struct pl_color_space *color)
|
||||||
|
|
||||||
static void apply_target_options(struct priv *p, struct pl_frame *target)
|
static void apply_target_options(struct priv *p, struct pl_frame *target)
|
||||||
{
|
{
|
||||||
update_lut(p, &p->target_lut);
|
update_lut(p, &p->next_opts->target_lut);
|
||||||
target->lut = p->target_lut.lut;
|
target->lut = p->next_opts->target_lut.lut;
|
||||||
target->lut_type = p->target_lut.type;
|
target->lut_type = p->next_opts->target_lut.type;
|
||||||
|
|
||||||
// Colorspace overrides
|
// Colorspace overrides
|
||||||
const struct gl_video_opts *opts = p->opts_cache->opts;
|
const struct gl_video_opts *opts = p->opts_cache->opts;
|
||||||
|
@ -874,7 +910,7 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
|
||||||
params.info_callback = info_callback;
|
params.info_callback = info_callback;
|
||||||
params.info_priv = vo;
|
params.info_priv = vo;
|
||||||
params.skip_caching_single_frame = !cache_frame;
|
params.skip_caching_single_frame = !cache_frame;
|
||||||
params.preserve_mixing_cache = p->inter_preserve && !frame->still;
|
params.preserve_mixing_cache = p->next_opts->inter_preserve && !frame->still;
|
||||||
if (frame->still)
|
if (frame->still)
|
||||||
params.frame_mixer = NULL;
|
params.frame_mixer = NULL;
|
||||||
|
|
||||||
|
@ -931,7 +967,7 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
|
||||||
p->last_id = id;
|
p->last_id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->target_hint && frame->current) {
|
if (p->next_opts->target_hint && frame->current) {
|
||||||
struct pl_color_space hint = frame->current->params.color;
|
struct pl_color_space hint = frame->current->params.color;
|
||||||
if (opts->target_prim)
|
if (opts->target_prim)
|
||||||
hint.primaries = opts->target_prim;
|
hint.primaries = opts->target_prim;
|
||||||
|
@ -941,7 +977,7 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
|
||||||
hint.hdr.max_luma = opts->target_peak;
|
hint.hdr.max_luma = opts->target_peak;
|
||||||
apply_target_contrast(p, &hint);
|
apply_target_contrast(p, &hint);
|
||||||
pl_swapchain_colorspace_hint(p->sw, &hint);
|
pl_swapchain_colorspace_hint(p->sw, &hint);
|
||||||
} else if (!p->target_hint) {
|
} else if (!p->next_opts->target_hint) {
|
||||||
pl_swapchain_colorspace_hint(p->sw, NULL);
|
pl_swapchain_colorspace_hint(p->sw, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1742,6 +1778,8 @@ static int preinit(struct vo *vo)
|
||||||
{
|
{
|
||||||
struct priv *p = vo->priv;
|
struct priv *p = vo->priv;
|
||||||
p->opts_cache = m_config_cache_alloc(p, vo->global, &gl_video_conf);
|
p->opts_cache = m_config_cache_alloc(p, vo->global, &gl_video_conf);
|
||||||
|
p->next_opts_cache = m_config_cache_alloc(p, vo->global, &gl_next_conf);
|
||||||
|
p->next_opts = p->next_opts_cache->opts;
|
||||||
p->video_eq = mp_csp_equalizer_create(p, vo->global);
|
p->video_eq = mp_csp_equalizer_create(p, vo->global);
|
||||||
p->global = vo->global;
|
p->global = vo->global;
|
||||||
p->log = vo->log;
|
p->log = vo->log;
|
||||||
|
@ -2040,7 +2078,7 @@ static void update_render_options(struct vo *vo)
|
||||||
pars->params.disable_linear_scaling = !opts->linear_downscaling && !opts->linear_upscaling;
|
pars->params.disable_linear_scaling = !opts->linear_downscaling && !opts->linear_upscaling;
|
||||||
pars->params.disable_fbos = opts->dumb_mode == 1;
|
pars->params.disable_fbos = opts->dumb_mode == 1;
|
||||||
pars->params.blend_against_tiles = opts->alpha_mode == ALPHA_BLEND_TILES;
|
pars->params.blend_against_tiles = opts->alpha_mode == ALPHA_BLEND_TILES;
|
||||||
pars->params.corner_rounding = p->corner_rounding;
|
pars->params.corner_rounding = p->next_opts->corner_rounding;
|
||||||
pars->params.correct_subpixel_offsets = !opts->scaler_resizes_only;
|
pars->params.correct_subpixel_offsets = !opts->scaler_resizes_only;
|
||||||
|
|
||||||
// Map scaler options as best we can
|
// Map scaler options as best we can
|
||||||
|
@ -2074,7 +2112,7 @@ static void update_render_options(struct vo *vo)
|
||||||
pars->peak_detect_params.scene_threshold_low = opts->tone_map.scene_threshold_low;
|
pars->peak_detect_params.scene_threshold_low = opts->tone_map.scene_threshold_low;
|
||||||
pars->peak_detect_params.scene_threshold_high = opts->tone_map.scene_threshold_high;
|
pars->peak_detect_params.scene_threshold_high = opts->tone_map.scene_threshold_high;
|
||||||
pars->peak_detect_params.percentile = opts->tone_map.peak_percentile;
|
pars->peak_detect_params.percentile = opts->tone_map.peak_percentile;
|
||||||
pars->peak_detect_params.allow_delayed = p->delayed_peak;
|
pars->peak_detect_params.allow_delayed = p->next_opts->delayed_peak;
|
||||||
|
|
||||||
const struct pl_tone_map_function * const tone_map_funs[] = {
|
const struct pl_tone_map_function * const tone_map_funs[] = {
|
||||||
[TONE_MAPPING_AUTO] = &pl_tone_map_auto,
|
[TONE_MAPPING_AUTO] = &pl_tone_map_auto,
|
||||||
|
@ -2153,16 +2191,6 @@ static void update_render_options(struct vo *vo)
|
||||||
pars->params.hooks = p->hooks;
|
pars->params.hooks = p->hooks;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPT_BASE_STRUCT struct priv
|
|
||||||
|
|
||||||
const struct m_opt_choice_alternatives lut_types[] = {
|
|
||||||
{"auto", PL_LUT_UNKNOWN},
|
|
||||||
{"native", PL_LUT_NATIVE},
|
|
||||||
{"normalized", PL_LUT_NORMALIZED},
|
|
||||||
{"conversion", PL_LUT_CONVERSION},
|
|
||||||
{0}
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct vo_driver video_out_gpu_next = {
|
const struct vo_driver video_out_gpu_next = {
|
||||||
.description = "Video output based on libplacebo",
|
.description = "Video output based on libplacebo",
|
||||||
.name = "gpu-next",
|
.name = "gpu-next",
|
||||||
|
@ -2181,22 +2209,4 @@ const struct vo_driver video_out_gpu_next = {
|
||||||
.wakeup = wakeup,
|
.wakeup = wakeup,
|
||||||
.uninit = uninit,
|
.uninit = uninit,
|
||||||
.priv_size = sizeof(struct priv),
|
.priv_size = sizeof(struct priv),
|
||||||
.priv_defaults = &(const struct priv) {
|
|
||||||
.inter_preserve = true,
|
|
||||||
},
|
|
||||||
|
|
||||||
.options = (const struct m_option[]) {
|
|
||||||
{"allow-delayed-peak-detect", OPT_BOOL(delayed_peak)},
|
|
||||||
{"corner-rounding", OPT_FLOAT(corner_rounding), M_RANGE(0, 1)},
|
|
||||||
{"interpolation-preserve", OPT_BOOL(inter_preserve)},
|
|
||||||
{"lut", OPT_STRING(lut.opt), .flags = M_OPT_FILE},
|
|
||||||
{"lut-type", OPT_CHOICE_C(lut.type, lut_types)},
|
|
||||||
{"image-lut", OPT_STRING(image_lut.opt), .flags = M_OPT_FILE},
|
|
||||||
{"image-lut-type", OPT_CHOICE_C(image_lut.type, lut_types)},
|
|
||||||
{"target-lut", OPT_STRING(target_lut.opt), .flags = M_OPT_FILE},
|
|
||||||
{"target-colorspace-hint", OPT_BOOL(target_hint)},
|
|
||||||
// No `target-lut-type` because we don't support non-RGB targets
|
|
||||||
{"libplacebo-opts", OPT_KEYVALUELIST(raw_opts)},
|
|
||||||
{0}
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue