On Sun, Jul 15, 2018 at 4:29 AM, Jason Ekstrand <ja...@jlekstrand.net> wrote: > 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 }; >> + >> + 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)); >> +} > > > Are you sorting alphabetically or something? I'm just wondering why radians > is not next to degrees. >
yeah, I tried to order alphabetically without the type/fast prefix >> >> + >> +#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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev