summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Haas <git@nand.wakku.to>2015-02-23 22:41:13 +0100
committerNiklas Haas <git@nand.wakku.to>2015-02-24 00:29:24 +0100
commit71a20f7c981ed66e1ba2e4c90c258c7506a9fb6b (patch)
tree053c30c962cd983df1de2436dbc83622efa3fd64
parentc52833bf16c9f4cc2bb676d13df86ef6be30f434 (diff)
downloadmpv-71a20f7c981ed66e1ba2e4c90c258c7506a9fb6b.tar.bz2
mpv-71a20f7c981ed66e1ba2e4c90c258c7506a9fb6b.tar.xz
vo_opengl: explicitly check potential candidates for polar filters
This adds a small check for candidates that could potentially be inside the radius, but aren't necessarily. This speeds up performance by a negligible amount on my hardware, but it's mainly a prerequisite for a further change (using a larger true radius).
-rw-r--r--video/out/gl_video.c8
-rw-r--r--video/out/gl_video_shaders.glsl5
2 files changed, 11 insertions, 2 deletions
diff --git a/video/out/gl_video.c b/video/out/gl_video.c
index f43ad71858..6cff529843 100644
--- a/video/out/gl_video.c
+++ b/video/out/gl_video.c
@@ -829,8 +829,8 @@ static void shader_setup_scaler(char **shader, struct scaler *scaler, int pass)
int xx = x > 0 ? x-1 : x;
double d = sqrt(xx*xx + yy*yy);
- // Samples outside the radius are unnecessary
- if (d < radius) {
+ if (d < radius - 1) {
+ // Samples definitely inside the main ring
APPENDF(shader, "SAMPLE_POLAR_%s(LUT, %f, %d, %d) \\\n ",
// The center 4 coefficients are the primary
// contributors, used to clamp the result for
@@ -838,6 +838,10 @@ static void shader_setup_scaler(char **shader, struct scaler *scaler, int pass)
(x >= 0 && y >= 0 && x <= 1 && y <= 1)
? "PRIMARY" : "HELPER",
(double)radius, x, y);
+ } else if (d < radius) {
+ // Samples on the edge, these are potential values
+ APPENDF(shader, "SAMPLE_POLAR_POTENTIAL(LUT, %f, %d, %d) \\\n ",
+ (double)radius, x, y);
}
}
}
diff --git a/video/out/gl_video_shaders.glsl b/video/out/gl_video_shaders.glsl
index f8aef48b9b..b95953bfa6 100644
--- a/video/out/gl_video_shaders.glsl
+++ b/video/out/gl_video_shaders.glsl
@@ -312,6 +312,11 @@ float[6] weights6(sampler2D lookup, float f) {
lo = min(lo, c); \
hi = max(hi, c);
+#define SAMPLE_POLAR_POTENTIAL(LUT, R, X, Y) \
+ if (length(vec2(X, Y) - fcoord)/R < 1.0) { \
+ SAMPLE_POLAR_HELPER(LUT, R, X, Y) \
+ }
+
#define SAMPLE_CONVOLUTION_POLAR_R(NAME, R, LUT, WEIGHTS_FN, ANTIRING) \
vec4 NAME(VIDEO_SAMPLER tex, vec2 texsize, vec2 texcoord) { \
vec2 pt = vec2(1.0) / texsize; \