<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 12, 2017 at 11:37 AM, Jose Maria Casanova Crespo <span dir="ltr"><<a href="mailto:jmcasanova@igalia.com" target="_blank">jmcasanova@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Eduardo Lima Mitev <<a href="mailto:elima@igalia.com">elima@igalia.com</a>><br>
<br>
v2: Added more missing implementations of 16-bit types. (Jason Ekstrand)<br>
<br>
Signed-off-by: Jose Maria Casanova Crespo <<a href="mailto:jmcasanova@igalia.com">jmcasanova@igalia.com</a>><br>
Signed-off-by: Eduardo Lima <<a href="mailto:elima@igalia.com">elima@igalia.com</a>><br>
---<br>
 src/compiler/spirv/spirv_to_<wbr>nir.c  | 46 ++++++++++++++++++++++++++++++<wbr>++------<br>
 src/compiler/spirv/vtn_<wbr>variables.c | 21 +++++++++++++++++<br>
 2 files changed, 60 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/compiler/spirv/spirv_to_<wbr>nir.c b/src/compiler/spirv/spirv_to_<wbr>nir.c<br>
index 079ff0fe95..ea544b065c 100644<br>
--- a/src/compiler/spirv/spirv_to_<wbr>nir.c<br>
+++ b/src/compiler/spirv/spirv_to_<wbr>nir.c<br>
@@ -104,10 +104,13 @@ vtn_const_ssa_value(struct vtn_builder *b, nir_constant *constant,<br>
    switch (glsl_get_base_type(type)) {<br>
    case GLSL_TYPE_INT:<br>
    case GLSL_TYPE_UINT:<br>
+   case GLSL_TYPE_INT16:<br>
+   case GLSL_TYPE_UINT16:<br>
    case GLSL_TYPE_INT64:<br>
    case GLSL_TYPE_UINT64:<br>
    case GLSL_TYPE_BOOL:<br>
    case GLSL_TYPE_FLOAT:<br>
+   case GLSL_TYPE_FLOAT16:<br>
    case GLSL_TYPE_DOUBLE: {<br>
       int bit_size = glsl_get_bit_size(type);<br>
       if (glsl_type_is_vector_or_<wbr>scalar(type)) {<br>
@@ -751,16 +754,32 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,<br>
       int bit_size = w[2];<br>
       const bool signedness = w[3];<br>
       val->type->base_type = vtn_base_type_scalar;<br>
-      if (bit_size == 64)<br>
+      if (bit_size == 64) {<br>
          val->type->type = (signedness ? glsl_int64_t_type() : glsl_uint64_t_type());<br>
-      else<br>
+      } else if (bit_size == 16) {<br>
+         val->type->type = (signedness ? glsl_int16_t_type() : glsl_uint16_t_type());<br>
+      } else {<br>
+         assert(bit_size == 32);<br>
          val->type->type = (signedness ? glsl_int_type() : glsl_uint_type());<br>
+      }<br>
       break;<br>
    }<br>
    case SpvOpTypeFloat: {<br>
       int bit_size = w[2];<br>
       val->type->base_type = vtn_base_type_scalar;<br>
-      val->type->type = bit_size == 64 ? glsl_double_type() : glsl_float_type();<br>
+      switch (bit_size) {<br>
+      case 16:<br>
+         val->type->type = glsl_float16_t_type();<br>
+         break;<br>
+      case 32:<br>
+         val->type->type = glsl_float_type();<br>
+         break;<br>
+      case 64:<br>
+         val->type->type = glsl_double_type();<br>
+         break;<br>
+      default:<br>
+         assert(!"Invalid float bit size");<br>
+      }<br>
       break;<br>
    }<br>
<br>
@@ -980,10 +999,13 @@ vtn_null_constant(struct vtn_builder *b, const struct glsl_type *type)<br>
    switch (glsl_get_base_type(type)) {<br>
    case GLSL_TYPE_INT:<br>
    case GLSL_TYPE_UINT:<br>
+   case GLSL_TYPE_INT16:<br>
+   case GLSL_TYPE_UINT16:<br>
    case GLSL_TYPE_INT64:<br>
    case GLSL_TYPE_UINT64:<br>
    case GLSL_TYPE_BOOL:<br>
    case GLSL_TYPE_FLOAT:<br>
+   case GLSL_TYPE_FLOAT16:<br>
    case GLSL_TYPE_DOUBLE:<br>
       /* Nothing to do here.  It's already initialized to zero */<br>
       break;<br>
@@ -1110,7 +1132,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
          val->constant->values->u32[0] = w[3];<br>
          val->constant->values->u32[1] = w[4];<br>
       } else {<br>
-         assert(bit_size == 32);<br>
+         assert(bit_size == 32 || bit_size == 16);<br>
          val->constant->values->u32[0] = w[3];<br>
       }<br>
       break;<br>
@@ -1136,9 +1158,12 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
       switch (glsl_get_base_type(val-><wbr>const_type)) {<br>
       case GLSL_TYPE_UINT:<br>
       case GLSL_TYPE_INT:<br>
+      case GLSL_TYPE_UINT16:<br>
+      case GLSL_TYPE_INT16:<br>
       case GLSL_TYPE_UINT64:<br>
       case GLSL_TYPE_INT64:<br>
       case GLSL_TYPE_FLOAT:<br>
+      case GLSL_TYPE_FLOAT16:<br>
       case GLSL_TYPE_BOOL:<br>
       case GLSL_TYPE_DOUBLE: {<br>
          int bit_size = glsl_get_bit_size(val->const_<wbr>type);<br>
@@ -1153,7 +1178,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
                if (bit_size == 64) {<br>
                   val->constant->values[0].u64[<wbr>i] = elems[i]->values[0].u64[0];<br>
                } else {<br>
-                  assert(bit_size == 32);<br>
+                  assert(bit_size == 32 || bit_size == 16);<br>
                   val->constant->values[0].u32[<wbr>i] = elems[i]->values[0].u32[0];<br>
                }<br>
             }<br>
@@ -1228,6 +1253,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
                   val->constant->values[0].u64[<wbr>j] = u64[comp];<br>
             }<br>
          } else {<br>
+            /* This is for both 32-bit and 16-bit values */<br>
             uint32_t u32[8];<br>
             if (v0->value_type == vtn_value_type_constant) {<br>
                for (unsigned i = 0; i < len0; i++)<br>
@@ -1276,9 +1302,12 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
             switch (glsl_get_base_type(type)) {<br>
             case GLSL_TYPE_UINT:<br>
             case GLSL_TYPE_INT:<br>
+            case GLSL_TYPE_UINT16:<br>
+            case GLSL_TYPE_INT16:<br>
             case GLSL_TYPE_UINT64:<br>
             case GLSL_TYPE_INT64:<br>
             case GLSL_TYPE_FLOAT:<br>
+            case GLSL_TYPE_FLOAT16:<br>
             case GLSL_TYPE_DOUBLE:<br>
             case GLSL_TYPE_BOOL:<br>
                /* If we hit this granularity, we're picking off an element */<br>
@@ -1319,7 +1348,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
                   if (bit_size == 64) {<br>
                      val->constant->values[0].u64[<wbr>i] = (*c)->values[col].u64[elem + i];<br>
                   } else {<br>
-                     assert(bit_size == 32);<br>
+                     assert(bit_size == 32 || bit_size == 16);<br>
                      val->constant->values[0].u32[<wbr>i] = (*c)->values[col].u32[elem + i];<br></blockquote><div><br></div><div>This isn't correct.  For 16-bit types, we need to store it in values[0].u16[i]<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                   }<br>
             }<br>
@@ -1336,7 +1365,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
                   if (bit_size == 64) {<br>
                      (*c)->values[col].u64[elem + i] = insert->constant->values[0].<wbr>u64[i];<br>
                   } else {<br>
-                     assert(bit_size == 32);<br>
+                     assert(bit_size == 32 || bit_size == 16);<br>
                      (*c)->values[col].u32[elem + i] = insert->constant->values[0].<wbr>u32[i];<br></blockquote><div><br></div><div>Same here.  In retrospect, it may have been easier to make have an array of a union rather than a union of arrays but that's what we have today.</div><div><br></div><div>With those two fixed, this patch is</div><div><br></div><div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                   }<br>
             }<br>
@@ -1449,10 +1478,13 @@ vtn_create_ssa_value(struct vtn_builder *b, const struct glsl_type *type)<br>
          switch (glsl_get_base_type(type)) {<br>
          case GLSL_TYPE_INT:<br>
          case GLSL_TYPE_UINT:<br>
+         case GLSL_TYPE_INT16:<br>
+         case GLSL_TYPE_UINT16:<br>
          case GLSL_TYPE_INT64:<br>
          case GLSL_TYPE_UINT64:<br>
          case GLSL_TYPE_BOOL:<br>
          case GLSL_TYPE_FLOAT:<br>
+         case GLSL_TYPE_FLOAT16:<br>
          case GLSL_TYPE_DOUBLE:<br>
             child_type = glsl_get_column_type(type);<br>
             break;<br>
diff --git a/src/compiler/spirv/vtn_<wbr>variables.c b/src/compiler/spirv/vtn_<wbr>variables.c<br>
index 997b66f542..57d09d2fa1 100644<br>
--- a/src/compiler/spirv/vtn_<wbr>variables.c<br>
+++ b/src/compiler/spirv/vtn_<wbr>variables.c<br>
@@ -186,9 +186,12 @@ vtn_ssa_offset_pointer_<wbr>dereference(struct vtn_builder *b,<br>
       switch (glsl_get_base_type(type-><wbr>type)) {<br>
       case GLSL_TYPE_UINT:<br>
       case GLSL_TYPE_INT:<br>
+      case GLSL_TYPE_UINT16:<br>
+      case GLSL_TYPE_INT16:<br>
       case GLSL_TYPE_UINT64:<br>
       case GLSL_TYPE_INT64:<br>
       case GLSL_TYPE_FLOAT:<br>
+      case GLSL_TYPE_FLOAT16:<br>
       case GLSL_TYPE_DOUBLE:<br>
       case GLSL_TYPE_BOOL:<br>
       case GLSL_TYPE_ARRAY: {<br>
@@ -298,9 +301,12 @@ vtn_pointer_to_deref(struct vtn_builder *b, struct vtn_pointer *ptr)<br>
       switch (base_type) {<br>
       case GLSL_TYPE_UINT:<br>
       case GLSL_TYPE_INT:<br>
+      case GLSL_TYPE_UINT16:<br>
+      case GLSL_TYPE_INT16:<br>
       case GLSL_TYPE_UINT64:<br>
       case GLSL_TYPE_INT64:<br>
       case GLSL_TYPE_FLOAT:<br>
+      case GLSL_TYPE_FLOAT16:<br>
       case GLSL_TYPE_DOUBLE:<br>
       case GLSL_TYPE_BOOL:<br>
       case GLSL_TYPE_ARRAY: {<br>
@@ -523,9 +529,12 @@ vtn_pointer_to_offset(struct vtn_builder *b, struct vtn_pointer *ptr,<br>
       switch (base_type) {<br>
       case GLSL_TYPE_UINT:<br>
       case GLSL_TYPE_INT:<br>
+      case GLSL_TYPE_UINT16:<br>
+      case GLSL_TYPE_INT16:<br>
       case GLSL_TYPE_UINT64:<br>
       case GLSL_TYPE_INT64:<br>
       case GLSL_TYPE_FLOAT:<br>
+      case GLSL_TYPE_FLOAT16:<br>
       case GLSL_TYPE_DOUBLE:<br>
       case GLSL_TYPE_BOOL:<br>
       case GLSL_TYPE_ARRAY:<br>
@@ -567,9 +576,12 @@ vtn_type_block_size(struct vtn_type *type)<br>
    switch (base_type) {<br>
    case GLSL_TYPE_UINT:<br>
    case GLSL_TYPE_INT:<br>
+   case GLSL_TYPE_UINT16:<br>
+   case GLSL_TYPE_INT16:<br>
    case GLSL_TYPE_UINT64:<br>
    case GLSL_TYPE_INT64:<br>
    case GLSL_TYPE_FLOAT:<br>
+   case GLSL_TYPE_FLOAT16:<br>
    case GLSL_TYPE_BOOL:<br>
    case GLSL_TYPE_DOUBLE: {<br>
       unsigned cols = type->row_major ? glsl_get_vector_elements(type-<wbr>>type) :<br>
@@ -698,9 +710,12 @@ _vtn_block_load_store(struct vtn_builder *b, nir_intrinsic_op op, bool load,<br>
    switch (base_type) {<br>
    case GLSL_TYPE_UINT:<br>
    case GLSL_TYPE_INT:<br>
+   case GLSL_TYPE_UINT16:<br>
+   case GLSL_TYPE_INT16:<br>
    case GLSL_TYPE_UINT64:<br>
    case GLSL_TYPE_INT64:<br>
    case GLSL_TYPE_FLOAT:<br>
+   case GLSL_TYPE_FLOAT16:<br>
    case GLSL_TYPE_DOUBLE:<br>
    case GLSL_TYPE_BOOL:<br>
       /* This is where things get interesting.  At this point, we've hit<br>
@@ -873,9 +888,12 @@ _vtn_variable_load_store(<wbr>struct vtn_builder *b, bool load,<br>
    switch (base_type) {<br>
    case GLSL_TYPE_UINT:<br>
    case GLSL_TYPE_INT:<br>
+   case GLSL_TYPE_UINT16:<br>
+   case GLSL_TYPE_INT16:<br>
    case GLSL_TYPE_UINT64:<br>
    case GLSL_TYPE_INT64:<br>
    case GLSL_TYPE_FLOAT:<br>
+   case GLSL_TYPE_FLOAT16:<br>
    case GLSL_TYPE_BOOL:<br>
    case GLSL_TYPE_DOUBLE:<br>
       /* At this point, we have a scalar, vector, or matrix so we know that<br>
@@ -953,9 +971,12 @@ _vtn_variable_copy(struct vtn_builder *b, struct vtn_pointer *dest,<br>
    switch (base_type) {<br>
    case GLSL_TYPE_UINT:<br>
    case GLSL_TYPE_INT:<br>
+   case GLSL_TYPE_UINT16:<br>
+   case GLSL_TYPE_INT16:<br>
    case GLSL_TYPE_UINT64:<br>
    case GLSL_TYPE_INT64:<br>
    case GLSL_TYPE_FLOAT:<br>
+   case GLSL_TYPE_FLOAT16:<br>
    case GLSL_TYPE_DOUBLE:<br>
    case GLSL_TYPE_BOOL:<br>
       /* At this point, we have a scalar, vector, or matrix so we know that<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.13.6<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></div>