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