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

Jason Ekstrand jason at jlekstrand.net
Sun Jul 15 02:29:34 UTC 2018


On Thu, Jul 12, 2018 at 4:30 AM Karol Herbst <kherbst at redhat.com> wrote:

> also move some of the GLSL builtins over we will need for implementing
> some OpenCL builtins
>
> Signed-off-by: Karol Herbst <kherbst at 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.


> +
> +#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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180714/4589afaa/attachment-0001.html>


More information about the mesa-dev mailing list