[Mesa-dev] [PATCH 3/6] nir: add builtin builder
Karol Herbst
kherbst at redhat.com
Sun Jul 15 05:37:19 UTC 2018
On Sun, Jul 15, 2018 at 4:29 AM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> 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.
>
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 at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list