Re: [Mesa-dev] [PATCH 09/45] spirv/nir: Handle 16-bit types

2017-08-17 Thread Jason Ekstrand
On Thu, Jul 13, 2017 at 7:35 AM, Alejandro Piñeiro 
wrote:

> From: Eduardo Lima Mitev 
>
> Signed-off-by: Jose Maria Casanova Crespo 
> Signed-off-by: Eduardo Lima 
> ---
>  src/compiler/spirv/spirv_to_nir.c  | 30 +-
>  src/compiler/spirv/vtn_variables.c | 21 +
>  2 files changed, 50 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/spirv/spirv_to_nir.c
> b/src/compiler/spirv/spirv_to_nir.c
> index c66bf34..b619553 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -104,10 +104,13 @@ vtn_const_ssa_value(struct vtn_builder *b,
> nir_constant *constant,
> switch (glsl_get_base_type(type)) {
> case GLSL_TYPE_INT:
> case GLSL_TYPE_UINT:
> +   case GLSL_TYPE_INT16:
> +   case GLSL_TYPE_UINT16:
> case GLSL_TYPE_INT64:
> case GLSL_TYPE_UINT64:
> case GLSL_TYPE_BOOL:
> case GLSL_TYPE_FLOAT:
> +   case GLSL_TYPE_HALF_FLOAT:
> case GLSL_TYPE_DOUBLE: {
>int bit_size = glsl_get_bit_size(type);
>if (glsl_type_is_vector_or_scalar(type)) {
> @@ -741,6 +744,8 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
>val->type->base_type = vtn_base_type_scalar;
>if (bit_size == 64)
>   val->type->type = (signedness ? glsl_int64_t_type() :
> glsl_uint64_t_type());
> +  else if (bit_size == 16)
> + val->type->type = (signedness ? glsl_int16_t_type() :
> glsl_uint16_t_type());
>else
>   val->type->type = (signedness ? glsl_int_type() :
> glsl_uint_type());
>break;
> @@ -748,7 +753,19 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
> case SpvOpTypeFloat: {
>int bit_size = w[2];
>val->type->base_type = vtn_base_type_scalar;
> -  val->type->type = bit_size == 64 ? glsl_double_type() :
> glsl_float_type();
> +  switch (bit_size) {
> +  case 16:
> + val->type->type = glsl_half_float_type();
> + break;
> +  case 32:
> + val->type->type = glsl_float_type();
> + break;
> +  case 64:
> + val->type->type = glsl_double_type();
> + break;
> +  default:
> + assert(!"Invalid float bit size");
> +  }
>break;
> }
>
> @@ -961,10 +978,13 @@ vtn_null_constant(struct vtn_builder *b, const
> struct glsl_type *type)
> switch (glsl_get_base_type(type)) {
> case GLSL_TYPE_INT:
> case GLSL_TYPE_UINT:
> +   case GLSL_TYPE_INT16:
> +   case GLSL_TYPE_UINT16:
> case GLSL_TYPE_INT64:
> case GLSL_TYPE_UINT64:
> case GLSL_TYPE_BOOL:
> case GLSL_TYPE_FLOAT:
> +   case GLSL_TYPE_HALF_FLOAT:
> case GLSL_TYPE_DOUBLE:
>/* Nothing to do here.  It's already initialized to zero */
>break;
> @@ -1117,6 +1137,8 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp
> opcode,
>switch (glsl_get_base_type(val->const_type)) {
>case GLSL_TYPE_UINT:
>case GLSL_TYPE_INT:
> +  case GLSL_TYPE_UINT16:
> +  case GLSL_TYPE_INT16:
>case GLSL_TYPE_UINT64:
>case GLSL_TYPE_INT64:
>case GLSL_TYPE_FLOAT:
>

I think we're missing half-float here.  Also, I see zero code here for
properly handling 16-bit constants.  Basically everywhere there is a 32 or
a 64, there should also be a 16.

--Jason


> @@ -1257,9 +1279,12 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp
> opcode,
>  switch (glsl_get_base_type(type)) {
>  case GLSL_TYPE_UINT:
>  case GLSL_TYPE_INT:
> +case GLSL_TYPE_UINT16:
> +case GLSL_TYPE_INT16:
>  case GLSL_TYPE_UINT64:
>  case GLSL_TYPE_INT64:
>  case GLSL_TYPE_FLOAT:
> +case GLSL_TYPE_HALF_FLOAT:
>  case GLSL_TYPE_DOUBLE:
>  case GLSL_TYPE_BOOL:
> /* If we hit this granularity, we're picking off an
> element */
> @@ -1428,10 +1453,13 @@ vtn_create_ssa_value(struct vtn_builder *b, const
> struct glsl_type *type)
>   switch (glsl_get_base_type(type)) {
>   case GLSL_TYPE_INT:
>   case GLSL_TYPE_UINT:
> + case GLSL_TYPE_INT16:
> + case GLSL_TYPE_UINT16:
>   case GLSL_TYPE_INT64:
>   case GLSL_TYPE_UINT64:
>   case GLSL_TYPE_BOOL:
>   case GLSL_TYPE_FLOAT:
> + case GLSL_TYPE_HALF_FLOAT:
>   case GLSL_TYPE_DOUBLE:
>  child_type = glsl_get_column_type(type);
>  break;
> diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_
> variables.c
> index 5af27bf..bf6184c 100644
> --- a/src/compiler/spirv/vtn_variables.c
> +++ b/src/compiler/spirv/vtn_variables.c
> @@ -160,9 +160,12 @@ vtn_ssa_offset_pointer_dereference(struct
> vtn_builder *b,
>switch (glsl_get_base_type(type->type)) {
>case GLSL_TYPE_UINT:
>case GLSL_TYPE_INT:
> +  case GLSL_TYPE_UINT16:
> +  case GLSL_TYPE_INT16:
>case GLSL_TYPE_UINT64:
>case GLSL_TYPE_INT64:
>

[Mesa-dev] [PATCH 09/45] spirv/nir: Handle 16-bit types

2017-07-13 Thread Alejandro Piñeiro
From: Eduardo Lima Mitev 

Signed-off-by: Jose Maria Casanova Crespo 
Signed-off-by: Eduardo Lima 
---
 src/compiler/spirv/spirv_to_nir.c  | 30 +-
 src/compiler/spirv/vtn_variables.c | 21 +
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/src/compiler/spirv/spirv_to_nir.c 
b/src/compiler/spirv/spirv_to_nir.c
index c66bf34..b619553 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -104,10 +104,13 @@ vtn_const_ssa_value(struct vtn_builder *b, nir_constant 
*constant,
switch (glsl_get_base_type(type)) {
case GLSL_TYPE_INT:
case GLSL_TYPE_UINT:
+   case GLSL_TYPE_INT16:
+   case GLSL_TYPE_UINT16:
case GLSL_TYPE_INT64:
case GLSL_TYPE_UINT64:
case GLSL_TYPE_BOOL:
case GLSL_TYPE_FLOAT:
+   case GLSL_TYPE_HALF_FLOAT:
case GLSL_TYPE_DOUBLE: {
   int bit_size = glsl_get_bit_size(type);
   if (glsl_type_is_vector_or_scalar(type)) {
@@ -741,6 +744,8 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
   val->type->base_type = vtn_base_type_scalar;
   if (bit_size == 64)
  val->type->type = (signedness ? glsl_int64_t_type() : 
glsl_uint64_t_type());
+  else if (bit_size == 16)
+ val->type->type = (signedness ? glsl_int16_t_type() : 
glsl_uint16_t_type());
   else
  val->type->type = (signedness ? glsl_int_type() : glsl_uint_type());
   break;
@@ -748,7 +753,19 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
case SpvOpTypeFloat: {
   int bit_size = w[2];
   val->type->base_type = vtn_base_type_scalar;
-  val->type->type = bit_size == 64 ? glsl_double_type() : 
glsl_float_type();
+  switch (bit_size) {
+  case 16:
+ val->type->type = glsl_half_float_type();
+ break;
+  case 32:
+ val->type->type = glsl_float_type();
+ break;
+  case 64:
+ val->type->type = glsl_double_type();
+ break;
+  default:
+ assert(!"Invalid float bit size");
+  }
   break;
}
 
@@ -961,10 +978,13 @@ vtn_null_constant(struct vtn_builder *b, const struct 
glsl_type *type)
switch (glsl_get_base_type(type)) {
case GLSL_TYPE_INT:
case GLSL_TYPE_UINT:
+   case GLSL_TYPE_INT16:
+   case GLSL_TYPE_UINT16:
case GLSL_TYPE_INT64:
case GLSL_TYPE_UINT64:
case GLSL_TYPE_BOOL:
case GLSL_TYPE_FLOAT:
+   case GLSL_TYPE_HALF_FLOAT:
case GLSL_TYPE_DOUBLE:
   /* Nothing to do here.  It's already initialized to zero */
   break;
@@ -1117,6 +1137,8 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
   switch (glsl_get_base_type(val->const_type)) {
   case GLSL_TYPE_UINT:
   case GLSL_TYPE_INT:
+  case GLSL_TYPE_UINT16:
+  case GLSL_TYPE_INT16:
   case GLSL_TYPE_UINT64:
   case GLSL_TYPE_INT64:
   case GLSL_TYPE_FLOAT:
@@ -1257,9 +1279,12 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
 switch (glsl_get_base_type(type)) {
 case GLSL_TYPE_UINT:
 case GLSL_TYPE_INT:
+case GLSL_TYPE_UINT16:
+case GLSL_TYPE_INT16:
 case GLSL_TYPE_UINT64:
 case GLSL_TYPE_INT64:
 case GLSL_TYPE_FLOAT:
+case GLSL_TYPE_HALF_FLOAT:
 case GLSL_TYPE_DOUBLE:
 case GLSL_TYPE_BOOL:
/* If we hit this granularity, we're picking off an element */
@@ -1428,10 +1453,13 @@ vtn_create_ssa_value(struct vtn_builder *b, const 
struct glsl_type *type)
  switch (glsl_get_base_type(type)) {
  case GLSL_TYPE_INT:
  case GLSL_TYPE_UINT:
+ case GLSL_TYPE_INT16:
+ case GLSL_TYPE_UINT16:
  case GLSL_TYPE_INT64:
  case GLSL_TYPE_UINT64:
  case GLSL_TYPE_BOOL:
  case GLSL_TYPE_FLOAT:
+ case GLSL_TYPE_HALF_FLOAT:
  case GLSL_TYPE_DOUBLE:
 child_type = glsl_get_column_type(type);
 break;
diff --git a/src/compiler/spirv/vtn_variables.c 
b/src/compiler/spirv/vtn_variables.c
index 5af27bf..bf6184c 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -160,9 +160,12 @@ vtn_ssa_offset_pointer_dereference(struct vtn_builder *b,
   switch (glsl_get_base_type(type->type)) {
   case GLSL_TYPE_UINT:
   case GLSL_TYPE_INT:
+  case GLSL_TYPE_UINT16:
+  case GLSL_TYPE_INT16:
   case GLSL_TYPE_UINT64:
   case GLSL_TYPE_INT64:
   case GLSL_TYPE_FLOAT:
+  case GLSL_TYPE_HALF_FLOAT:
   case GLSL_TYPE_DOUBLE:
   case GLSL_TYPE_BOOL:
   case GLSL_TYPE_ARRAY: {
@@ -273,9 +276,12 @@ vtn_pointer_to_deref(struct vtn_builder *b, struct 
vtn_pointer *ptr)
   switch (base_type) {
   case GLSL_TYPE_UINT:
   case GLSL_TYPE_INT:
+  case GLSL_TYPE_UINT16:
+  case GLSL_TYPE_INT16:
   case GLSL_TYPE_UINT64:
   case GLSL_TYPE_INT64:
   case GLSL_TYPE_FLOAT:
+  case GLSL_TYPE_HALF_FLOAT: