compiler: add float8 glsl types

e4m3fn: 8bit floating point format with 4bit exponent, 3bit mantissa
        and no infinities (finite only)
e5m2:   8bit floating point format with 5bit exponent, 2bit mantissa
        and with infinities.

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35434>
This commit is contained in:
Georg Lehmann 2025-04-09 13:36:15 +02:00 committed by Marge Bot
parent 28f7bb2418
commit 9da23499ff
12 changed files with 70 additions and 0 deletions

View file

@ -62,6 +62,8 @@ vector_type("int8_t", "i8vec", "GLSL_TYPE_INT8", "GL_INT8", "_NV")
vector_type("uint8_t", "u8vec", "GLSL_TYPE_UINT8", "GL_UNSIGNED_INT8", "_NV")
vector_type("bfloat16_t", "bf16vec", "GLSL_TYPE_BFLOAT16", None)
vector_type("e4m3fn_t", "e4m3fnvec", "GLSL_TYPE_FLOAT_E4M3FN", None)
vector_type("e5m2_t", "e5m2vec", "GLSL_TYPE_FLOAT_E5M2", None)
simple_type("mat2", "GL_FLOAT_MAT2", "GLSL_TYPE_FLOAT", 2, 2)
simple_type("mat3", "GL_FLOAT_MAT3", "GLSL_TYPE_FLOAT", 3, 3)

View file

@ -1136,6 +1136,8 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1)
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_UINT:
case GLSL_TYPE_INT:
case GLSL_TYPE_BOOL:

View file

