|
22 | 22 |
|
23 | 23 | #include <clc/clc.h> |
24 | 24 | #include <clc/clcmacro.h> |
| 25 | +#include <clc/common/clc_smoothstep.h> |
25 | 26 |
|
26 | | -_CLC_OVERLOAD _CLC_DEF float smoothstep(float edge0, float edge1, float x) { |
27 | | - float t = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); |
28 | | - return t * t * (3.0f - 2.0f * t); |
29 | | -} |
| 27 | +#define SMOOTHSTEP_SINGLE_DEF(X_TYPE) \ |
| 28 | + _CLC_OVERLOAD _CLC_DEF X_TYPE smoothstep(X_TYPE edge0, X_TYPE edge1, \ |
| 29 | + X_TYPE x) { \ |
| 30 | + return __clc_smoothstep(edge0, edge1, x); \ |
| 31 | + } |
30 | 32 |
|
31 | | -_CLC_TERNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, smoothstep, float, float, float); |
| 33 | +#define SMOOTHSTEP_S_S_V_DEFS(X_TYPE) \ |
| 34 | + _CLC_OVERLOAD _CLC_DEF X_TYPE##2 smoothstep(X_TYPE x, X_TYPE y, \ |
| 35 | + X_TYPE##2 z) { \ |
| 36 | + return __clc_smoothstep((X_TYPE##2)x, (X_TYPE##2)y, z); \ |
| 37 | + } \ |
| 38 | + \ |
| 39 | + _CLC_OVERLOAD _CLC_DEF X_TYPE##3 smoothstep(X_TYPE x, X_TYPE y, \ |
| 40 | + X_TYPE##3 z) { \ |
| 41 | + return __clc_smoothstep((X_TYPE##3)x, (X_TYPE##3)y, z); \ |
| 42 | + } \ |
| 43 | + \ |
| 44 | + _CLC_OVERLOAD _CLC_DEF X_TYPE##4 smoothstep(X_TYPE x, X_TYPE y, \ |
| 45 | + X_TYPE##4 z) { \ |
| 46 | + return __clc_smoothstep((X_TYPE##4)x, (X_TYPE##4)y, z); \ |
| 47 | + } \ |
| 48 | + \ |
| 49 | + _CLC_OVERLOAD _CLC_DEF X_TYPE##8 smoothstep(X_TYPE x, X_TYPE y, \ |
| 50 | + X_TYPE##8 z) { \ |
| 51 | + return __clc_smoothstep((X_TYPE##8)x, (X_TYPE##8)y, z); \ |
| 52 | + } \ |
| 53 | + \ |
| 54 | + _CLC_OVERLOAD _CLC_DEF X_TYPE##16 smoothstep(X_TYPE x, X_TYPE y, \ |
| 55 | + X_TYPE##16 z) { \ |
| 56 | + return __clc_smoothstep((X_TYPE##16)x, (X_TYPE##16)y, z); \ |
| 57 | + } |
32 | 58 |
|
33 | | -_CLC_V_S_S_V_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, smoothstep, float, float, float); |
| 59 | +#define SMOOTHSTEP_DEF(type) \ |
| 60 | + SMOOTHSTEP_SINGLE_DEF(type) \ |
| 61 | + SMOOTHSTEP_SINGLE_DEF(type##2) \ |
| 62 | + SMOOTHSTEP_SINGLE_DEF(type##3) \ |
| 63 | + SMOOTHSTEP_SINGLE_DEF(type##4) \ |
| 64 | + SMOOTHSTEP_SINGLE_DEF(type##8) \ |
| 65 | + SMOOTHSTEP_SINGLE_DEF(type##16) \ |
| 66 | + SMOOTHSTEP_S_S_V_DEFS(type) |
| 67 | + |
| 68 | +SMOOTHSTEP_DEF(float) |
34 | 69 |
|
35 | 70 | #ifdef cl_khr_fp64 |
36 | 71 | #pragma OPENCL EXTENSION cl_khr_fp64 : enable |
37 | 72 |
|
38 | | -#define SMOOTH_STEP_DEF(edge_type, x_type, impl) \ |
39 | | - _CLC_OVERLOAD _CLC_DEF x_type smoothstep(edge_type edge0, edge_type edge1, x_type x) { \ |
40 | | - double t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); \ |
41 | | - return t * t * (3.0 - 2.0 * t); \ |
42 | | - } |
43 | | - |
44 | | -SMOOTH_STEP_DEF(double, double, SMOOTH_STEP_IMPL_D); |
| 73 | +SMOOTHSTEP_DEF(double); |
45 | 74 |
|
46 | | -_CLC_TERNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, smoothstep, double, double, double); |
| 75 | +#endif |
47 | 76 |
|
48 | | -#if !defined(CLC_SPIRV) |
49 | | -SMOOTH_STEP_DEF(float, double, SMOOTH_STEP_IMPL_D); |
50 | | -SMOOTH_STEP_DEF(double, float, SMOOTH_STEP_IMPL_D); |
| 77 | +#ifdef cl_khr_fp16 |
| 78 | +#pragma OPENCL EXTENSION cl_khr_fp16 : enable |
51 | 79 |
|
52 | | -_CLC_V_S_S_V_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, smoothstep, float, float, double); |
53 | | -_CLC_V_S_S_V_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, smoothstep, double, double, float); |
54 | | -#endif |
| 80 | +SMOOTHSTEP_DEF(half); |
55 | 81 |
|
56 | 82 | #endif |
0 commit comments