nir: add fp_math_ctrl to ddx/ddy

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40630>
This commit is contained in:
Georg Lehmann 2026-03-25 14:31:14 +01:00 committed by Marge Bot
parent 854911aeab
commit 5d2be211ea
3 changed files with 6 additions and 4 deletions

View file

@ -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);

View file

@ -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;
}

View file

@ -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