@ -164,6 +164,8 @@ copy_constant_to_storage(union gl_constant_value *storage,
case GLSL_TYPE_INT8:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
/* All other types should have already been filtered by other
* paths in the caller.
*/

View file

@ -339,6 +339,8 @@ ir_constant::clone(void *mem_ctx, struct hash_table *ht) const
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_DOUBLE:
case GLSL_TYPE_BOOL:
case GLSL_TYPE_UINT64:

View file

@ -349,6 +349,10 @@ glsl_get_base_glsl_type(const glsl_type *t)
return &glsl_type_builtin_double;
case GLSL_TYPE_BFLOAT16:
return &glsl_type_builtin_bfloat16_t;
case GLSL_TYPE_FLOAT_E4M3FN:
return &glsl_type_builtin_e4m3fn_t;
case GLSL_TYPE_FLOAT_E5M2:
return &glsl_type_builtin_e5m2_t;
case GLSL_TYPE_BOOL:
return &glsl_type_builtin_bool;
case GLSL_TYPE_UINT64:
@ -387,6 +391,8 @@ glsl_get_bare_type(const glsl_type *t)
case GLSL_TYPE_INT16:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_UINT:
case GLSL_TYPE_INT:
case GLSL_TYPE_FLOAT:
@ -597,6 +603,8 @@ glsl_ ## vname ## _type (unsigned components) \
VECN(components, float, vec)
VECN(components, float16_t, f16vec)
VECN(components, bfloat16_t, bf16vec)
VECN(components, e4m3fn_t, e4m3fnvec)
VECN(components, e5m2_t, e5m2vec)
VECN(components, double, dvec)
VECN(components, int, ivec)
VECN(components, uint, uvec)
@ -647,6 +655,10 @@ glsl_simple_explicit_type(unsigned base_type, unsigned rows, unsigned columns,
return glsl_f16vec_type(rows);
case GLSL_TYPE_BFLOAT16:
return glsl_bf16vec_type(rows);
case GLSL_TYPE_FLOAT_E4M3FN:
return glsl_e4m3fnvec_type(rows);
case GLSL_TYPE_FLOAT_E5M2:
return glsl_e5m2vec_type(rows);
case GLSL_TYPE_DOUBLE:
return glsl_dvec_type(rows);
case GLSL_TYPE_BOOL:
@ -1749,6 +1761,8 @@ glsl_get_component_slots(const glsl_type *t)
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_BOOL:
return glsl_get_components(t);
@ -1802,6 +1816,8 @@ glsl_get_component_slots_aligned(const glsl_type *t, unsigned offset)
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_BOOL:
return glsl_get_components(t);
@ -2889,6 +2905,8 @@ glsl_count_vec4_slots(const glsl_type *t, bool is_gl_vertex_input, bool is_bindl
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_BOOL:
return t->matrix_columns;
case GLSL_TYPE_DOUBLE:
@ -3094,6 +3112,8 @@ encode_type_to_blob(struct blob *blob, const glsl_type *type)
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_DOUBLE:
case GLSL_TYPE_UINT8:
case GLSL_TYPE_INT8:
@ -3743,6 +3763,8 @@ glsl_get_natural_size_align_bytes(const glsl_type *type,
case GLSL_TYPE_INT16:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_UINT:
case GLSL_TYPE_INT:
case GLSL_TYPE_FLOAT:
@ -3803,6 +3825,8 @@ glsl_get_word_size_align_bytes(const glsl_type *type,
case GLSL_TYPE_INT16:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_UINT:
case GLSL_TYPE_INT:
case GLSL_TYPE_FLOAT:
@ -3863,6 +3887,8 @@ glsl_get_vec4_size_align_bytes(const glsl_type *type,
case GLSL_TYPE_INT16:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_UINT:
case GLSL_TYPE_INT:
case GLSL_TYPE_FLOAT:

View file

@ -64,6 +64,8 @@ enum glsl_base_type {
GLSL_TYPE_FLOAT,
GLSL_TYPE_FLOAT16,
GLSL_TYPE_BFLOAT16,
GLSL_TYPE_FLOAT_E4M3FN,
GLSL_TYPE_FLOAT_E5M2,
GLSL_TYPE_DOUBLE,
GLSL_TYPE_UINT8,
GLSL_TYPE_INT8,
@ -107,6 +109,8 @@ static unsigned glsl_base_type_bit_size(enum glsl_base_type type)
case GLSL_TYPE_UINT8:
case GLSL_TYPE_INT8:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
return 8;
case GLSL_TYPE_DOUBLE:
@ -176,6 +180,8 @@ glsl_base_type_get_bit_size(const enum glsl_base_type base_type)
case GLSL_TYPE_UINT8:
case GLSL_TYPE_INT8:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
return 8;
case GLSL_TYPE_DOUBLE:
@ -630,6 +636,18 @@ glsl_type_is_bfloat_16(const glsl_type *t)
return t->base_type == GLSL_TYPE_BFLOAT16;
}
static inline bool
glsl_type_is_e4m3fn(const glsl_type *t)
{
return t->base_type == GLSL_TYPE_FLOAT_E4M3FN;
}
static inline bool
glsl_type_is_e5m2(const glsl_type *t)
{
return t->base_type == GLSL_TYPE_FLOAT_E5M2;
}
static inline bool
glsl_type_is_int_16_32_64(const glsl_type *t)
{
@ -947,6 +965,8 @@ static inline const glsl_type *glsl_uint8_t_type(void) { return &glsl_type_built
static inline const glsl_type *glsl_bool_type(void) { return &glsl_type_builtin_bool; }
static inline const glsl_type *glsl_atomic_uint_type(void) { return &glsl_type_builtin_atomic_uint; }
static inline const glsl_type *glsl_bfloat16_t_type(void) { return &glsl_type_builtin_bfloat16_t; }
static inline const glsl_type *glsl_e4m3fn_t_type(void) { return &glsl_type_builtin_e4m3fn_t; }
static inline const glsl_type *glsl_e5m2_t_type(void) { return &glsl_type_builtin_e5m2_t; }
static inline const glsl_type *
glsl_floatN_t_type(unsigned bit_size)
@ -999,6 +1019,8 @@ glsl_uintN_t_type(unsigned bit_size)
const glsl_type *glsl_vec_type(unsigned components);
const glsl_type *glsl_f16vec_type(unsigned components);
const glsl_type *glsl_bf16vec_type(unsigned components);
const glsl_type *glsl_e4m3fnvec_type(unsigned components);
const glsl_type *glsl_e5m2vec_type(unsigned components);
const glsl_type *glsl_dvec_type(unsigned components);
const glsl_type *glsl_ivec_type(unsigned components);
const glsl_type *glsl_uvec_type(unsigned components);

View file

@ -2905,6 +2905,8 @@ nir_get_nir_type_for_glsl_base_type(enum glsl_base_type base_type)
case GLSL_TYPE_FLOAT: return nir_type_float32;
case GLSL_TYPE_FLOAT16: return nir_type_float16;
case GLSL_TYPE_BFLOAT16: return nir_type_uint16;
case GLSL_TYPE_FLOAT_E4M3FN: return nir_type_uint8;
case GLSL_TYPE_FLOAT_E5M2: return nir_type_uint8;
case GLSL_TYPE_DOUBLE: return nir_type_float64;
/* clang-format on */

View file

@ -717,6 +717,8 @@ _vtn_variable_load_store(struct vtn_builder *b, bool load,
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_BOOL:
case GLSL_TYPE_DOUBLE:
case GLSL_TYPE_COOPERATIVE_MATRIX:
@ -811,6 +813,8 @@ _vtn_variable_copy(struct vtn_builder *b, struct vtn_pointer *dest,
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_DOUBLE:
case GLSL_TYPE_BOOL:
/* At this point, we have a scalar, vector, or matrix so we know that

View file

@ -43,6 +43,8 @@ type_size_xvec4(const struct glsl_type *type, bool as_vec4, bool bindless)
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_BOOL:
case GLSL_TYPE_DOUBLE:
case GLSL_TYPE_UINT16:

View file

@ -77,6 +77,8 @@ elk_type_for_base_type(const struct glsl_type *type)
case GLSL_TYPE_ERROR:
case GLSL_TYPE_COOPERATIVE_MATRIX:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
unreachable("not reached");
}

View file

@ -575,6 +575,8 @@ elk_type_size_xvec4(const struct glsl_type *type, bool as_vec4, bool bindless)
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_BFLOAT16:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
case GLSL_TYPE_BOOL:
case GLSL_TYPE_DOUBLE:
case GLSL_TYPE_UINT16:

View file

@ -1011,6 +1011,8 @@ associate_uniform_storage(struct gl_context *ctx,
case GLSL_TYPE_ERROR:
case GLSL_TYPE_INTERFACE:
case GLSL_TYPE_COOPERATIVE_MATRIX:
case GLSL_TYPE_FLOAT_E4M3FN:
case GLSL_TYPE_FLOAT_E5M2:
assert(!"Should not get here.");
break;
}