From cbd17cb4d6b0ea3467081ea21c468b8a768668e1 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Wed, 9 Apr 2025 17:48:51 +0200 Subject: [PATCH] radv/nir/lower_cmat: handle float8 conversions Reviewed-by: Rhys Perry Part-of: --- .../nir/radv_nir_lower_cooperative_matrix.c | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_lower_cooperative_matrix.c b/src/amd/vulkan/nir/radv_nir_lower_cooperative_matrix.c index 2b5a5904f98..c31ca27db60 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_cooperative_matrix.c +++ b/src/amd/vulkan/nir/radv_nir_lower_cooperative_matrix.c @@ -167,17 +167,35 @@ radv_get_base_row(nir_builder *b, struct glsl_cmat_description desc, const lower } static nir_def * -convert_base_type(nir_builder *b, nir_def *src, enum glsl_base_type src_type, enum glsl_base_type dst_type) +convert_base_type(nir_builder *b, nir_def *src, enum glsl_base_type src_type, enum glsl_base_type dst_type, bool sat) { if (dst_type == src_type) return src; if (src_type == GLSL_TYPE_BFLOAT16) { src = nir_bf2f(b, src); - return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type); + return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type, sat); } else if (dst_type == GLSL_TYPE_BFLOAT16) { - src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT); + src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT, sat); return nir_f2bf(b, src); + } else if (src_type == GLSL_TYPE_FLOAT_E4M3FN) { + src = nir_e4m3fn2f(b, src); + return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type, sat); + } else if (dst_type == GLSL_TYPE_FLOAT_E4M3FN) { + src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT, sat); + if (sat) + return nir_f2e4m3fn_sat(b, src); + else + return nir_f2e4m3fn(b, src); + } else if (src_type == GLSL_TYPE_FLOAT_E5M2) { + src = nir_e5m22f(b, src); + return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type, sat); + } else if (dst_type == GLSL_TYPE_FLOAT_E5M2) { + src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT, sat); + if (sat) + return nir_f2e5m2_sat(b, src); + else + return nir_f2e5m2(b, src); } nir_op op = nir_type_conversion_op(nir_get_nir_type_for_glsl_base_type(src_type), @@ -451,6 +469,7 @@ radv_nir_lower_cooperative_matrix(nir_shader *shader, enum amd_gfx_level gfx_lev nir_def *src = radv_nir_load_cmat(&b, ¶ms, intr->src[1].ssa); const nir_cmat_signed cmat_signed_mask = nir_intrinsic_cmat_signed_mask(intr); + const bool sat = nir_intrinsic_saturate(intr); enum glsl_base_type dst_element_type = glsl_apply_signedness_to_base_type( dst_desc.element_type, cmat_signed_mask & NIR_CMAT_RESULT_SIGNED); @@ -469,7 +488,7 @@ radv_nir_lower_cooperative_matrix(nir_shader *shader, enum amd_gfx_level gfx_lev src = nir_vec(&b, components, src->num_components / scale); } - nir_def *ret = convert_base_type(&b, src, src_element_type, dst_element_type); + nir_def *ret = convert_base_type(&b, src, src_element_type, dst_element_type, sat); if (dst_mul > src_mul) { nir_def *components[NIR_MAX_VEC_COMPONENTS];