diff --git a/src/gallium/frontends/lavapipe/meson.build b/src/gallium/frontends/lavapipe/meson.build index a4ced880ca7..23fa1873382 100644 --- a/src/gallium/frontends/lavapipe/meson.build +++ b/src/gallium/frontends/lavapipe/meson.build @@ -16,6 +16,7 @@ liblvp_files = files( 'nir/lvp_nir_lower_exec_graph.c', 'nir/lvp_nir_lower_input_attachments.c', 'nir/lvp_nir_lower_pipeline_layout.c', + 'nir/lvp_nir_lower_push_constants.c', 'nir/lvp_nir_lower_ray_queries.c', 'nir/lvp_nir_lower_sparse_residency.c', 'nir/lvp_nir_opt_robustness.c', diff --git a/src/gallium/frontends/lavapipe/nir/lvp_nir.h b/src/gallium/frontends/lavapipe/nir/lvp_nir.h index fbb76d9b9a1..c91b4c457f4 100644 --- a/src/gallium/frontends/lavapipe/nir/lvp_nir.h +++ b/src/gallium/frontends/lavapipe/nir/lvp_nir.h @@ -114,6 +114,8 @@ void lvp_lower_pipeline_layout(const struct lvp_device *device, struct lvp_pipeline_layout *layout, nir_shader *shader); +bool lvp_nir_lower_push_constants(nir_shader *shader); + bool lvp_nir_lower_ray_queries(struct nir_shader *shader); bool lvp_nir_lower_sparse_residency(struct nir_shader *shader); diff --git a/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c b/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c index 567427df69d..127d6c3bb02 100644 --- a/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c +++ b/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_pipeline_layout.c @@ -196,16 +196,6 @@ lower_load_ubo(nir_builder *b, nir_intrinsic_instr *intrin, void *data_cb) return true; } -static void -lower_push_constant(nir_builder *b, nir_intrinsic_instr *intrin, void *data_cb) -{ - nir_def *load = nir_load_ubo(b, intrin->def.num_components, intrin->def.bit_size, - nir_imm_int(b, 0), intrin->src[0].ssa, - .range = nir_intrinsic_range(intrin)); - nir_def_rewrite_uses(&intrin->def, load); - nir_instr_remove(&intrin->instr); -} - static bool lower_vri_instr(struct nir_builder *b, nir_instr *instr, void *data_cb) { @@ -260,10 +250,6 @@ lower_vri_instr(struct nir_builder *b, nir_instr *instr, void *data_cb) lower_image_intrinsic(b, intrin, data_cb); return true; - case nir_intrinsic_load_push_constant: - lower_push_constant(b, intrin, data_cb); - return true; - default: return false; } diff --git a/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_push_constants.c b/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_push_constants.c new file mode 100644 index 00000000000..4a54e35bcd4 --- /dev/null +++ b/src/gallium/frontends/lavapipe/nir/lvp_nir_lower_push_constants.c @@ -0,0 +1,40 @@ +/* + * Copyright © 2025 Valve Corporation + * SPDX-License-Identifier: MIT + */ + +#include "lvp_private.h" +#include "lvp_nir.h" + +static void +lower_push_constant(nir_builder *b, nir_intrinsic_instr *intrin, void *data_cb) +{ + nir_def *load = nir_load_ubo(b, intrin->def.num_components, intrin->def.bit_size, + nir_imm_int(b, 0), intrin->src[0].ssa, + .range = nir_intrinsic_range(intrin)); + nir_def_rewrite_uses(&intrin->def, load); + nir_instr_remove(&intrin->instr); +} + +static bool +pass(struct nir_builder *b, nir_intrinsic_instr *intr, void *data) +{ + b->cursor = nir_before_instr(&intr->instr); + + if (intr->intrinsic != nir_intrinsic_load_push_constant) + return false; + + nir_def *load = nir_load_ubo(b, intr->def.num_components, intr->def.bit_size, + nir_imm_int(b, 0), intr->src[0].ssa, + .range = nir_intrinsic_range(intr)); + nir_def_replace(&intr->def, load); + + return true; +} + +bool +lvp_nir_lower_push_constants(nir_shader *shader) +{ + nir_shader_intrinsics_pass(shader, pass, nir_metadata_control_flow, NULL); +} + \ No newline at end of file