From 1c28fc0a86a6f77906cae2ffdd058ccf11b6a15f Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 1 Aug 2025 07:50:24 -0400 Subject: [PATCH] nir: add nir_inline_sysval pass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a bunch of drivers have versions of this, might as well make a common one. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Marek Olšák Reviewed-by: Lionel Landwerlin Reviewed-by: Mary Guillemard Reviewed-by: John Anthony Part-of: --- src/compiler/nir/meson.build | 1 + src/compiler/nir/nir.h | 2 ++ src/compiler/nir/nir_inline_sysval.c | 31 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/compiler/nir/nir_inline_sysval.c 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); +}