On Thu, Jul 12, 2018 at 4:30 AM Karol Herbst <kher...@redhat.com> wrote:
> also move some of the GLSL builtins over we will need for implementing > some OpenCL builtins > > Signed-off-by: Karol Herbst <kher...@redhat.com> > --- > src/compiler/Makefile.sources | 2 + > src/compiler/nir/meson.build | 2 + > src/compiler/nir/nir_builtin_builder.c | 67 ++++++++++++++++++++++ > src/compiler/nir/nir_builtin_builder.h | 79 ++++++++++++++++++++++++++ > src/compiler/spirv/vtn_glsl450.c | 58 +++++-------------- > 5 files changed, 163 insertions(+), 45 deletions(-) > create mode 100644 src/compiler/nir/nir_builtin_builder.c > create mode 100644 src/compiler/nir/nir_builtin_builder.h > > diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources > index db4dd1e89f4..cc147218c4e 100644 > --- a/src/compiler/Makefile.sources > +++ b/src/compiler/Makefile.sources > @@ -203,6 +203,8 @@ NIR_FILES = \ > nir/nir.c \ > nir/nir.h \ > nir/nir_builder.h \ > + nir/nir_builtin_builder.c \ > + nir/nir_builtin_builder.h \ > nir/nir_clone.c \ > nir/nir_constant_expressions.h \ > nir/nir_control_flow.c \ > diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build > index 28aa8de7014..a1bb19356ce 100644 > --- a/src/compiler/nir/meson.build > +++ b/src/compiler/nir/meson.build > @@ -87,6 +87,8 @@ files_libnir = files( > 'nir.c', > 'nir.h', > 'nir_builder.h', > + 'nir_builtin_builder.c', > + 'nir_builtin_builder.h', > 'nir_clone.c', > 'nir_constant_expressions.h', > 'nir_control_flow.c', > diff --git a/src/compiler/nir/nir_builtin_builder.c > b/src/compiler/nir/nir_builtin_builder.c > new file mode 100644 > index 00000000000..c8cc3fa4aac > --- /dev/null > +++ b/src/compiler/nir/nir_builtin_builder.c > @@ -0,0 +1,67 @@ > +/* > + * Copyright © 2018 Red Hat Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the > "Software"), > + * to deal in the Software without restriction, including without > limitation > + * the rights to use, copy, modify, merge, publish, distribute, > sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the > next > + * paragraph) shall be included in all copies or substantial portions of > the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT > SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > DEALINGS > + * IN THE SOFTWARE. > + */ > + > +#include "nir.h" > +#include "nir_builtin_builder.h" > + > +#define NIR_IMM_FP(n, s, v) (s->bit_size == 64 ? nir_imm_double(n, v) : > nir_imm_float(n, v)) > + > +nir_ssa_def* > +nir_cross(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) > +{ > + unsigned yzx[4] = { 1, 2, 0, 0 }; > + unsigned zxy[4] = { 2, 0, 1, 0 }; > I think you want these to be arrays of three things. :-) > + > + return nir_fsub(b, nir_fmul(b, nir_swizzle(b, x, yzx, 3, true), > + nir_swizzle(b, y, zxy, 3, true)), > + nir_fmul(b, nir_swizzle(b, x, zxy, 3, true), > + nir_swizzle(b, y, yzx, 3, true))); > +} > + > +nir_ssa_def* > +nir_fast_length(nir_builder *b, nir_ssa_def *vec) > +{ > + switch (vec->num_components) { > + case 1: return nir_fsqrt(b, nir_fmul(b, vec, vec)); > + case 2: return nir_fsqrt(b, nir_fdot2(b, vec, vec)); > + case 3: return nir_fsqrt(b, nir_fdot3(b, vec, vec)); > + case 4: return nir_fsqrt(b, nir_fdot4(b, vec, vec)); > + default: > + unreachable("Invalid number of components"); > + } > +} > + > +nir_ssa_def* > +nir_smoothstep(nir_builder *b, nir_ssa_def *edge0, nir_ssa_def *edge1, > nir_ssa_def *x) > +{ > + nir_ssa_def *f2 = NIR_IMM_FP(b, x, 2.0); > + nir_ssa_def *f3 = NIR_IMM_FP(b, x, 3.0); > + > + /* t = clamp((x - edge0) / (edge1 - edge0), 0, 1) */ > + nir_ssa_def *t = > + nir_fsat(b, nir_fdiv(b, nir_fsub(b, x, edge0), > + nir_fsub(b, edge1, edge0))); > + > + /* result = t * t * (3 - 2 * t) */ > + return nir_fmul(b, t, nir_fmul(b, t, nir_fsub(b, f3, nir_fmul(b, f2, > t)))); > +} > diff --git a/src/compiler/nir/nir_builtin_builder.h > b/src/compiler/nir/nir_builtin_builder.h > new file mode 100644 > index 00000000000..5b76d012c85 > --- /dev/null > +++ b/src/compiler/nir/nir_builtin_builder.h > @@ -0,0 +1,79 @@ > +/* > + * Copyright © 2018 Red Hat Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the > "Software"), > + * to deal in the Software without restriction, including without > limitation > + * the rights to use, copy, modify, merge, publish, distribute, > sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the > next > + * paragraph) shall be included in all copies or substantial portions of > the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT > SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > DEALINGS > + * IN THE SOFTWARE. > + */ > + > +#ifndef NIR_BUILTIN_BUILDER_H > +#define NIR_BUILTIN_BUILDER_H > + > +#include "nir/nir_builder.h" > + > +nir_ssa_def* nir_cross(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y); > +nir_ssa_def* nir_fast_length(nir_builder *b, nir_ssa_def *vec); > +nir_ssa_def* nir_smoothstep(nir_builder *b, nir_ssa_def *edge0, > + nir_ssa_def *edge1, nir_ssa_def *x); > + > +static inline nir_ssa_def * > +nir_fclamp(nir_builder *b, > + nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val) > +{ > + return nir_fmin(b, nir_fmax(b, x, min_val), max_val); > +} > + > +static inline nir_ssa_def * > +nir_iclamp(nir_builder *b, > + nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val) > +{ > + return nir_imin(b, nir_imax(b, x, min_val), max_val); > +} > + > +static inline nir_ssa_def * > +nir_uclamp(nir_builder *b, > + nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val) > +{ > + return nir_umin(b, nir_umax(b, x, min_val), max_val); > +} > + > +static inline nir_ssa_def * > +nir_degrees(nir_builder *b, nir_ssa_def *val) > +{ > + return nir_fmul(b, val, nir_imm_float(b, 57.2957795131)); > +} > + > +static inline nir_ssa_def * > +nir_fast_distance(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y) > +{ > + return nir_fast_length(b, nir_fsub(b, x, y)); > +} > + > +static inline nir_ssa_def* > +nir_fast_normalize(nir_builder *b, nir_ssa_def *vec) > +{ > + return nir_fdiv(b, vec, nir_fast_length(b, vec)); > +} > + > +static inline nir_ssa_def * > +nir_radians(nir_builder *b, nir_ssa_def *val) > +{ > + return nir_fmul(b, val, nir_imm_float(b, 0.01745329251)); > +} > + > +#endif /* NIR_BUILTIN_BUILDER_H */ > diff --git a/src/compiler/spirv/vtn_glsl450.c > b/src/compiler/spirv/vtn_glsl450.c > index 8393450f2f4..8f9908fcd85 100644 > --- a/src/compiler/spirv/vtn_glsl450.c > +++ b/src/compiler/spirv/vtn_glsl450.c > @@ -26,6 +26,9 @@ > */ > > #include <math.h> > + > +#include "nir/nir_builtin_builder.h" > + > #include "vtn_private.h" > #include "GLSL.std.450.h" > > @@ -168,26 +171,6 @@ matrix_inverse(struct vtn_builder *b, struct > vtn_ssa_value *src) > return val; > } > > -static nir_ssa_def* > -build_length(nir_builder *b, nir_ssa_def *vec) > -{ > - switch (vec->num_components) { > - case 1: return nir_fsqrt(b, nir_fmul(b, vec, vec)); > - case 2: return nir_fsqrt(b, nir_fdot2(b, vec, vec)); > - case 3: return nir_fsqrt(b, nir_fdot3(b, vec, vec)); > - case 4: return nir_fsqrt(b, nir_fdot4(b, vec, vec)); > - default: > - unreachable("Invalid number of components"); > - } > -} > - > -static inline nir_ssa_def * > -build_fclamp(nir_builder *b, > - nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val) > -{ > - return nir_fmin(b, nir_fmax(b, x, min_val), max_val); > -} > - > /** > * Return e^x. > */ > @@ -540,10 +523,10 @@ handle_glsl450_alu(struct vtn_builder *b, enum > GLSLstd450 entrypoint, > > switch (entrypoint) { > case GLSLstd450Radians: > - val->ssa->def = nir_fmul(nb, src[0], nir_imm_float(nb, > 0.01745329251)); > + val->ssa->def = nir_radians(nb, src[0]); > return; > case GLSLstd450Degrees: > - val->ssa->def = nir_fmul(nb, src[0], nir_imm_float(nb, > 57.2957795131)); > + val->ssa->def = nir_degrees(nb, src[0]); > return; > case GLSLstd450Tan: > val->ssa->def = nir_fdiv(nb, nir_fsin(nb, src[0]), > @@ -573,13 +556,13 @@ handle_glsl450_alu(struct vtn_builder *b, enum > GLSLstd450 entrypoint, > return; > > case GLSLstd450Length: > - val->ssa->def = build_length(nb, src[0]); > + val->ssa->def = nir_fast_length(nb, src[0]); > return; > case GLSLstd450Distance: > - val->ssa->def = build_length(nb, nir_fsub(nb, src[0], src[1])); > + val->ssa->def = nir_fast_distance(nb, src[0], src[1]); > return; > case GLSLstd450Normalize: > - val->ssa->def = nir_fdiv(nb, src[0], build_length(nb, src[0])); > + val->ssa->def = nir_fast_normalize(nb, src[0]); > return; > > case GLSLstd450Exp: > @@ -592,37 +575,22 @@ handle_glsl450_alu(struct vtn_builder *b, enum > GLSLstd450 entrypoint, > > case GLSLstd450FClamp: > case GLSLstd450NClamp: > - val->ssa->def = build_fclamp(nb, src[0], src[1], src[2]); > + val->ssa->def = nir_fclamp(nb, src[0], src[1], src[2]); > return; > case GLSLstd450UClamp: > - val->ssa->def = nir_umin(nb, nir_umax(nb, src[0], src[1]), src[2]); > + val->ssa->def = nir_uclamp(nb, src[0], src[1], src[2]); > return; > case GLSLstd450SClamp: > - val->ssa->def = nir_imin(nb, nir_imax(nb, src[0], src[1]), src[2]); > + val->ssa->def = nir_iclamp(nb, src[0], src[1], src[2]); > return; > > case GLSLstd450Cross: { > - unsigned yzx[4] = { 1, 2, 0, 0 }; > - unsigned zxy[4] = { 2, 0, 1, 0 }; > - val->ssa->def = > - nir_fsub(nb, nir_fmul(nb, nir_swizzle(nb, src[0], yzx, 3, true), > - nir_swizzle(nb, src[1], zxy, 3, true)), > - nir_fmul(nb, nir_swizzle(nb, src[0], zxy, 3, true), > - nir_swizzle(nb, src[1], yzx, 3, > true))); > + val->ssa->def = nir_cross(nb, src[0], src[1]); > return; > } > > case GLSLstd450SmoothStep: { > - /* t = clamp((x - edge0) / (edge1 - edge0), 0, 1) */ > - nir_ssa_def *t = > - build_fclamp(nb, nir_fdiv(nb, nir_fsub(nb, src[2], src[0]), > - nir_fsub(nb, src[1], src[0])), > - NIR_IMM_FP(nb, 0.0), NIR_IMM_FP(nb, 1.0)); > - /* result = t * t * (3 - 2 * t) */ > - val->ssa->def = > - nir_fmul(nb, t, nir_fmul(nb, t, > - nir_fsub(nb, NIR_IMM_FP(nb, 3.0), > - nir_fmul(nb, NIR_IMM_FP(nb, 2.0), t)))); > + val->ssa->def = nir_smoothstep(nb, src[0], src[1], src[2]); > return; > } > > -- > 2.17.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev