Skip to content

Commit

Permalink
vo_gpu: kill off FBOTEX_FUZZY
Browse files Browse the repository at this point in the history
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 #1814
  • Loading branch information
haasn committed Sep 22, 2017
1 parent fab0448 commit 2af2fa7
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 35 deletions.
14 changes: 1 addition & 13 deletions video/out/gpu/utils.c
Expand Up @@ -170,31 +170,19 @@ 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;

if (fbo->tex) {
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) {
Expand Down
5 changes: 1 addition & 4 deletions video/out/gpu/utils.h
Expand Up @@ -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;
Expand Down
34 changes: 16 additions & 18 deletions video/out/gpu/video.c
Expand Up @@ -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)
Expand Down Expand Up @@ -1428,7 +1426,7 @@ static struct img_tex pass_hook(struct gl_video *p, const char *name,

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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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};
}
Expand All @@ -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);
}
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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});
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 2af2fa7

Please sign in to comment.