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

Jason Ekstrand jason at jlekstrand.net
Thu Aug 17 19:12:05 UTC 2017


On Thu, Jul 13, 2017 at 7:35 AM, Alejandro PiƱeiro <apinheiro at igalia.com>
wrote:

> From: Eduardo Lima Mitev <elima at igalia.com>
>
> Signed-off-by: Jose Maria Casanova Crespo <jmcasanova at igalia.com>
> Signed-off-by: Eduardo Lima <elima at igalia.com>
> ---
>  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:
>        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:
>        case GLSL_TYPE_DOUBLE:
>        case GLSL_TYPE_BOOL:
>        case GLSL_TYPE_ARRAY: {
> @@ -498,9 +504,12 @@ vtn_pointer_to_offset(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:
>        case GLSL_TYPE_DOUBLE:
>        case GLSL_TYPE_BOOL:
>        case GLSL_TYPE_ARRAY:
> @@ -542,9 +551,12 @@ vtn_type_block_size(struct vtn_type *type)
>     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:
>     case GLSL_TYPE_BOOL:
>     case GLSL_TYPE_DOUBLE: {
>        unsigned cols = type->row_major ? glsl_get_vector_elements(type->type)
> :
> @@ -673,9 +685,12 @@ _vtn_block_load_store(struct vtn_builder *b,
> nir_intrinsic_op op, bool load,
>     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:
>     case GLSL_TYPE_DOUBLE:
>     case GLSL_TYPE_BOOL:
>        /* This is where things get interesting.  At this point, we've hit
> @@ -848,9 +863,12 @@ _vtn_variable_load_store(struct vtn_builder *b, bool
> load,
>     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:
>     case GLSL_TYPE_BOOL:
>     case GLSL_TYPE_DOUBLE:
>        /* At this point, we have a scalar, vector, or matrix so we know
> that
> @@ -928,9 +946,12 @@ _vtn_variable_copy(struct vtn_builder *b, struct
> vtn_pointer *dest,
>     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:
>     case GLSL_TYPE_DOUBLE:
>     case GLSL_TYPE_BOOL:
>        /* At this point, we have a scalar, vector, or matrix so we know
> that
> --
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170817/846e848d/attachment.html>


More information about the mesa-dev mailing list