mirror of https://github.com/mpv-player/mpv
vo_opengl: merge uploading and rendering
Since all existing code does gl_video_upload immediately followed by pass_render_frame, we can just move the upload into pass_render_frame itself, which arguably makes more sense anyway.
This commit is contained in:
parent
dd78cc6fe7
commit
6a12b1fdc3
|
@ -417,8 +417,7 @@ const struct m_sub_options gl_video_conf = {
|
||||||
static void uninit_rendering(struct gl_video *p);
|
static void uninit_rendering(struct gl_video *p);
|
||||||
static void uninit_scaler(struct gl_video *p, struct scaler *scaler);
|
static void uninit_scaler(struct gl_video *p, struct scaler *scaler);
|
||||||
static void check_gl_features(struct gl_video *p);
|
static void check_gl_features(struct gl_video *p);
|
||||||
static bool gl_video_upload_image(struct gl_video *p, struct mp_image *mpi,
|
static bool pass_upload_image(struct gl_video *p, struct mp_image *mpi, uint64_t id);
|
||||||
uint64_t id);
|
|
||||||
static const char *handle_scaler_opt(const char *name, bool tscale);
|
static const char *handle_scaler_opt(const char *name, bool tscale);
|
||||||
static void reinit_from_options(struct gl_video *p);
|
static void reinit_from_options(struct gl_video *p);
|
||||||
static void get_scale_factors(struct gl_video *p, bool transpose_rot, double xy[2]);
|
static void get_scale_factors(struct gl_video *p, bool transpose_rot, double xy[2]);
|
||||||
|
@ -2442,9 +2441,9 @@ static void pass_render_frame_dumb(struct gl_video *p, int fbo)
|
||||||
|
|
||||||
// The main rendering function, takes care of everything up to and including
|
// The main rendering function, takes care of everything up to and including
|
||||||
// upscaling. p->image is rendered.
|
// upscaling. p->image is rendered.
|
||||||
static void pass_render_frame(struct gl_video *p)
|
static bool pass_render_frame(struct gl_video *p, struct mp_image *mpi, uint64_t id)
|
||||||
{
|
{
|
||||||
// initialize the texture parameters
|
// initialize the texture parameters and temporary variables
|
||||||
p->texture_w = p->image_params.w;
|
p->texture_w = p->image_params.w;
|
||||||
p->texture_h = p->image_params.h;
|
p->texture_h = p->image_params.h;
|
||||||
p->texture_offset = identity_trans;
|
p->texture_offset = identity_trans;
|
||||||
|
@ -2453,12 +2452,15 @@ static void pass_render_frame(struct gl_video *p)
|
||||||
p->hook_fbo_num = 0;
|
p->hook_fbo_num = 0;
|
||||||
p->use_linear = false;
|
p->use_linear = false;
|
||||||
|
|
||||||
|
// try uploading the frame
|
||||||
|
if (!pass_upload_image(p, mpi, id))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (p->image_params.rotate % 180 == 90)
|
if (p->image_params.rotate % 180 == 90)
|
||||||
MPSWAP(int, p->texture_w, p->texture_h);
|
MPSWAP(int, p->texture_w, p->texture_h);
|
||||||
|
|
||||||
if (p->dumb_mode)
|
if (p->dumb_mode)
|
||||||
return;
|
return true;
|
||||||
|
|
||||||
|
|
||||||
p->use_linear = p->opts.linear_scaling || p->opts.sigmoid_upscaling;
|
p->use_linear = p->opts.linear_scaling || p->opts.sigmoid_upscaling;
|
||||||
pass_read_video(p);
|
pass_read_video(p);
|
||||||
|
@ -2518,6 +2520,8 @@ static void pass_render_frame(struct gl_video *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
pass_opt_hook_point(p, "SCALED", NULL);
|
pass_opt_hook_point(p, "SCALED", NULL);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pass_draw_to_screen(struct gl_video *p, int fbo)
|
static void pass_draw_to_screen(struct gl_video *p, int fbo)
|
||||||
|
@ -2577,9 +2581,8 @@ static void gl_video_interpolate_frame(struct gl_video *p, struct vo_frame *t,
|
||||||
if (p->surfaces[p->surface_now].id == 0) {
|
if (p->surfaces[p->surface_now].id == 0) {
|
||||||
is_new = true;
|
is_new = true;
|
||||||
pass_info_reset(p, false);
|
pass_info_reset(p, false);
|
||||||
if (!gl_video_upload_image(p, t->current, t->frame_id))
|
if (!pass_render_frame(p, t->current, t->frame_id))
|
||||||
return;
|
return;
|
||||||
pass_render_frame(p);
|
|
||||||
finish_pass_fbo(p, &p->surfaces[p->surface_now].fbotex,
|
finish_pass_fbo(p, &p->surfaces[p->surface_now].fbotex,
|
||||||
vp_w, vp_h, FBOTEX_FUZZY);
|
vp_w, vp_h, FBOTEX_FUZZY);
|
||||||
p->surfaces[p->surface_now].id = p->image.id;
|
p->surfaces[p->surface_now].id = p->image.id;
|
||||||
|
@ -2641,9 +2644,8 @@ static void gl_video_interpolate_frame(struct gl_video *p, struct vo_frame *t,
|
||||||
if (f_id > p->surfaces[p->surface_idx].id) {
|
if (f_id > p->surfaces[p->surface_idx].id) {
|
||||||
is_new = true;
|
is_new = true;
|
||||||
pass_info_reset(p, false);
|
pass_info_reset(p, false);
|
||||||
if (!gl_video_upload_image(p, f, f_id))
|
if (!pass_render_frame(p, f, f_id))
|
||||||
return;
|
return;
|
||||||
pass_render_frame(p);
|
|
||||||
finish_pass_fbo(p, &p->surfaces[surface_dst].fbotex,
|
finish_pass_fbo(p, &p->surfaces[surface_dst].fbotex,
|
||||||
vp_w, vp_h, FBOTEX_FUZZY);
|
vp_w, vp_h, FBOTEX_FUZZY);
|
||||||
p->surfaces[surface_dst].id = f_id;
|
p->surfaces[surface_dst].id = f_id;
|
||||||
|
@ -2823,9 +2825,8 @@ void gl_video_render_frame(struct gl_video *p, struct vo_frame *frame, int fbo)
|
||||||
p->output_fbo_valid = false;
|
p->output_fbo_valid = false;
|
||||||
|
|
||||||
pass_info_reset(p, false);
|
pass_info_reset(p, false);
|
||||||
if (!gl_video_upload_image(p, frame->current, frame->frame_id))
|
if (!pass_render_frame(p, frame->current, frame->frame_id))
|
||||||
goto done;
|
goto done;
|
||||||
pass_render_frame(p);
|
|
||||||
|
|
||||||
// For the non-interpolation case, we draw to a single "cache"
|
// For the non-interpolation case, we draw to a single "cache"
|
||||||
// FBO to speed up subsequent re-draws (if any exist)
|
// FBO to speed up subsequent re-draws (if any exist)
|
||||||
|
@ -2997,8 +2998,7 @@ static void reinterleave_vdpau(struct gl_video *p, struct gl_hwdec_frame *frame)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns false on failure.
|
// Returns false on failure.
|
||||||
static bool gl_video_upload_image(struct gl_video *p, struct mp_image *mpi,
|
static bool pass_upload_image(struct gl_video *p, struct mp_image *mpi, uint64_t id)
|
||||||
uint64_t id)
|
|
||||||
{
|
{
|
||||||
GL *gl = p->gl;
|
GL *gl = p->gl;
|
||||||
struct video_image *vimg = &p->image;
|
struct video_image *vimg = &p->image;
|
||||||
|
|
Loading…
Reference in New Issue