From 7716e63cd6414c43babc1c1088c255149f3cac08 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Wed, 30 Apr 2025 11:48:00 +0200 Subject: [PATCH] radv/nir/lower_cmat: handle bf16 conversions Reviewed-by: Rhys Perry Part-of: --- .../nir/radv_nir_lower_cooperative_matrix.c | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 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 c7ca1032660..9e12b0964da 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_cooperative_matrix.c +++ b/src/amd/vulkan/nir/radv_nir_lower_cooperative_matrix.c @@ -181,6 +181,26 @@ radv_get_base_row(nir_builder *b, struct glsl_cmat_description desc, const lower return base_row; } +static nir_def * +convert_base_type(nir_builder *b, nir_def *src, enum glsl_base_type src_type, enum glsl_base_type dst_type) +{ + 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); + } else if (dst_type == GLSL_TYPE_BFLOAT16) { + src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT); + return nir_f2bf(b, src); + } + + nir_op op = nir_type_conversion_op(nir_get_nir_type_for_glsl_base_type(src_type), + nir_get_nir_type_for_glsl_base_type(dst_type), nir_rounding_mode_undef); + + return nir_build_alu1(b, op, src); +} + bool radv_nir_lower_cooperative_matrix(nir_shader *shader, enum amd_gfx_level gfx_level, unsigned wave_size) { @@ -452,10 +472,6 @@ radv_nir_lower_cooperative_matrix(nir_shader *shader, enum amd_gfx_level gfx_lev enum glsl_base_type src_element_type = glsl_apply_signedness_to_base_type( src_desc.element_type, cmat_signed_mask & NIR_CMAT_A_SIGNED); - nir_op op = nir_type_conversion_op(nir_get_nir_type_for_glsl_base_type(src_element_type), - nir_get_nir_type_for_glsl_base_type(dst_element_type), - nir_rounding_mode_undef); - unsigned dst_mul = radv_nir_cmat_length_mul(dst_desc, ¶ms); unsigned src_mul = radv_nir_cmat_length_mul(src_desc, ¶ms); @@ -468,7 +484,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 = nir_build_alu1(&b, op, src); + nir_def *ret = convert_base_type(&b, src, src_element_type, dst_element_type); if (dst_mul > src_mul) { nir_def *components[NIR_MAX_VEC_COMPONENTS];