[Mesa-dev] [PATCH 4/5] nir: implement GLSL.std.450 NMax operation

Juan A. Suarez Romero jasuarez at igalia.com
Mon Jun 12 16:33:57 UTC 2017


---
 src/compiler/spirv/vtn_glsl450.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/compiler/spirv/vtn_glsl450.c b/src/compiler/spirv/vtn_glsl450.c
index 5e75c3c..ce80360 100644
--- a/src/compiler/spirv/vtn_glsl450.c
+++ b/src/compiler/spirv/vtn_glsl450.c
@@ -225,6 +225,25 @@ build_nmin(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
 }
 
 /**
+ * Returns
+ *  if (isNan(x))
+ *    return y
+ *  else if (isNan(y))
+ *    return x
+ *  else
+ *    return min(x, y)
+ */
+static nir_ssa_def *
+build_nmax(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
+{
+   return nir_bcsel(b, nir_fne(b, x, x),
+                    y,
+                    nir_bcsel(b, nir_fne(b, y, y),
+                              x,
+                              nir_fmax(b, x, y)));
+}
+
+/**
  * Approximate asin(x) by the formula:
  *    asin~(x) = sign(x) * (pi/2 - sqrt(1 - |x|) * (pi/2 + |x|(pi/4 - 1 + |x|(p0 + |x|p1))))
  *
@@ -555,6 +574,10 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,
       val->ssa->def = build_nmin(nb, src[0], src[1]);
       return;
 
+   case GLSLstd450NMax:
+      val->ssa->def = build_nmax(nb, src[0], src[1]);
+      return;
+
    case GLSLstd450Log:
       val->ssa->def = build_log(nb, src[0]);
       return;
-- 
2.9.4



More information about the mesa-dev mailing list