<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">I sprinkled a few mostly trivial comments below.  With those fixed,</div><div class="gmail_quote"><br></div><div class="gmail_quote">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_quote"><br></div><div class="gmail_quote">On Wed, Nov 29, 2017 at 6:07 PM, 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>
v3: Store values in values[0].u16[i] (Jason Ekstrand)<br>
    Include switches based on bitsize for 16-bit types<br>
    (Chema Casanova)<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  | 111 ++++++++++++++++++++++++++++++<wbr>+------<br>
 src/compiler/spirv/vtn_<wbr>variables.c |  21 +++++++<br>
 2 files changed, 115 insertions(+), 17 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 027efab88d..f745373473 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,38 @@ 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>
+      switch (bit_size) {<br>
+      case 64:<br>
          val->type->type = (signedness ? glsl_int64_t_type() : glsl_uint64_t_type());<br>
-      else<br>
+         break;<br>
+      case 32:<br>
          val->type->type = (signedness ? glsl_int_type() : glsl_uint_type());<br>
+         break;<br>
+      case 16:<br>
+         val->type->type = (signedness ? glsl_int16_t_type() : glsl_uint16_t_type());<br>
+         break;<br>
+      default:<br>
+         unreachable("Invalid int bit size");<br>
+      }<br>
       break;<br>
    }<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></blockquote><div><br></div><div>unreachable()<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      }<br>
       break;<br>
    }<br>
<br>
@@ -980,10 +1005,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>
@@ -1106,12 +1134,20 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
    case SpvOpConstant: {<br>
       assert(glsl_type_is_scalar(<wbr>val->const_type));<br>
       int bit_size = glsl_get_bit_size(val->const_<wbr>type);<br>
-      if (bit_size == 64) {<br>
+      switch (bit_size) {<br>
+      case 64: {<br>
          val->constant->values->u32[0] = w[3];<br>
          val->constant->values->u32[1] = w[4];<br></blockquote><div><br></div><div>A bit unrelated but this should be using vtn_u64_literal and setting u64[0] instead of assuming the aliasing works out between u32 and u64.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
-      } else {<br>
-         assert(bit_size == 32);<br>
+         break;<br>
+      }<br></blockquote><div><br></div><div>You don't need braces around the 64-bit case.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      case 32:<br>
          val->constant->values->u32[0] = w[3];<br>
+         break;<br>
+      case 16:<br>
+         val->constant->values->u16[0] = w[3];<br>
+         break;<br>
+      default:<br>
+         unreachable("Unsupported SpvOpConstant bit size");<br>
       }<br>
       break;<br>
    }<br>
@@ -1119,11 +1155,21 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
       assert(glsl_type_is_scalar(<wbr>val->const_type));<br>
       val->constant->values[0].u32[<wbr>0] = get_specialization(b, val, w[3]);<br>
       int bit_size = glsl_get_bit_size(val->const_<wbr>type);<br>
-      if (bit_size == 64)<br>
+      switch (bit_size) {<br>
+      case 64:{<br>
          val->constant->values[0].u64[<wbr>0] =<br>
             get_specialization64(b, val, vtn_u64_literal(&w[3]));<br>
-      else<br>
+         break;<br>
+      }<br></blockquote><div><br></div><div>Same here.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      case 32:<br>
          val->constant->values[0].u32[<wbr>0] = get_specialization(b, val, w[3]);<br>
+         break;<br>
+      case 16:<br>
+         val->constant->values[0].u16[<wbr>0] = get_specialization(b, val, w[3]);<br>
+         break;<br>
+      default:<br>
+         unreachable("Unsupported SpvOpSpecConstant bit size");<br>
+      }<br>
       break;<br>
    }<br>
    case SpvOpSpecConstantComposite:<br>
@@ -1136,9 +1182,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>
@@ -1150,11 +1199,18 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
             assert(glsl_type_is_vector(<wbr>val->const_type));<br>
             assert(glsl_get_vector_<wbr>elements(val->const_type) == elem_count);<br>
             for (unsigned i = 0; i < elem_count; i++) {<br>
-               if (bit_size == 64) {<br>
+               switch (bit_size) {<br>
+               case 64:<br>
                   val->constant->values[0].u64[<wbr>i] = elems[i]->values[0].u64[0];<br>
-               } else {<br>
-                  assert(bit_size == 32);<br>
+                  break;<br>
+               case 32:<br>
                   val->constant->values[0].u32[<wbr>i] = elems[i]->values[0].u32[0];<br>
+                  break;<br>
+               case 16:<br>
+                  val->constant->values[0].u16[<wbr>i] = elems[i]->values[0].u16[0];<br>
+                  break;<br>
+               default:<br>
+                  unreachable("Invalid SpvOpConstantComposite bit size");<br>
                }<br>
             }<br>
          }<br>
@@ -1228,6 +1284,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 +1333,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>
@@ -1316,11 +1376,18 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
                unsigned num_components = glsl_get_vector_elements(type)<wbr>;<br>
                unsigned bit_size = glsl_get_bit_size(type);<br>
                for (unsigned i = 0; i < num_components; i++)<br>
-                  if (bit_size == 64) {<br>
+                  switch(bit_size) {<br>
+                  case 64:<br>
                      val->constant->values[0].u64[<wbr>i] = (*c)->values[col].u64[elem + i];<br>
-                  } else {<br>
-                     assert(bit_size == 32);<br>
+                     break;<br>
+                  case 32:<br>
                      val->constant->values[0].u32[<wbr>i] = (*c)->values[col].u32[elem + i];<br>
+                     break;<br>
+                  case 16:<br>
+                     val->constant->values[0].u16[<wbr>i] = (*c)->values[col].u16[elem + i];<br>
+                     break;<br>
+                  default:<br>
+                     unreachable("Invalid SpvOpCompositeExtract bit size");<br>
                   }<br>
             }<br>
          } else {<br>
@@ -1333,11 +1400,18 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,<br>
                unsigned num_components = glsl_get_vector_elements(type)<wbr>;<br>
                unsigned bit_size = glsl_get_bit_size(type);<br>
                for (unsigned i = 0; i < num_components; i++)<br>
-                  if (bit_size == 64) {<br>
+                  switch (bit_size) {<br>
+                  case 64:<br>
                      (*c)->values[col].u64[elem + i] = insert->constant->values[0].<wbr>u64[i];<br>
-                  } else {<br>
-                     assert(bit_size == 32);<br>
+                     break;<br>
+                  case 32:<br>
                      (*c)->values[col].u32[elem + i] = insert->constant->values[0].<wbr>u32[i];<br>
+                     break;<br>
+                  case 16:<br>
+                     (*c)->values[col].u16[elem + i] = insert->constant->values[0].<wbr>u16[i];<br>
+                     break;<br>
+                  default:<br>
+                     unreachable("Invalid SpvOpCompositeInsert bit size");<br>
                   }<br>
             }<br>
          }<br>
@@ -1449,10 +1523,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 9a69b4f6fc..7eb0b6d22a 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.14.3<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>