diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build index 7b00033d9ca..fbaa1e54244 100644 --- a/src/compiler/nir/meson.build +++ b/src/compiler/nir/meson.build @@ -126,6 +126,7 @@ else 'nir_gather_xfb_info.c', 'nir_opt_group_loads.c', 'nir_gs_count_vertices.c', + 'nir_inline_sysval.c', 'nir_inline_uniforms.c', 'nir_instr_set.c', 'nir_instr_set.h', diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 9f9c00955f6..cc50581ca9f 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -4945,6 +4945,8 @@ void nir_add_inlinable_uniforms(const nir_src *cond, nir_loop_info *info, uint32_t *uni_offsets, uint8_t *num_offsets, unsigned max_num_bo, unsigned max_offset); +bool nir_inline_sysval(nir_shader *shader, nir_intrinsic_op op, uint64_t imm); + bool nir_propagate_invariant(nir_shader *shader, bool invariant_prim); void nir_lower_var_copy_instr(nir_intrinsic_instr *copy, nir_shader *shader); diff --git a/src/compiler/nir/nir_inline_sysval.c b/src/compiler/nir/nir_inline_sysval.c new file mode 100644 index 00000000000..349f3af8d50 --- /dev/null +++ b/src/compiler/nir/nir_inline_sysval.c @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2025 Valve Corporation + * SPDX-License-Identifier: MIT + */ + +#include "nir_builder.h" + +struct ctx { + nir_intrinsic_op op; + uint64_t imm; +}; + +static bool +pass(nir_builder *b, nir_intrinsic_instr *intr, void *data) +{ + struct ctx *ctx = data; + if (intr->intrinsic != ctx->op) + return false; + + b->cursor = nir_before_instr(&intr->instr); + nir_def_replace(&intr->def, nir_imm_intN_t(b, ctx->imm, intr->def.bit_size)); + return true; +} + +bool +nir_inline_sysval(nir_shader *shader, nir_intrinsic_op op, uint64_t imm) +{ + struct ctx ctx = { .op = op, .imm = imm }; + return nir_shader_intrinsics_pass(shader, pass, nir_metadata_control_flow, + &ctx); +}