diff --git a/src/poly/nir/meson.build b/src/poly/nir/meson.build index 3ba56995a25..d5a5e0fed77 100644 --- a/src/poly/nir/meson.build +++ b/src/poly/nir/meson.build @@ -3,6 +3,7 @@ libpoly_nir_files = files( 'poly_nir_lower_gs.c', + 'poly_nir_lower_sysvals.c', 'poly_nir_lower_tess.c', 'poly_nir_lower_vs.c', ) diff --git a/src/poly/nir/poly_nir.h b/src/poly/nir/poly_nir.h index 75727a661aa..5e4bdaec1a9 100644 --- a/src/poly/nir/poly_nir.h +++ b/src/poly/nir/poly_nir.h @@ -59,3 +59,5 @@ bool poly_nir_lower_tes(struct nir_shader *tes, bool to_hw_vs); uint64_t poly_tcs_per_vertex_outputs(const struct nir_shader *nir); unsigned poly_tcs_output_stride(const struct nir_shader *nir); + +bool poly_nir_lower_sysvals(struct nir_shader *nir); diff --git a/src/poly/nir/poly_nir_lower_sysvals.c b/src/poly/nir/poly_nir_lower_sysvals.c new file mode 100644 index 00000000000..27db413b2dd --- /dev/null +++ b/src/poly/nir/poly_nir_lower_sysvals.c @@ -0,0 +1,31 @@ +/* + * Copyright 2023 Valve Corporation + * SPDX-License-Identifier: MIT + */ + +#include "nir_builder.h" +#include "poly/cl/libpoly.h" +#include "poly/nir/poly_nir.h" + +static bool +lower_sysvals_intr(nir_builder *b, nir_intrinsic_instr *intr, void *data) +{ + switch (intr->intrinsic) { + case nir_intrinsic_load_vs_outputs_poly: { + b->cursor = nir_before_instr(&intr->instr); + nir_def *vp = nir_load_vertex_param_buffer_poly(b); + nir_def_replace(&intr->def, poly_vertex_outputs(b, vp)); + return true; + } + + default: + return false; + } +} + +bool +poly_nir_lower_sysvals(struct nir_shader *nir) +{ + return nir_shader_intrinsics_pass(nir, lower_sysvals_intr, + nir_metadata_control_flow, NULL); +}