[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