Re: [Mesa-dev] [PATCH 3/6] nir: add builtin builder

2018-07-14 Thread Karol Herbst
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

2018-07-14 Thread Jason Ekstrand
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

2018-07-14 Thread Jason Ekstrand
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

2018-07-12 Thread Karol Herbst
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