<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>