From 9da23499ff12c8b91fde0b635feb950ef4e0ffd6 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Wed, 9 Apr 2025 13:36:15 +0200 Subject: [PATCH] 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 Part-of: --- src/compiler/builtin_types.py | 2 ++ src/compiler/glsl/ast_to_hir.cpp | 2 ++ .../glsl/gl_nir_link_uniform_initializers.c | 2 ++ src/compiler/glsl/ir_clone.cpp | 2 ++ src/compiler/glsl_types.c | 26 +++++++++++++++++++ src/compiler/glsl_types.h | 22 ++++++++++++++++ src/compiler/nir/nir.c | 2 ++ src/compiler/spirv/vtn_variables.c | 4 +++ src/intel/compiler/brw_nir.c | 2 ++ src/intel/compiler/elk/elk_shader.cpp | 2 ++ src/intel/compiler/elk/elk_vec4_visitor.cpp | 2 ++ src/mesa/main/uniform_query.cpp | 2 ++ 12 files changed, 70 insertions(+) diff --git a/src/compiler/builtin_types.py b/src/compiler/builtin_types.py index 99bb1709676..624ca2940e7 100644 --- a/src/compiler/builtin_types.py +++ b/src/compiler/builtin_types.py @@ -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) diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 537be820068..c8eee0f8b1a 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -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: diff --git a/src/compiler/glsl/gl_nir_link_uniform_initializers.c b/src/compiler/glsl/gl_nir_link_uniform_initializers.c index 425b354cf29..272f45e6e9c 100644 --- a/src/compiler/glsl/gl_nir_link_uniform_initializers.c +++ b/src/compiler/glsl/gl_nir_link_uniform_initializers.c @@ -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. */ diff --git a/src/compiler/glsl/ir_clone.cpp b/src/compiler/glsl/ir_clone.cpp index 3c1977b6cc5..665b7b06204 100644 --- a/src/compiler/glsl/ir_clone.cpp +++ b/src/compiler/glsl/ir_clone.cpp @@ -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: diff --git a/src/compiler/glsl_types.c b/src/compiler/glsl_types.c index 10fcd786fac..84d51c980e8 100644 --- a/src/compiler/glsl_types.c +++ b/src/compiler/glsl_types.c @@ -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: diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h index 4afba690abf..e154508439e 100644 --- a/src/compiler/glsl_types.h +++ b/src/compiler/glsl_types.h @@ -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); diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index feeb0f4d432..80f3dc5a80f 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -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 */ diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index baf359c9f9f..b4f60e27339 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -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 diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c index 97c4e7b839e..ae514dfac22 100644 --- a/src/intel/compiler/brw_nir.c +++ b/src/intel/compiler/brw_nir.c @@ -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: diff --git a/src/intel/compiler/elk/elk_shader.cpp b/src/intel/compiler/elk/elk_shader.cpp index 05c0a3b3032..63fa8cdf967 100644 --- a/src/intel/compiler/elk/elk_shader.cpp +++ b/src/intel/compiler/elk/elk_shader.cpp @@ -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"); } diff --git a/src/intel/compiler/elk/elk_vec4_visitor.cpp b/src/intel/compiler/elk/elk_vec4_visitor.cpp index f5eb25be279..e5022cd037a 100644 --- a/src/intel/compiler/elk/elk_vec4_visitor.cpp +++ b/src/intel/compiler/elk/elk_vec4_visitor.cpp @@ -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: diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index cb3d79a91da..296d023c9d1 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -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; }