aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylvain Munaut <tnt@246tNt.com>2015-01-20 21:52:47 +0100
committerSylvain Munaut <tnt@246tNt.com>2015-01-20 21:54:52 +0100
commit985c78ffa7ecfc0d4b5b43d2541e68a9e6d94576 (patch)
tree23d686674705d7a24f91e4e73550f8f38a5d6cb5
parent1603497411d30a12e9822abe0a6cf3c021298941 (diff)
fosphor/cl: Handle invalid (infinite/nan) data better so it recovers
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
-rw-r--r--lib/fosphor/display.cl13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/fosphor/display.cl b/lib/fosphor/display.cl
index feb8be0..75a24dd 100644
--- a/lib/fosphor/display.cl
+++ b/lib/fosphor/display.cl
@@ -203,6 +203,9 @@ __kernel void display(
/* Compute vertex position */
vertex = live_vbo[i];
+ if (!isfinite(vertex.y)) /* Safety if previous val is weird */
+ vertex.y = sum / get_local_size(1);
+
vertex.x = ((float)i / (float)n) - 1.0f;
vertex.y = vertex.y * native_powr(live_one_minus_alpha, (float)fft_batch) +
sum * live_alpha;
@@ -283,25 +286,27 @@ __kernel void display(
n = get_global_size(0) >> 1;
i = get_global_id(0) ^ n;
+ max_pwr = max_vbo[i].y;
+ if (!isfinite(max_pwr))
+ max_pwr = - MAXFLOAT; /* Will be replaced by max() below */
+
vertex.x = ((float)i / (float)n) - 1.0f;
#ifdef MAX_HOLD_LIVE
- vertex.y = max(live_vbo[i].y, max_vbo[i].y);
+ vertex.y = max(live_vbo[i].y, max_pwr);
#endif
#ifdef MAX_HOLD_NORMAL
- max_pwr = max_vbo[i].y;
for (i=0; i<get_local_size(1); i++)
max_pwr = max(max_pwr, max_buf[i * get_local_size(0) + get_local_id(0)]);
vertex.y = max_pwr;
#endif
#ifdef MAX_HOLD_DECAY
- max_pwr = max_vbo[i].y * 0.999f + 0.001f * live_vbo[i].y;
+ max_pwr = max_pwr * 0.999f + 0.001f * live_vbo[i].y;
for (j=0; j<get_local_size(1); j++)
max_pwr = max(max_pwr, max_buf[j * get_local_size(0) + get_local_id(0)]);
vertex.y = max_pwr;
#endif
max_vbo[i] = vertex;
-
}
}