1
0
mirror of https://github.com/mpv-player/mpv synced 2025-03-22 11:18:32 +00:00

vo_gpu: kill off FBOTEX_FUZZY

I've observed the garbage pixels in more scenarios. They also were never
really needed to begin with, originally being a discovered work-around
for bug that we fixed since then anyway. Doesn't really seem to even
help resizing, since the OpenGL drivers are all smart enough to pool
resources internally anyway.

Fixes 
This commit is contained in:
Niklas Haas 2017-09-22 16:33:25 +02:00
parent fab0448c5e
commit 2af2fa7a27
3 changed files with 18 additions and 35 deletions

View File

@ -170,10 +170,8 @@ struct ra_layout std430_layout(struct ra_renderpass_input *inp)
// Create a texture and a FBO using the texture as color attachments.
// fmt: texture internal format
// If the parameters are the same as the previous call, do not touch it.
// flags can be 0, or a combination of FBOTEX_FUZZY_W and FBOTEX_FUZZY_H.
// Enabling FUZZY for W or H means the w or h does not need to be exact.
bool fbotex_change(struct fbotex *fbo, struct ra *ra, struct mp_log *log,
int w, int h, const struct ra_format *fmt, int flags)
int w, int h, const struct ra_format *fmt)
{
int lw = w, lh = h;
@ -181,20 +179,10 @@ bool fbotex_change(struct fbotex *fbo, struct ra *ra, struct mp_log *log,
int cw = w, ch = h;
int rw = fbo->tex->params.w, rh = fbo->tex->params.h;
if ((flags & FBOTEX_FUZZY_W) && cw < rw)
cw = rw;
if ((flags & FBOTEX_FUZZY_H) && ch < rh)
ch = rh;
if (rw == cw && rh == ch && fbo->tex->params.format == fmt)
goto done;
}
if (flags & FBOTEX_FUZZY_W)
w = MP_ALIGN_UP(w, 256);
if (flags & FBOTEX_FUZZY_H)
h = MP_ALIGN_UP(h, 256);
mp_verbose(log, "Create FBO: %dx%d (%dx%d)\n", lw, lh, w, h);
if (!fmt || !fmt->renderable || !fmt->linear_filter) {

View File

@ -101,10 +101,7 @@ struct fbotex {
void fbotex_uninit(struct fbotex *fbo);
bool fbotex_change(struct fbotex *fbo, struct ra *ra, struct mp_log *log,
int w, int h, const struct ra_format *fmt, int flags);
#define FBOTEX_FUZZY_W 1
#define FBOTEX_FUZZY_H 2
#define FBOTEX_FUZZY (FBOTEX_FUZZY_W | FBOTEX_FUZZY_H)
int w, int h, const struct ra_format *fmt);
// A wrapper around ra_timer that does result pooling, averaging etc.
struct timer_pool;

View File

@ -1201,12 +1201,10 @@ static void finish_pass_direct(struct gl_video *p, struct fbodst target,
// FBO, if the required parameters have changed
// w, h: required FBO target dimension, and also defines the target rectangle
// used for rasterization
// flags: 0 or combination of FBOTEX_FUZZY_W/FBOTEX_FUZZY_H (setting the fuzzy
// flags allows the FBO to be larger than the w/h parameters)
static void finish_pass_fbo(struct gl_video *p, struct fbotex *dst_fbo,
int w, int h, int flags)
int w, int h)
{
fbotex_change(dst_fbo, p->ra, p->log, w, h, p->fbo_format, flags);
fbotex_change(dst_fbo, p->ra, p->log, w, h, p->fbo_format);
if (p->pass_compute.active) {
if (!dst_fbo->tex)
@ -1428,7 +1426,7 @@ found:
assert(p->hook_fbo_num < SHADER_MAX_SAVED);
struct fbotex *fbo = &p->hook_fbos[p->hook_fbo_num++];
finish_pass_fbo(p, fbo, w, h, 0);
finish_pass_fbo(p, fbo, w, h);
const char *store_name = hook->save_tex ? hook->save_tex : name;
struct img_tex saved_tex = img_tex_fbo(fbo, tex.type, comps);
@ -1485,7 +1483,7 @@ static void pass_opt_hook_point(struct gl_video *p, const char *name,
found:
assert(p->hook_fbo_num < SHADER_MAX_SAVED);
struct fbotex *fbo = &p->hook_fbos[p->hook_fbo_num++];
finish_pass_fbo(p, fbo, p->texture_w, p->texture_h, 0);
finish_pass_fbo(p, fbo, p->texture_w, p->texture_h);
struct img_tex img = img_tex_fbo(fbo, PLANE_RGB, p->components);
img = pass_hook(p, name, img, tex_trans);
@ -1656,7 +1654,7 @@ static void pass_sample_separated(struct gl_video *p, struct img_tex src,
GLSLF("// first pass\n");
pass_sample_separated_gen(p->sc, scaler, 0, 1);
GLSLF("color *= %f;\n", src.multiplier);
finish_pass_fbo(p, &scaler->sep_fbo, src.w, h, FBOTEX_FUZZY_H);
finish_pass_fbo(p, &scaler->sep_fbo, src.w, h);
// Second pass (scale only in the x dir)
src = img_tex_fbo(&scaler->sep_fbo, src.type, src.components);
@ -1997,7 +1995,7 @@ static void pass_read_video(struct gl_video *p)
GLSLF("// merging plane %d ... into %d\n", n, first);
copy_img_tex(p, &num, tex[n]);
pass_describe(p, "merging planes");
finish_pass_fbo(p, &p->merge_fbo[n], tex[n].w, tex[n].h, 0);
finish_pass_fbo(p, &p->merge_fbo[n], tex[n].w, tex[n].h);
tex[first] = img_tex_fbo(&p->merge_fbo[n], tex[n].type, num);
tex[n] = (struct img_tex){0};
}
@ -2010,7 +2008,7 @@ static void pass_read_video(struct gl_video *p)
GLSLF("// use_integer fix for plane %d\n", n);
copy_img_tex(p, &(int){0}, tex[n]);
pass_describe(p, "use_integer fix");
finish_pass_fbo(p, &p->integer_fbo[n], tex[n].w, tex[n].h, 0);
finish_pass_fbo(p, &p->integer_fbo[n], tex[n].w, tex[n].h);
tex[n] = img_tex_fbo(&p->integer_fbo[n], tex[n].type,
tex[n].components);
}
@ -2136,7 +2134,7 @@ static void pass_read_video(struct gl_video *p)
if (strcmp(conf->kernel.name, "bilinear") != 0) {
GLSLF("// upscaling plane %d\n", n);
pass_sample(p, tex[n], scaler, conf, 1.0, p->texture_w, p->texture_h);
finish_pass_fbo(p, &p->scale_fbo[n], p->texture_w, p->texture_h, 0);
finish_pass_fbo(p, &p->scale_fbo[n], p->texture_w, p->texture_h);
tex[n] = img_tex_fbo(&p->scale_fbo[n], tex[n].type, tex[n].components);
}
@ -2341,7 +2339,7 @@ static void pass_scale_main(struct gl_video *p)
compute_src_transform(p, &transform);
GLSLF("// main scaling\n");
finish_pass_fbo(p, &p->indirect_fbo, p->texture_w, p->texture_h, 0);
finish_pass_fbo(p, &p->indirect_fbo, p->texture_w, p->texture_h);
struct img_tex src = img_tex_fbo(&p->indirect_fbo, PLANE_RGB, p->components);
gl_transform_trans(transform, &src.transform);
pass_sample(p, src, scaler, &scaler_conf, scale_factor, vp_w, vp_h);
@ -2699,7 +2697,7 @@ static bool pass_render_frame(struct gl_video *p, struct mp_image *mpi, uint64_t
.w = p->texture_w, .h = p->texture_h,
.display_par = scale[1] / scale[0], // counter compensate scaling
};
finish_pass_fbo(p, &p->blend_subs_fbo, rect.w, rect.h, 0);
finish_pass_fbo(p, &p->blend_subs_fbo, rect.w, rect.h);
pass_draw_osd(p, OSD_DRAW_SUB_ONLY, vpts, rect,
p->blend_subs_fbo.fbo, false);
pass_read_fbo(p, &p->blend_subs_fbo);
@ -2729,7 +2727,7 @@ static bool pass_render_frame(struct gl_video *p, struct mp_image *mpi, uint64_t
pass_delinearize(p->sc, p->image_params.color.gamma);
p->use_linear = false;
}
finish_pass_fbo(p, &p->blend_subs_fbo, p->texture_w, p->texture_h, 0);
finish_pass_fbo(p, &p->blend_subs_fbo, p->texture_w, p->texture_h);
pass_draw_osd(p, OSD_DRAW_SUB_ONLY, vpts, rect,
p->blend_subs_fbo.fbo, false);
pass_read_fbo(p, &p->blend_subs_fbo);
@ -2761,7 +2759,7 @@ static void pass_draw_to_screen(struct gl_video *p, struct fbodst fbo)
if (p->pass_compute.active) {
int o_w = p->dst_rect.x1 - p->dst_rect.x0,
o_h = p->dst_rect.y1 - p->dst_rect.y0;
finish_pass_fbo(p, &p->screen_fbo, o_w, o_h, FBOTEX_FUZZY);
finish_pass_fbo(p, &p->screen_fbo, o_w, o_h);
struct img_tex tmp = img_tex_fbo(&p->screen_fbo, PLANE_RGB, p->components);
copy_img_tex(p, &(int){0}, tmp);
}
@ -2807,7 +2805,7 @@ static bool update_fbosurface(struct gl_video *p, struct mp_image *mpi,
pass_linearize(p->sc, p->image_params.color.gamma);
}
finish_pass_fbo(p, &surf->fbotex, vp_w, vp_h, FBOTEX_FUZZY);
finish_pass_fbo(p, &surf->fbotex, vp_w, vp_h);
surf->id = id;
surf->pts = mpi->pts;
return true;
@ -3050,7 +3048,7 @@ void gl_video_render_frame(struct gl_video *p, struct vo_frame *frame,
{
fbotex_change(&p->output_fbo, p->ra, p->log,
target.tex->params.w, target.tex->params.h,
p->fbo_format, FBOTEX_FUZZY);
p->fbo_format);
dest_fbo = p->output_fbo.fbo;
p->output_fbo_valid = true;
}
@ -3187,7 +3185,7 @@ static void reinterleave_vdpau(struct gl_video *p,
const struct ra_format *fmt =
ra_find_unorm_format(p->ra, 1, n == 0 ? 1 : 2);
fbotex_change(fbo, p->ra, p->log, w, h * 2, fmt, 0);
fbotex_change(fbo, p->ra, p->log, w, h * 2, fmt);
pass_describe(p, "vdpau reinterleaving");
finish_pass_direct(p, fbo->fbo, &(struct mp_rect){0, 0, w, h * 2});
@ -3307,7 +3305,7 @@ static bool test_fbo(struct gl_video *p, const struct ra_format *fmt)
{
MP_VERBOSE(p, "Testing FBO format %s\n", fmt->name);
struct fbotex fbo = {0};
bool success = fbotex_change(&fbo, p->ra, p->log, 16, 16, fmt, 0);
bool success = fbotex_change(&fbo, p->ra, p->log, 16, 16, fmt);
fbotex_uninit(&fbo);
return success;
}