diff options
author | Niklas Haas <git@nand.wakku.to> | 2015-02-27 04:32:22 +0100 |
---|---|---|
committer | Niklas Haas <git@nand.wakku.to> | 2015-02-27 04:35:15 +0100 |
commit | 0da6a7346ae9c2dde2008f664da990bce15f77ab (patch) | |
tree | 0b1db229e69ac72d886af15b5a95a14c9aef7d9f /video | |
parent | 6e73b4dac726588ed3737a6918c7629e263eae1b (diff) | |
download | mpv-0da6a7346ae9c2dde2008f664da990bce15f77ab.tar.bz2 mpv-0da6a7346ae9c2dde2008f664da990bce15f77ab.tar.xz |
vo_opengl: implement antiringing for tensor scalers
This is based on pretty much the same (somewhat naive) logic right now.
I'm not convinced that the extra logic that eg. madVR includes is worth
enough to warrant heavily confusing the logic for it.
This shouldn't slow down the logic at all in any sane shader compiler,
and indeed it doesn't on any shader compiler that I tested.
Note that this currently doesn't affect cscale at all, due to the weird
implementation details of that.
Diffstat (limited to 'video')
-rw-r--r-- | video/out/gl_video.c | 6 | ||||
-rw-r--r-- | video/out/gl_video_shaders.glsl | 16 |
2 files changed, 15 insertions, 7 deletions
diff --git a/video/out/gl_video.c b/video/out/gl_video.c index ac2b8a8787..d812ad7960 100644 --- a/video/out/gl_video.c +++ b/video/out/gl_video.c @@ -866,9 +866,9 @@ static void shader_setup_scaler(char **shader, struct scaler *scaler, int pass) // The direction/pass assignment is rather arbitrary, but fixed in // other parts of the code (like FBO setup). const char *direction = pass == 0 ? "0, 1" : "1, 0"; - // SAMPLE_CONVOLUTION_SEP_N(NAME, DIR, N, LUT, WEIGHTS_FUNC) - APPENDF(shader, "SAMPLE_CONVOLUTION_SEP_N(%s, vec2(%s), %d, %s, %s)\n", - name, direction, size, lut_tex, lut_fn); + // SAMPLE_CONVOLUTION_SEP_N(NAME, DIR, N, LUT, WEIGHTS_FUNC, ANTIRING) + APPENDF(shader, "SAMPLE_CONVOLUTION_SEP_N(%s, vec2(%s), %d, %s, %s, %f)\n", + name, direction, size, lut_tex, lut_fn, scaler->antiring); } else { // SAMPLE_CONVOLUTION_N(NAME, N, LUT, WEIGHTS_FUNC) APPENDF(shader, "SAMPLE_CONVOLUTION_N(%s, %d, %s, %s)\n", diff --git a/video/out/gl_video_shaders.glsl b/video/out/gl_video_shaders.glsl index 74a2b5c3e6..87fb4d04b0 100644 --- a/video/out/gl_video_shaders.glsl +++ b/video/out/gl_video_shaders.glsl @@ -269,18 +269,26 @@ float[6] weights6(sampler2D lookup, float f) { } // The DIR parameter is (0, 1) or (1, 0), and we expect the shader compiler to -// remove all the redundant multiplications and additions. -#define SAMPLE_CONVOLUTION_SEP_N(NAME, DIR, N, LUT, WEIGHTS_FUNC) \ +// remove all the redundant multiplications and additions, and also to unroll +// the loop and remove the conditional completely +#define SAMPLE_CONVOLUTION_SEP_N(NAME, DIR, N, LUT, WEIGHTS_FUNC, ANTIRING) \ vec4 NAME(VIDEO_SAMPLER tex, vec2 texsize, vec2 texcoord) { \ vec2 pt = (vec2(1.0) / texsize) * DIR; \ float fcoord = dot(fract(texcoord * texsize - vec2(0.5)), DIR); \ vec2 base = texcoord - fcoord * pt - pt * vec2(N / 2 - 1); \ float weights[N] = WEIGHTS_FUNC(LUT, fcoord); \ vec4 res = vec4(0); \ + vec4 hi = vec4(0); \ + vec4 lo = vec4(1); \ for (int n = 0; n < N; n++) { \ - res += vec4(weights[n]) * texture(tex, base + pt * vec2(n)); \ + vec4 c = texture(tex, base + pt * vec2(n)); \ + res += vec4(weights[n]) * c; \ + if (n == N/2-1 || n == N/2) { \ + lo = min(lo, c); \ + hi = max(hi, c); \ + } \ } \ - return res; \ + return mix(res, clamp(res, lo, hi), ANTIRING); \ } #define SAMPLE_CONVOLUTION_N(NAME, N, LUT, WEIGHTS_FUNC) \ |