1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-26 00:42:57 +00:00

vo_opengl: set uniform variable "pixel_size" for internal shaders

This commit is contained in:
igv 2016-02-25 22:27:55 +02:00 committed by wm4
parent 3d2fb9e9a8
commit 8bafd68fff
5 changed files with 28 additions and 28 deletions

View File

@ -131,23 +131,23 @@ void pass_nnedi3(GL *gl, struct gl_shader_cache *sc, int planes, int tex_num,
GLSLH(#pragma optionNV(fastprecision on)) GLSLH(#pragma optionNV(fastprecision on))
} }
GLSLHF("float nnedi3(sampler2D tex, vec2 pos, vec2 tex_size, int plane, float tex_mul) {\n"); GLSLHF("float nnedi3(sampler2D tex, vec2 pos, vec2 tex_size, vec2 pixel_size, int plane, float tex_mul) {\n");
if (step == 0) { if (step == 0) {
*transform = (struct gl_transform){{{1.0,0.0}, {0.0,2.0}}, {0.0,-0.5}}; *transform = (struct gl_transform){{{1.0,0.0}, {0.0,2.0}}, {0.0,-0.5}};
GLSLH(if (fract(pos.y * tex_size.y) < 0.5) GLSLH(if (fract(pos.y * tex_size.y) < 0.5)
return texture(tex, pos + vec2(0, 0.25) / tex_size)[plane] * tex_mul;) return texture(tex, pos + vec2(0, 0.25) * pixel_size)[plane] * tex_mul;)
GLSLHF("#define GET(i, j) " GLSLHF("#define GET(i, j) "
"(texture(tex, pos+vec2((i)-(%f),(j)-(%f)+0.25)/tex_size)[plane]*tex_mul)\n", "(texture(tex, pos+vec2((i)-(%f),(j)-(%f)+0.25) * pixel_size)[plane]*tex_mul)\n",
width / 2.0 - 1, (height - 1) / 2.0); width / 2.0 - 1, (height - 1) / 2.0);
} else { } else {
*transform = (struct gl_transform){{{2.0,0.0}, {0.0,1.0}}, {-0.5,0.0}}; *transform = (struct gl_transform){{{2.0,0.0}, {0.0,1.0}}, {-0.5,0.0}};
GLSLH(if (fract(pos.x * tex_size.x) < 0.5) GLSLH(if (fract(pos.x * tex_size.x) < 0.5)
return texture(tex, pos + vec2(0.25, 0) / tex_size)[plane] * tex_mul;) return texture(tex, pos + vec2(0.25, 0) * pixel_size)[plane] * tex_mul;)
GLSLHF("#define GET(i, j) " GLSLHF("#define GET(i, j) "
"(texture(tex, pos+vec2((j)-(%f)+0.25,(i)-(%f))/tex_size)[plane]*tex_mul)\n", "(texture(tex, pos+vec2((j)-(%f)+0.25,(i)-(%f)) * pixel_size)[plane]*tex_mul)\n",
(height - 1) / 2.0, width / 2.0 - 1); (height - 1) / 2.0, width / 2.0 - 1);
} }
@ -229,8 +229,8 @@ void pass_nnedi3(GL *gl, struct gl_shader_cache *sc, int planes, int tex_num,
GLSL(color = vec4(1.0);) GLSL(color = vec4(1.0);)
for (int i = 0; i < planes; i++) { for (int i = 0; i < planes; i++) {
GLSLF("color[%d] = nnedi3(texture%d, texcoord%d, texture_size%d, %d, %f);\n", GLSLF("color[%d] = nnedi3(texture%d, texcoord%d, texture_size%d, pixel_size%d, %d, %f);\n",
i, tex_num, tex_num, tex_num, i, tex_mul); i, tex_num, tex_num, tex_num, tex_num, i, tex_mul);
} }
} }

View File

