From: Eduardo Lima Mitev <el...@igalia.com> v2: Added more missing implementations of 16-bit types. (Jason Ekstrand)
Signed-off-by: Jose Maria Casanova Crespo <jmcasan...@igalia.com> Signed-off-by: Eduardo Lima <el...@igalia.com> --- src/compiler/spirv/spirv_to_nir.c | 46 ++++++++++++++++++++++++++++++++------ src/compiler/spirv/vtn_variables.c | 21 +++++++++++++++++ 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 7b34dad30cd..abeb5a22d03 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_FLOAT16: case GLSL_TYPE_DOUBLE: { int bit_size = glsl_get_bit_size(type); if (glsl_type_is_vector_or_scalar(type)) { @@ -751,16 +754,32 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode, int bit_size = w[2]; const bool signedness = w[3]; val->type->base_type = vtn_base_type_scalar; - if (bit_size == 64) + if (bit_size == 64) { val->type->type = (signedness ? glsl_int64_t_type() : glsl_uint64_t_type()); - else + } else if (bit_size == 16) { + val->type->type = (signedness ? glsl_int16_t_type() : glsl_uint16_t_type()); + } else { + assert(bit_size == 32); val->type->type = (signedness ? glsl_int_type() : glsl_uint_type()); + } break; } 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_float16_t_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; } @@ -980,10 +999,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_FLOAT16: case GLSL_TYPE_DOUBLE: /* Nothing to do here. It's already initialized to zero */ break; @@ -1110,7 +1132,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode, val->constant->values->u32[0] = w[3]; val->constant->values->u32[1] = w[4]; } else { - assert(bit_size == 32); + assert(bit_size == 32 || bit_size == 16); val->constant->values->u32[0] = w[3]; } break; @@ -1136,9 +1158,12 @@ 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: + case GLSL_TYPE_FLOAT16: case GLSL_TYPE_BOOL: case GLSL_TYPE_DOUBLE: { int bit_size = glsl_get_bit_size(val->const_type); @@ -1153,7 +1178,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode, if (bit_size == 64) { val->constant->values[0].u64[i] = elems[i]->values[0].u64[0]; } else { - assert(bit_size == 32); + assert(bit_size == 32 || bit_size == 16); val->constant->values[0].u32[i] = elems[i]->values[0].u32[0]; } } @@ -1228,6 +1253,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode, val->constant->values[0].u64[j] = u64[comp]; } } else { + /* This is for both 32-bit and 16-bit values */ uint32_t u32[8]; if (v0->value_type == vtn_value_type_constant) { for (unsigned i = 0; i < len0; i++) @@ -1276,9 +1302,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_FLOAT16: case GLSL_TYPE_DOUBLE: case GLSL_TYPE_BOOL: /* If we hit this granularity, we're picking off an element */ @@ -1319,7 +1348,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode, if (bit_size == 64) { val->constant->values[0].u64[i] = (*c)->values[col].u64[elem + i]; } else { - assert(bit_size == 32); + assert(bit_size == 32 || bit_size == 16); val->constant->values[0].u32[i] = (*c)->values[col].u32[elem + i]; } } @@ -1336,7 +1365,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode, if (bit_size == 64) { (*c)->values[col].u64[elem + i] = insert->constant->values[0].u64[i]; } else { - assert(bit_size == 32); + assert(bit_size == 32 || bit_size == 16); (*c)->values[col].u32[elem + i] = insert->constant->values[0].u32[i]; } } @@ -1449,10 +1478,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_FLOAT16: 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 4432e72e54a..80ed948a63a 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -181,9 +181,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_FLOAT16: case GLSL_TYPE_DOUBLE: case GLSL_TYPE_BOOL: case GLSL_TYPE_ARRAY: { @@ -293,9 +296,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_FLOAT16: case GLSL_TYPE_DOUBLE: case GLSL_TYPE_BOOL: case GLSL_TYPE_ARRAY: { @@ -518,9 +524,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_FLOAT16: case GLSL_TYPE_DOUBLE: case GLSL_TYPE_BOOL: case GLSL_TYPE_ARRAY: @@ -562,9 +571,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_FLOAT16: case GLSL_TYPE_BOOL: case GLSL_TYPE_DOUBLE: { unsigned cols = type->row_major ? glsl_get_vector_elements(type->type) : @@ -693,9 +705,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_FLOAT16: case GLSL_TYPE_DOUBLE: case GLSL_TYPE_BOOL: /* This is where things get interesting. At this point, we've hit @@ -868,9 +883,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_FLOAT16: case GLSL_TYPE_BOOL: case GLSL_TYPE_DOUBLE: /* At this point, we have a scalar, vector, or matrix so we know that @@ -948,9 +966,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_FLOAT16: case GLSL_TYPE_DOUBLE: case GLSL_TYPE_BOOL: /* At this point, we have a scalar, vector, or matrix so we know that -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev