<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Thu, Jul 12, 2018 at 4:30 AM Karol Herbst <<a href="mailto:kherbst@redhat.com">kherbst@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">also move some of the GLSL builtins over we will need for implementing<br>
some OpenCL builtins<br>
<br>
Signed-off-by: Karol Herbst <<a href="mailto:kherbst@redhat.com" target="_blank">kherbst@redhat.com</a>><br>
---<br>
 src/compiler/Makefile.sources          |  2 +<br>
 src/compiler/nir/meson.build           |  2 +<br>
 src/compiler/nir/nir_builtin_builder.c | 67 ++++++++++++++++++++++<br>
 src/compiler/nir/nir_builtin_builder.h | 79 ++++++++++++++++++++++++++<br>
 src/compiler/spirv/vtn_glsl450.c       | 58 +++++--------------<br>
 5 files changed, 163 insertions(+), 45 deletions(-)<br>
 create mode 100644 src/compiler/nir/nir_builtin_builder.c<br>
 create mode 100644 src/compiler/nir/nir_builtin_builder.h<br>
<br>
diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources<br>
index db4dd1e89f4..cc147218c4e 100644<br>
--- a/src/compiler/Makefile.sources<br>
+++ b/src/compiler/Makefile.sources<br>
@@ -203,6 +203,8 @@ NIR_FILES = \<br>
        nir/nir.c \<br>
        nir/nir.h \<br>
        nir/nir_builder.h \<br>
+       nir/nir_builtin_builder.c \<br>
+       nir/nir_builtin_builder.h \<br>
        nir/nir_clone.c \<br>
        nir/nir_constant_expressions.h \<br>
        nir/nir_control_flow.c \<br>
diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build<br>
index 28aa8de7014..a1bb19356ce 100644<br>
--- a/src/compiler/nir/meson.build<br>
+++ b/src/compiler/nir/meson.build<br>
@@ -87,6 +87,8 @@ files_libnir = files(<br>
   'nir.c',<br>
   'nir.h',<br>
   'nir_builder.h',<br>
+  'nir_builtin_builder.c',<br>
+  'nir_builtin_builder.h',<br>
   'nir_clone.c',<br>
   'nir_constant_expressions.h',<br>
   'nir_control_flow.c',<br>
diff --git a/src/compiler/nir/nir_builtin_builder.c b/src/compiler/nir/nir_builtin_builder.c<br>
new file mode 100644<br>
index 00000000000..c8cc3fa4aac<br>
--- /dev/null<br>
+++ b/src/compiler/nir/nir_builtin_builder.c<br>
@@ -0,0 +1,67 @@<br>
+/*<br>
+ * Copyright © 2018 Red Hat Inc.<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
+ * IN THE SOFTWARE.<br>
+ */<br>
+<br>
+#include "nir.h"<br>
+#include "nir_builtin_builder.h"<br>
+<br>
+#define NIR_IMM_FP(n, s, v) (s->bit_size == 64 ? nir_imm_double(n, v) : nir_imm_float(n, v))<br>
+<br>
+nir_ssa_def*<br>
+nir_cross(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)<br>
+{<br>
+   unsigned yzx[4] = { 1, 2, 0, 0 };<br>
+   unsigned zxy[4] = { 2, 0, 1, 0 };<br></blockquote><div><br></div><div>I think you want these to be arrays of three things. :-)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+   return nir_fsub(b, nir_fmul(b, nir_swizzle(b, x, yzx, 3, true),<br>
+                                  nir_swizzle(b, y, zxy, 3, true)),<br>
+                      nir_fmul(b, nir_swizzle(b, x, zxy, 3, true),<br>
+                                  nir_swizzle(b, y, yzx, 3, true)));<br>
+}<br>
+<br>
+nir_ssa_def*<br>
+nir_fast_length(nir_builder *b, nir_ssa_def *vec)<br>
+{<br>
+   switch (vec->num_components) {<br>
+   case 1: return nir_fsqrt(b, nir_fmul(b, vec, vec));<br>
+   case 2: return nir_fsqrt(b, nir_fdot2(b, vec, vec));<br>
+   case 3: return nir_fsqrt(b, nir_fdot3(b, vec, vec));<br>
+   case 4: return nir_fsqrt(b, nir_fdot4(b, vec, vec));<br>
+   default:<br>
+      unreachable("Invalid number of components");<br>
+   }<br>
+}<br>
+<br>
+nir_ssa_def*<br>
+nir_smoothstep(nir_builder *b, nir_ssa_def *edge0, nir_ssa_def *edge1, nir_ssa_def *x)<br>
+{<br>
+   nir_ssa_def *f2 = NIR_IMM_FP(b, x, 2.0);<br>
+   nir_ssa_def *f3 = NIR_IMM_FP(b, x, 3.0);<br>
+<br>
+   /* t = clamp((x - edge0) / (edge1 - edge0), 0, 1) */<br>
+   nir_ssa_def *t =<br>
+      nir_fsat(b, nir_fdiv(b, nir_fsub(b, x, edge0),<br>
+                              nir_fsub(b, edge1, edge0)));<br>
+<br>
+   /* result = t * t * (3 - 2 * t) */<br>
+   return nir_fmul(b, t, nir_fmul(b, t, nir_fsub(b, f3, nir_fmul(b, f2, t))));<br>
+}<br>
diff --git a/src/compiler/nir/nir_builtin_builder.h b/src/compiler/nir/nir_builtin_builder.h<br>
new file mode 100644<br>
index 00000000000..5b76d012c85<br>
--- /dev/null<br>
+++ b/src/compiler/nir/nir_builtin_builder.h<br>
@@ -0,0 +1,79 @@<br>
+/*<br>
+ * Copyright © 2018 Red Hat Inc.<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
+ * IN THE SOFTWARE.<br>
+ */<br>
+<br>
+#ifndef NIR_BUILTIN_BUILDER_H<br>
+#define NIR_BUILTIN_BUILDER_H<br>
+<br>
+#include "nir/nir_builder.h"<br>
+<br>
+nir_ssa_def* nir_cross(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);<br>
+nir_ssa_def* nir_fast_length(nir_builder *b, nir_ssa_def *vec);<br>
+nir_ssa_def* nir_smoothstep(nir_builder *b, nir_ssa_def *edge0,<br>
+                            nir_ssa_def *edge1, nir_ssa_def *x);<br>
+<br>
+static inline nir_ssa_def *<br>
+nir_fclamp(nir_builder *b,<br>
+           nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)<br>
+{<br>
+   return nir_fmin(b, nir_fmax(b, x, min_val), max_val);<br>
+}<br>
+<br>
+static inline nir_ssa_def *<br>
+nir_iclamp(nir_builder *b,<br>
+           nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)<br>
+{<br>
+   return nir_imin(b, nir_imax(b, x, min_val), max_val);<br>
+}<br>
+<br>
+static inline nir_ssa_def *<br>
+nir_uclamp(nir_builder *b,<br>
+           nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)<br>
+{<br>
+   return nir_umin(b, nir_umax(b, x, min_val), max_val);<br>
+}<br>
+<br>
+static inline nir_ssa_def *<br>
+nir_degrees(nir_builder *b, nir_ssa_def *val)<br>
+{<br>
+   return nir_fmul(b, val, nir_imm_float(b, 57.2957795131));<br>
+}<br>
+<br>
+static inline nir_ssa_def *<br>
+nir_fast_distance(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)<br>
+{<br>
+   return nir_fast_length(b, nir_fsub(b, x, y));<br>
+}<br>
+<br>
+static inline nir_ssa_def*<br>
+nir_fast_normalize(nir_builder *b, nir_ssa_def *vec)<br>
+{<br>
+   return nir_fdiv(b, vec, nir_fast_length(b, vec));<br>
+}<br>
+<br>
+static inline nir_ssa_def *<br>
+nir_radians(nir_builder *b, nir_ssa_def *val)<br>
+{<br>
+   return nir_fmul(b, val, nir_imm_float(b, 0.01745329251));<br>
+}<br>
+<br>
+#endif /* NIR_BUILTIN_BUILDER_H */<br>
diff --git a/src/compiler/spirv/vtn_glsl450.c b/src/compiler/spirv/vtn_glsl450.c<br>
index 8393450f2f4..8f9908fcd85 100644<br>
--- a/src/compiler/spirv/vtn_glsl450.c<br>
+++ b/src/compiler/spirv/vtn_glsl450.c<br>
@@ -26,6 +26,9 @@<br>
  */<br>
<br>
 #include <math.h><br>
+<br>
+#include "nir/nir_builtin_builder.h"<br>
+<br>
 #include "vtn_private.h"<br>
 #include "GLSL.std.450.h"<br>
<br>
@@ -168,26 +171,6 @@ matrix_inverse(struct vtn_builder *b, struct vtn_ssa_value *src)<br>
    return val;<br>
 }<br>
<br>
-static nir_ssa_def*<br>
-build_length(nir_builder *b, nir_ssa_def *vec)<br>
-{<br>
-   switch (vec->num_components) {<br>
-   case 1: return nir_fsqrt(b, nir_fmul(b, vec, vec));<br>
-   case 2: return nir_fsqrt(b, nir_fdot2(b, vec, vec));<br>
-   case 3: return nir_fsqrt(b, nir_fdot3(b, vec, vec));<br>
-   case 4: return nir_fsqrt(b, nir_fdot4(b, vec, vec));<br>
-   default:<br>
-      unreachable("Invalid number of components");<br>
-   }<br>
-}<br>
-<br>
-static inline nir_ssa_def *<br>
-build_fclamp(nir_builder *b,<br>
-             nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)<br>
-{<br>
-   return nir_fmin(b, nir_fmax(b, x, min_val), max_val);<br>
-}<br>
-<br>
 /**<br>
  * Return e^x.<br>
  */<br>