@ -94,7 +94,7 @@ void pass_superxbr(struct gl_shader_cache *sc, int planes, int tex_num,
GLSLHF("#define weight1 (%f*1.29633/10.0)\n", conf->sharpness); GLSLHF("#define weight1 (%f*1.29633/10.0)\n", conf->sharpness);
GLSLHF("#define weight2 (%f*1.75068/10.0/2.0)\n", conf->sharpness); GLSLHF("#define weight2 (%f*1.75068/10.0/2.0)\n", conf->sharpness);
GLSLH(#define Get(x, y) (texture(tex, pos + (vec2(x, y) - vec2(0.25, 0.25)) / tex_size)[plane] * tex_mul)) GLSLH(#define Get(x, y) (texture(tex, pos + (vec2(x, y) - vec2(0.25, 0.25)) * pixel_size)[plane] * tex_mul))
} else { } else {
*transform = (struct gl_transform){{{1.0,0.0}, {0.0,1.0}}, {0.0,0.0}}; *transform = (struct gl_transform){{{1.0,0.0}, {0.0,1.0}}, {0.0,0.0}};
@ -108,7 +108,7 @@ void pass_superxbr(struct gl_shader_cache *sc, int planes, int tex_num,
GLSLHF("#define weight1 (%f*1.75068/10.0)\n", conf->sharpness); GLSLHF("#define weight1 (%f*1.75068/10.0)\n", conf->sharpness);
GLSLHF("#define weight2 (%f*1.29633/10.0/2.0)\n", conf->sharpness); GLSLHF("#define weight2 (%f*1.29633/10.0/2.0)\n", conf->sharpness);
GLSLH(#define Get(x, y) (texture(tex, pos + (vec2((x) + (y) - 1, (y) - (x))) / tex_size)[plane] * tex_mul)) GLSLH(#define Get(x, y) (texture(tex, pos + (vec2((x) + (y) - 1, (y) - (x))) * pixel_size)[plane] * tex_mul))
} }
GLSLH(float df(float A, float B) GLSLH(float df(float A, float B)
{ {
@ -135,7 +135,7 @@ void pass_superxbr(struct gl_shader_cache *sc, int planes, int tex_num,
wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4))); wp3*(df(i1,e2)+df(i3,e4)+df(e1,i2)+df(e3,i4)));
}) })
GLSLHF("float superxbr(sampler2D tex, vec2 pos, vec2 tex_size, int plane, float tex_mul) {\n"); GLSLHF("float superxbr(sampler2D tex, vec2 pos, vec2 tex_size, vec2 pixel_size, int plane, float tex_mul) {\n");
if (step == 0) { if (step == 0) {
GLSLH(vec2 dir = fract(pos * tex_size) - 0.5;) GLSLH(vec2 dir = fract(pos * tex_size) - 0.5;)
@ -147,7 +147,7 @@ void pass_superxbr(struct gl_shader_cache *sc, int planes, int tex_num,
return 0.0;) return 0.0;)
GLSLH(if (dir.x < 0.0 || dir.y < 0.0 || dist.x < 1.0 || dist.y < 1.0) GLSLH(if (dir.x < 0.0 || dir.y < 0.0 || dist.x < 1.0 || dist.y < 1.0)
return texture(tex, pos - dir / tex_size)[plane] * tex_mul;) return texture(tex, pos - dir * pixel_size)[plane] * tex_mul;)
} else { } else {
GLSLH(vec2 dir = fract(pos * tex_size / 2.0) - 0.5;) GLSLH(vec2 dir = fract(pos * tex_size / 2.0) - 0.5;)
GLSLH(if (dir.x * dir.y > 0.0) GLSLH(if (dir.x * dir.y > 0.0)
@ -223,7 +223,7 @@ void pass_superxbr(struct gl_shader_cache *sc, int planes, int tex_num,
GLSL(color = vec4(1.0);) GLSL(color = vec4(1.0);)
for (int i = 0; i < planes; i++) { for (int i = 0; i < planes; i++) {
GLSLF("color[%d] = superxbr(texture%d, texcoord%d, texture_size%d, %d, %f);\n", GLSLF("color[%d] = superxbr(texture%d, texcoord%d, texture_size%d, pixel_size%d, %d, %f);\n",
i, tex_num, tex_num, tex_num, i, tex_mul); i, tex_num, tex_num, tex_num, tex_num, i, tex_mul);
} }
} }

View File

@ -870,8 +870,10 @@ static void pass_prepare_src_tex(struct gl_video *p)
char texture_name[32]; char texture_name[32];
char texture_size[32]; char texture_size[32];
char pixel_size[32];
snprintf(texture_name, sizeof(texture_name), "texture%d", n); snprintf(texture_name, sizeof(texture_name), "texture%d", n);
snprintf(texture_size, sizeof(texture_size), "texture_size%d", n); snprintf(texture_size, sizeof(texture_size), "texture_size%d", n);
snprintf(pixel_size, sizeof(pixel_size), "pixel_size%d", n);
if (s->use_integer) { if (s->use_integer) {
gl_sc_uniform_sampler_ui(sc, texture_name, n); gl_sc_uniform_sampler_ui(sc, texture_name, n);
@ -884,6 +886,8 @@ static void pass_prepare_src_tex(struct gl_video *p)
f[1] = s->h; f[1] = s->h;
} }
gl_sc_uniform_vec2(sc, texture_size, f); gl_sc_uniform_vec2(sc, texture_size, f);
gl_sc_uniform_vec2(sc, pixel_size, (GLfloat[]){1.0f / f[0],
1.0f / f[1]});
gl->ActiveTexture(GL_TEXTURE0 + n); gl->ActiveTexture(GL_TEXTURE0 + n);
gl->BindTexture(s->gl_target, s->gl_tex); gl->BindTexture(s->gl_target, s->gl_tex);
@ -1351,7 +1355,7 @@ static bool pass_prescale_luma(struct gl_video *p, float tex_mul,
if (p->opts.deband) { if (p->opts.deband) {
// apply debanding before upscaling. // apply debanding before upscaling.
pass_sample_deband(p->sc, p->opts.deband_opts, 0, p->pass_tex[0].gl_target, pass_sample_deband(p->sc, p->opts.deband_opts, 0, p->pass_tex[0].gl_target,
tex_mul, p->texture_w, p->texture_h, &p->lfg); tex_mul, &p->lfg);
finish_pass_fbo(p, &p->deband_fbo, p->texture_w, finish_pass_fbo(p, &p->deband_fbo, p->texture_w,
p->texture_h, 0, 0); p->texture_h, 0, 0);
tex_backup[0] = p->pass_tex[0]; tex_backup[0] = p->pass_tex[0];
@ -1470,8 +1474,7 @@ static void pass_read_video(struct gl_video *p)
if (p->opts.deband) { if (p->opts.deband) {
pass_sample_deband(p->sc, p->opts.deband_opts, 1, p->pass_tex[1].gl_target, pass_sample_deband(p->sc, p->opts.deband_opts, 1, p->pass_tex[1].gl_target,
p->use_normalized_range ? 1.0 : tex_mul, p->use_normalized_range ? 1.0 : tex_mul, &p->lfg);
p->texture_w, p->texture_h, &p->lfg);
GLSL(color.zw = vec2(0.0, 1.0);) // skip unused GLSL(color.zw = vec2(0.0, 1.0);) // skip unused
finish_pass_fbo(p, &p->chroma_deband_fbo, c_w, c_h, 1, 0); finish_pass_fbo(p, &p->chroma_deband_fbo, c_w, c_h, 1, 0);
p->use_normalized_range = true; p->use_normalized_range = true;
@ -1495,7 +1498,7 @@ static void pass_read_video(struct gl_video *p)
// Sample the main (luma/RGB) plane. // Sample the main (luma/RGB) plane.
if (!prescaled && p->opts.deband) { if (!prescaled && p->opts.deband) {
pass_sample_deband(p->sc, p->opts.deband_opts, 0, p->pass_tex[0].gl_target, pass_sample_deband(p->sc, p->opts.deband_opts, 0, p->pass_tex[0].gl_target,
tex_mul, p->texture_w, p->texture_h, &p->lfg); tex_mul, &p->lfg);
p->use_normalized_range = true; p->use_normalized_range = true;
} else { } else {
if (!prescaled) { if (!prescaled) {
@ -1503,7 +1506,7 @@ static void pass_read_video(struct gl_video *p)
} else { } else {
// just use bilinear for non-essential planes. // just use bilinear for non-essential planes.
GLSLF("color = texture(texture0, " GLSLF("color = texture(texture0, "
"texcoord0 + vec2(%f,%f) / texture_size0);\n", "texcoord0 + vec2(%f,%f) * pixel_size0);\n",
-offset.t[0] / scale_factor_x, -offset.t[0] / scale_factor_x,
-offset.t[1] / scale_factor_y); -offset.t[1] / scale_factor_y);
} }
@ -1531,7 +1534,7 @@ static void pass_read_video(struct gl_video *p)
GLSL(color.a = texture(texture3, texcoord3).r;) GLSL(color.a = texture(texture3, texcoord3).r;)
} else { } else {
GLSLF("color.a = texture(texture3, " GLSLF("color.a = texture(texture3, "
"texcoord3 + vec2(%f,%f) / texture_size3).r;", "texcoord3 + vec2(%f,%f) * pixel_size3).r;",
-offset.t[0] / scale_factor_x, -offset.t[0] / scale_factor_x,
-offset.t[1] / scale_factor_y); -offset.t[1] / scale_factor_y);
} }

View File

@ -32,7 +32,7 @@ void sampler_prelude(struct gl_shader_cache *sc, int tex_num)
GLSLF("#define tex texture%d\n", tex_num); GLSLF("#define tex texture%d\n", tex_num);
GLSLF("vec2 pos = texcoord%d;\n", tex_num); GLSLF("vec2 pos = texcoord%d;\n", tex_num);
GLSLF("vec2 size = texture_size%d;\n", tex_num); GLSLF("vec2 size = texture_size%d;\n", tex_num);
GLSLF("vec2 pt = vec2(1.0) / size;\n"); GLSLF("vec2 pt = pixel_size%d;\n", tex_num);
} }
static void pass_sample_separated_get_weights(struct gl_shader_cache *sc, static void pass_sample_separated_get_weights(struct gl_shader_cache *sc,
@ -348,8 +348,7 @@ const struct m_sub_options deband_conf = {
// Stochastically sample a debanded result from a given texture // Stochastically sample a debanded result from a given texture
void pass_sample_deband(struct gl_shader_cache *sc, struct deband_opts *opts, void pass_sample_deband(struct gl_shader_cache *sc, struct deband_opts *opts,
int tex_num, GLenum tex_target, float tex_mul, int tex_num, GLenum tex_target, float tex_mul, AVLFG *lfg)
float img_w, float img_h, AVLFG *lfg)
{ {
// Set up common variables and initialize the PRNG // Set up common variables and initialize the PRNG
GLSLF("// debanding (tex %d)\n", tex_num); GLSLF("// debanding (tex %d)\n", tex_num);
@ -359,14 +358,13 @@ void pass_sample_deband(struct gl_shader_cache *sc, struct deband_opts *opts,
// Helper: Compute a stochastic approximation of the avg color around a // Helper: Compute a stochastic approximation of the avg color around a
// pixel // pixel
GLSLHF("vec4 average(%s tex, vec2 pos, float range, inout float h) {", GLSLHF("vec4 average(%s tex, vec2 pos, vec2 pt, float range, inout float h) {",
mp_sampler_type(tex_target)); mp_sampler_type(tex_target));
// Compute a random rangle and distance // Compute a random rangle and distance
GLSLH(float dist = rand(h) * range; h = permute(h);) GLSLH(float dist = rand(h) * range; h = permute(h);)
GLSLH(float dir = rand(h) * 6.2831853; h = permute(h);) GLSLH(float dir = rand(h) * 6.2831853; h = permute(h);)
bool r = tex_target == GL_TEXTURE_RECTANGLE; GLSLHF("pt *= dist;\n");
GLSLHF("vec2 pt = dist / vec2(%f, %f);\n", r ? 1 : img_w, r ? 1 : img_h);
GLSLH(vec2 o = vec2(cos(dir), sin(dir));) GLSLH(vec2 o = vec2(cos(dir), sin(dir));)
// Sample at quarter-turn intervals around the source pixel // Sample at quarter-turn intervals around the source pixel
@ -386,7 +384,7 @@ void pass_sample_deband(struct gl_shader_cache *sc, struct deband_opts *opts,
for (int i = 1; i <= opts->iterations; i++) { for (int i = 1; i <= opts->iterations; i++) {
// Sample the average pixel and use it instead of the original if // Sample the average pixel and use it instead of the original if
// the difference is below the given threshold // the difference is below the given threshold
GLSLF("avg = average(tex, pos, %f, h);\n", i * opts->range); GLSLF("avg = average(tex, pos, pt, %f, h);\n", i * opts->range);
GLSL(diff = abs(color - avg);) GLSL(diff = abs(color - avg);)
GLSLF("color = mix(avg, color, greaterThan(diff, vec4(%f)));\n", GLSLF("color = mix(avg, color, greaterThan(diff, vec4(%f)));\n",
opts->threshold / (i * 16384.0)); opts->threshold / (i * 16384.0));

View File

@ -39,8 +39,7 @@ void pass_linearize(struct gl_shader_cache *sc, enum mp_csp_trc trc);
void pass_delinearize(struct gl_shader_cache *sc, enum mp_csp_trc trc); void pass_delinearize(struct gl_shader_cache *sc, enum mp_csp_trc trc);
void pass_sample_deband(struct gl_shader_cache *sc, struct deband_opts *opts, void pass_sample_deband(struct gl_shader_cache *sc, struct deband_opts *opts,
int tex_num, GLenum tex_target, float tex_mul, int tex_num, GLenum tex_target, float tex_mul, AVLFG *lfg);
float img_w, float img_h, AVLFG *lfg);
void pass_sample_unsharp(struct gl_shader_cache *sc, float param); void pass_sample_unsharp(struct gl_shader_cache *sc, float param);