<div dir="ltr">Looks good to me :)<div>Reviewed-by: Plamena Manolova <<a href="mailto:plamena.manolova@intel.com">plamena.manolova@intel.com</a>></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 14, 2017 at 4:34 AM, Jason Ekstrand <span dir="ltr"><<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The original version was very convoluted and tried way too hard to not<br>
just have the nested switch statement that it needs.  Let's just write<br>
the obvious code and then we know it's correct.  This fixes a bunch of<br>
missing cases particularly with int64.<br>
<br>
---<br>
This patch has to be inserted before the earlier patch I wrote to<br>
glsl_to_nir which makes it use this function.  The function was sufficiently<br>
broken that making glsl_to_nir use it regresses a bunch of stuff.<br>
<br>
 src/compiler/nir/nir.c | 155 +++++++++++++++++++++++++++++-<wbr>-------------------<br>
 1 file changed, 92 insertions(+), 63 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c<br>
index a9fac96..37fd9cb 100644<br>
--- a/src/compiler/nir/nir.c<br>
+++ b/src/compiler/nir/nir.c<br>
@@ -1967,87 +1967,116 @@ nir_type_conversion_op(nir_<wbr>alu_type src, nir_alu_type dst)<br>
    unsigned src_bitsize = nir_alu_type_get_type_size(<wbr>src);<br>
    unsigned dst_bitsize = nir_alu_type_get_type_size(<wbr>dst);<br>
<br>
-   if (src_base_type == dst_base_type) {<br>
-      if (src_bitsize == dst_bitsize)<br>
-         return (src_base_type == nir_type_float) ? nir_op_fmov : nir_op_imov;<br>
-<br>
-      assert(src_bitsize == 64 || dst_bitsize == 64);<br>
-      if (src_base_type == nir_type_float)<br>
-         /* TODO: implement support for float16 */<br>
-         return (src_bitsize == 64) ? nir_op_d2f : nir_op_f2d;<br>
-      else if (src_base_type == nir_type_uint)<br>
-         return (src_bitsize == 64) ? nir_op_imov : nir_op_u2u64;<br>
-      else if (src_base_type == nir_type_int)<br>
-         return (src_bitsize == 64) ? nir_op_imov : nir_op_i2i64;<br>
-      unreachable("Invalid conversion");<br>
-   }<br>
-<br>
-   /* Different base type but same bit_size */<br>
    if (src_bitsize == dst_bitsize) {<br>
-      /* TODO: This does not include specific conversions between<br>
-       * signed or unsigned integer types of bit size different than 32 yet.<br>
-       */<br>
-      assert(src_bitsize == 32);<br>
       switch (src_base_type) {<br>
-      case nir_type_uint:<br>
-         return (dst_base_type == nir_type_float) ? nir_op_u2f : nir_op_imov;<br>
       case nir_type_int:<br>
-         return (dst_base_type == nir_type_float) ? nir_op_i2f : nir_op_imov;<br>
-      case nir_type_bool:<br>
-         return (dst_base_type == nir_type_float) ? nir_op_b2f : nir_op_b2i;<br>
+      case nir_type_uint:<br>
+         if (dst_base_type == nir_type_uint || dst_base_type == nir_type_int)<br>
+            return nir_op_imov;<br>
+         break;<br>
       case nir_type_float:<br>
-         switch (dst_base_type) {<br>
-         case nir_type_uint:<br>
-            return nir_op_f2u;<br>
-         case nir_type_bool:<br>
-            return nir_op_f2b;<br>
-         default:<br>
-            return nir_op_f2i;<br>
-         };<br>
+         if (dst_base_type == nir_type_float)<br>
+            return nir_op_fmov;<br>
+         break;<br>
+      case nir_type_bool:<br>
+         if (dst_base_type == nir_type_bool)<br>
+            return nir_op_imov;<br>
+         break;<br>
       default:<br>
          unreachable("Invalid conversion");<br>
-      };<br>
+      }<br>
    }<br>
