From 5d2be211ea4fdc414482ffc5e846ddff36800992 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Wed, 25 Mar 2026 14:31:14 +0100 Subject: [PATCH] nir: add fp_math_ctrl to ddx/ddy Reviewed-by: Alyssa Rosenzweig Part-of: --- src/amd/common/nir/ac_nir_lower_image_tex.c | 3 ++- src/compiler/nir/nir_builder.h | 5 +++-- src/compiler/nir/nir_intrinsics.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/amd/common/nir/ac_nir_lower_image_tex.c b/src/amd/common/nir/ac_nir_lower_image_tex.c index e66cd46bfeb..e2523ac0f1e 100644 --- a/src/amd/common/nir/ac_nir_lower_image_tex.c +++ b/src/amd/common/nir/ac_nir_lower_image_tex.c @@ -673,7 +673,8 @@ move_ddxy(struct move_tex_coords_state *state, nir_function_impl *impl, nir_intr } nir_def *def = nir_vec_scalars(&state->toplevel_b, components, num_components); - def = _nir_build_ddx(&state->toplevel_b, def->bit_size, def); + struct _nir_ddx_indices indices = {0}; + def = _nir_build_ddx(&state->toplevel_b, def->bit_size, def, indices); nir_def_as_intrinsic(def)->intrinsic = instr->intrinsic; nir_def_rewrite_uses(&instr->def, def); diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index f6bfa49dfd7..68dfae6d60e 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -2163,17 +2163,18 @@ nir_tex_src_for_ssa(nir_tex_src_type src_type, nir_def *def) static inline nir_def * nir_build_deriv(nir_builder *b, nir_def *x, nir_intrinsic_op intrin) { + struct _nir_ddx_indices indices = { 0 }; if (b->shader->options->scalarize_ddx && x->num_components > 1) { nir_def *res[NIR_MAX_VEC_COMPONENTS] = { NULL }; for (unsigned i = 0; i < x->num_components; ++i) { - res[i] = _nir_build_ddx(b, x->bit_size, nir_channel(b, x, i)); + res[i] = _nir_build_ddx(b, x->bit_size, nir_channel(b, x, i), indices); nir_def_as_intrinsic(res[i])->intrinsic = intrin; } return nir_vec(b, res, x->num_components); } else { - nir_def *res = _nir_build_ddx(b, x->bit_size, x); + nir_def *res = _nir_build_ddx(b, x->bit_size, x, indices); nir_def_as_intrinsic(res)->intrinsic = intrin; return res; } diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 2cf55f5b3f8..c2a296d0b6f 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -502,7 +502,7 @@ intrinsic("is_sparse_resident_zink", dest_comp=1, src_comp=[0], bit_sizes=[1], for suffix in ["", "_fine", "_coarse"]: for axis in ["x", "y"]: intrinsic(f"dd{axis}{suffix}", dest_comp=0, src_comp=[0], - bit_sizes=[16, 32], flags=[CAN_ELIMINATE, QUADGROUP]) + bit_sizes=[16, 32], indices=[FP_MATH_CTRL], flags=[CAN_ELIMINATE, QUADGROUP]) # a barrier is an intrinsic with no inputs/outputs but which can't be moved # around/optimized in general