@@ -540,10 +523,10 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,<br>
<br>
    switch (entrypoint) {<br>
    case GLSLstd450Radians:<br>
-      val->ssa->def = nir_fmul(nb, src[0], nir_imm_float(nb, 0.01745329251));<br>
+      val->ssa->def = nir_radians(nb, src[0]);<br>
       return;<br>
    case GLSLstd450Degrees:<br>
-      val->ssa->def = nir_fmul(nb, src[0], nir_imm_float(nb, 57.2957795131));<br>
+      val->ssa->def = nir_degrees(nb, src[0]);<br>
       return;<br>
    case GLSLstd450Tan:<br>
       val->ssa->def = nir_fdiv(nb, nir_fsin(nb, src[0]),<br>
@@ -573,13 +556,13 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,<br>
       return;<br>
<br>
    case GLSLstd450Length:<br>
-      val->ssa->def = build_length(nb, src[0]);<br>
+      val->ssa->def = nir_fast_length(nb, src[0]);<br>
       return;<br>
    case GLSLstd450Distance:<br>
-      val->ssa->def = build_length(nb, nir_fsub(nb, src[0], src[1]));<br>
+      val->ssa->def = nir_fast_distance(nb, src[0], src[1]);<br>
       return;<br>
    case GLSLstd450Normalize:<br>
-      val->ssa->def = nir_fdiv(nb, src[0], build_length(nb, src[0]));<br>
+      val->ssa->def = nir_fast_normalize(nb, src[0]);<br>
       return;<br>
<br>
    case GLSLstd450Exp:<br>
@@ -592,37 +575,22 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,<br>
<br>
    case GLSLstd450FClamp:<br>
    case GLSLstd450NClamp:<br>
-      val->ssa->def = build_fclamp(nb, src[0], src[1], src[2]);<br>
+      val->ssa->def = nir_fclamp(nb, src[0], src[1], src[2]);<br>
       return;<br>
    case GLSLstd450UClamp:<br>
-      val->ssa->def = nir_umin(nb, nir_umax(nb, src[0], src[1]), src[2]);<br>
+      val->ssa->def = nir_uclamp(nb, src[0], src[1], src[2]);<br>
       return;<br>
    case GLSLstd450SClamp:<br>
-      val->ssa->def = nir_imin(nb, nir_imax(nb, src[0], src[1]), src[2]);<br>
+      val->ssa->def = nir_iclamp(nb, src[0], src[1], src[2]);<br>
       return;<br>
<br>
    case GLSLstd450Cross: {<br>
-      unsigned yzx[4] = { 1, 2, 0, 0 };<br>
-      unsigned zxy[4] = { 2, 0, 1, 0 };<br>
-      val->ssa->def =<br>
-         nir_fsub(nb, nir_fmul(nb, nir_swizzle(nb, src[0], yzx, 3, true),<br>
-                                   nir_swizzle(nb, src[1], zxy, 3, true)),<br>
-                      nir_fmul(nb, nir_swizzle(nb, src[0], zxy, 3, true),<br>
-                                   nir_swizzle(nb, src[1], yzx, 3, true)));<br>
+      val->ssa->def = nir_cross(nb, src[0], src[1]);<br>
       return;<br>
    }<br>
<br>
    case GLSLstd450SmoothStep: {<br>
-      /* t = clamp((x - edge0) / (edge1 - edge0), 0, 1) */<br>
-      nir_ssa_def *t =<br>
-         build_fclamp(nb, nir_fdiv(nb, nir_fsub(nb, src[2], src[0]),<br>
-                                       nir_fsub(nb, src[1], src[0])),<br>
-                          NIR_IMM_FP(nb, 0.0), NIR_IMM_FP(nb, 1.0));<br>
-      /* result = t * t * (3 - 2 * t) */<br>
-      val->ssa->def =<br>
-         nir_fmul(nb, t, nir_fmul(nb, t,<br>
-            nir_fsub(nb, NIR_IMM_FP(nb, 3.0),<br>
-                         nir_fmul(nb, NIR_IMM_FP(nb, 2.0), t))));<br>
+      val->ssa->def = nir_smoothstep(nb, src[0], src[1], src[2]);<br>
       return;<br>
    }<br>
<br>
-- <br>
2.17.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div>