<br>
-   /* Different bit_size and different base type */<br>
-   /* TODO: Implement integer support for types with bit_size != 32 */<br>
    switch (src_base_type) {<br>
-   case nir_type_uint:<br>
-      if (dst == nir_type_float64)<br>
-         return nir_op_u2d;<br>
-      else if (dst == nir_type_int64)<br>
-         return nir_op_u2i64;<br>
-      break;<br>
    case nir_type_int:<br>
-      if (dst == nir_type_float64)<br>
-         return nir_op_i2d;<br>
-      else if (dst == nir_type_uint64)<br>
-         return nir_op_i2i64;<br>
-      break;<br>
-   case nir_type_bool:<br>
-      assert(dst == nir_type_float64);<br>
-      return nir_op_u2d;<br>
-   case nir_type_float:<br>
-      assert(src_bitsize == 32 || src_bitsize == 64);<br>
-      if (src_bitsize != 64) {<br>
-         assert(dst == nir_type_float64);<br>
-         return nir_op_f2d;<br>
+      switch (dst_base_type) {<br>
+      case nir_type_int:<br>
+         assert(src_bitsize != dst_bitsize);<br>
+         return (dst_bitsize == 32) ? nir_op_i2i32 : nir_op_i2i64;<br>
+      case nir_type_uint:<br>
+         assert(src_bitsize != dst_bitsize);<br>
+         return (dst_bitsize == 32) ? nir_op_i2u32 : nir_op_i2u64;<br>
+      case nir_type_float:<br>
+         switch (src_bitsize) {<br>
+         case 32:<br>
+            return (dst_bitsize == 32) ? nir_op_i2f : nir_op_i2d;<br>
+         case 64:<br>
+            return (dst_bitsize == 32) ? nir_op_i642f : nir_op_i642d;<br>
+         default:<br>
+            unreachable("Invalid conversion");<br>
+         }<br>
+      case nir_type_bool:<br>
+         return (src_bitsize == 32) ? nir_op_i2b : nir_op_i642b;<br>
+      default:<br>
+         unreachable("Invalid conversion");<br>
       }<br>
-      assert(dst_bitsize == 32);<br>
+<br>
+   case nir_type_uint:<br>
       switch (dst_base_type) {<br>
+      case nir_type_int:<br>
+         assert(src_bitsize != dst_bitsize);<br>
+         return (dst_bitsize == 32) ? nir_op_u2i32 : nir_op_u2i64;<br>
       case nir_type_uint:<br>
-         return nir_op_d2u;<br>
+         assert(src_bitsize != dst_bitsize);<br>
+         return (dst_bitsize == 32) ? nir_op_u2u32 : nir_op_u2u64;<br>
+      case nir_type_float:<br>
+         switch (src_bitsize) {<br>
+         case 32:<br>
+            return (dst_bitsize == 32) ? nir_op_u2f : nir_op_u2d;<br>
+         case 64:<br>
+            return (dst_bitsize == 32) ? nir_op_u642f : nir_op_u642d;<br>
+         default:<br>
+            unreachable("Invalid conversion");<br>
+         }<br>
+      case nir_type_bool:<br>
+         return (src_bitsize == 32) ? nir_op_i2b : nir_op_i642b;<br>
+      default:<br>
+         unreachable("Invalid conversion");<br>
+      }<br>
+<br>
+   case nir_type_float:<br>
+      switch (dst_base_type) {<br>
       case nir_type_int:<br>
-         return nir_op_d2i;<br>
+         switch (src_bitsize) {<br>
+         case 32:<br>
+            return (dst_bitsize == 32) ? nir_op_f2i : nir_op_f2i64;<br>
+         case 64:<br>
+            return (dst_bitsize == 32) ? nir_op_d2i : nir_op_f2i64;<br>
+         default:<br>
+            unreachable("Invalid conversion");<br>
+         }<br>
+      case nir_type_uint:<br>
+         switch (src_bitsize) {<br>
+         case 32:<br>
+            return (dst_bitsize == 32) ? nir_op_f2u : nir_op_f2u64;<br>
+         case 64:<br>
+            return (dst_bitsize == 32) ? nir_op_d2u : nir_op_f2u64;<br>
+         default:<br>
+            unreachable("Invalid conversion");<br>
+         }<br>
+      case nir_type_float:<br>
+         assert(src_bitsize != dst_bitsize);<br>
+         return (dst_bitsize == 32) ? nir_op_d2f : nir_op_f2d;<br>
       case nir_type_bool:<br>
-         return nir_op_d2b;<br>
+         return (src_bitsize == 32) ? nir_op_f2b : nir_op_d2b;<br>
+      default:<br>
+         unreachable("Invalid conversion");<br>
+      }<br>
+<br>
+   case nir_type_bool:<br>
+      switch (dst_base_type) {<br>
+      case nir_type_int:<br>
+      case nir_type_uint:<br>
+         return (dst_bitsize == 32) ? nir_op_b2i : nir_op_b2i64;<br>
       case nir_type_float:<br>
-         return nir_op_d2f;<br>
+         /* GLSL just emits f2d(b2f(x)) for b2d */<br>
+         assert(dst_bitsize == 32);<br>
+         return nir_op_b2f;<br>
       default:<br>
          unreachable("Invalid conversion");<br>
-      };<br>
+      }<br>
+<br>
    default:<br>
       unreachable("Invalid conversion");<br>
-   };<br>
-   unreachable("Invalid conversion");<br>
+   }<br>
 }<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.5.0.400.gff86faf<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">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/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>