From c21a53440ff7ac7a2c9308798bea5d5c153a386b Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Fri, 14 Mar 2025 09:38:43 +0100 Subject: [PATCH] spirv: clamp/sign-extend non 32bit ldexp exponents GLSL.std.450 allows any integer size here. OpenCL only allows i32. Cc: mesa-stable Reviewed-by: Samuel Pitoiset Part-of: --- src/compiler/spirv/vtn_glsl450.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/compiler/spirv/vtn_glsl450.c b/src/compiler/spirv/vtn_glsl450.c index 2a64249af35..5114011eefb 100644 --- a/src/compiler/spirv/vtn_glsl450.c +++ b/src/compiler/spirv/vtn_glsl450.c @@ -259,7 +259,6 @@ vtn_nir_alu_op_for_spirv_glsl_opcode(struct vtn_builder *b, case GLSLstd450SMax: return nir_op_imax; case GLSLstd450FMix: return nir_op_flrp; case GLSLstd450Fma: return nir_op_ffma; - case GLSLstd450Ldexp: return nir_op_ldexp; case GLSLstd450FindILsb: return nir_op_find_lsb; case GLSLstd450FindSMsb: return nir_op_ifind_msb; case GLSLstd450FindUMsb: return nir_op_ufind_msb; @@ -610,6 +609,18 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint, dest->def = nir_atan2(nb, src[0], src[1]); break; + case GLSLstd450Ldexp: { + nir_def *exp = src[1]; + + if (exp->bit_size == 64) { + exp = nir_iclamp(nb, exp, nir_imm_intN_t(nb, INT32_MIN, 64), + nir_imm_intN_t(nb, INT32_MAX, 64)); + } + + dest->def = nir_ldexp(nb, src[0], nir_i2i32(nb, exp)); + break; + } + case GLSLstd450Frexp: { dest->def = nir_frexp_sig(nb, src[0]);