Re: [Mesa-dev] [PATCH 3/6] nir: add builtin builder
On Sun, Jul 15, 2018 at 4:29 AM, Jason Ekstrand wrote: > On Thu, Jul 12, 2018 at 4:30 AM Karol Herbst wrote: >> >> also move some of the GLSL builtins over we will need for implementing >> some OpenCL builtins >> >> Signed-off-by: Karol Herbst >> --- >> 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 000..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
Re: [Mesa-dev] [PATCH 3/6] nir: add builtin builder
On Thu, Jul 12, 2018 at 4:30 AM Karol Herbst wrote: > also move some of the GLSL builtins over we will need for implementing > some OpenCL builtins > > Signed-off-by: Karol Herbst > --- > 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 000..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 000..5b76d012c85 > --- /dev/null > +++ b/src/compiler/nir/nir_builtin_builder.h > @@ -0,0 +1,79 @@ > +/* > + * Copyright © 2018 Red Hat Inc. >
Re: [Mesa-dev] [PATCH 3/6] nir: add builtin builder
On Thu, Jul 12, 2018 at 4:30 AM Karol Herbst wrote: > also move some of the GLSL builtins over we will need for implementing > some OpenCL builtins > > Signed-off-by: Karol Herbst > --- > 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 000..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 000..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
[Mesa-dev] [PATCH 3/6] nir: add builtin builder
also move some of the GLSL builtins over we will need for implementing some OpenCL builtins Signed-off-by: Karol Herbst --- 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 000..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 000..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