[Mesa-dev] [PATCH v2 1/8] nir: add builtin builder
Jason Ekstrand
jason at jlekstrand.net
Mon Jul 16 14:45:50 UTC 2018
On Mon, Jul 16, 2018 at 7:28 AM Karol Herbst <kherbst at redhat.com> wrote:
> also move some of the GLSL builtins over we will need for implementing
> some OpenCL builtins
>
> v2: replace NIR_IMM_FP by nir_imm_floatN_t in ported code
> fix up changes caused by swizzle rework
>
> 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 | 65 +++++++++++++++++++++
> src/compiler/nir/nir_builtin_builder.h | 79 ++++++++++++++++++++++++++
> src/compiler/spirv/vtn_glsl450.c | 58 +++++--------------
> 5 files changed, 161 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..252a7691f36
> --- /dev/null
> +++ b/src/compiler/nir/nir_builtin_builder.c
> @@ -0,0 +1,65 @@
> +/*
> + * 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"
> +
> +nir_ssa_def*
> +nir_cross(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
> +{
> + unsigned yzx[3] = { 1, 2, 0 };
> + unsigned zxy[3] = { 2, 0, 1 };
> +
> + 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_floatN_t(b, 2.0, x->bit_size);
> + nir_ssa_def *f3 = nir_imm_floatN_t(b, 3.0, x->bit_size);
> +
> + /* 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"
> +
>
Mind throwing in a comment saying how functions are sorted? Either way,
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
> +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 9ef066e8e6d..06a49e48e3f 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[3] = { 1, 2, 0 };
> - unsigned zxy[3] = { 2, 0, 1 };
> - 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/20180716/370c5827/attachment-0001.html>
More information about the mesa-dev
mailing list