From 61e289d0ca05073d079e3e6004089afd80e0df1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 20 Jan 2025 08:32:05 -0500 Subject: [PATCH] nir/opt_varyings: handle user barycentrics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This failed an assertion because the barycentric src wasn't an intrinsic. v2: also do it in backward_inter_shader_code_motion Reviewed-by: Timur Kristóf (v1) Part-of: --- src/compiler/nir/nir_opt_varyings.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/compiler/nir/nir_opt_varyings.c b/src/compiler/nir/nir_opt_varyings.c index 966ac0f19e3..ee0fd13d331 100644 --- a/src/compiler/nir/nir_opt_varyings.c +++ b/src/compiler/nir/nir_opt_varyings.c @@ -2599,8 +2599,10 @@ get_input_qualifier(struct linkage_info *linkage, unsigned i) } assert(load->intrinsic == nir_intrinsic_load_interpolated_input); - nir_intrinsic_instr *baryc = - nir_instr_as_intrinsic(load->src[0].ssa->parent_instr); + + nir_instr *baryc_instr = load->src[0].ssa->parent_instr; + nir_intrinsic_instr *baryc = baryc_instr->type == nir_instr_type_intrinsic ? + nir_instr_as_intrinsic(baryc_instr) : NULL; if (linkage->has_flexible_interp) { if (is_color) { @@ -2611,6 +2613,12 @@ get_input_qualifier(struct linkage_info *linkage, unsigned i) } } + /* This is either lowered barycentric_at_offset/at_sample or user + * barycentrics. Treat it like barycentric_at_offset. + */ + if (!baryc) + return QUAL_SKIP; + /* If interpolateAt{Centroid,Offset,Sample} is used, see if there is * another load that doesn't use those, so that we get the real qualifier. */ @@ -3903,8 +3911,15 @@ backward_inter_shader_code_motion(struct linkage_info *linkage, switch (load->intrinsic) { case nir_intrinsic_load_interpolated_input: { assert(linkage->consumer_stage == MESA_SHADER_FRAGMENT); - nir_intrinsic_instr *baryc = - nir_instr_as_intrinsic(load->src[0].ssa->parent_instr); + nir_instr *baryc_instr = load->src[0].ssa->parent_instr; + + /* This is either lowered barycentric_at_offset/at_sample or user + * barycentrics. Treat it like barycentric_at_offset. + */ + if (baryc_instr->type != nir_instr_type_intrinsic) + continue; + + nir_intrinsic_instr *baryc = nir_instr_as_intrinsic(baryc_instr); nir_intrinsic_op op = baryc->intrinsic; enum glsl_interp_mode interp = nir_intrinsic_interp_mode(baryc); bool linear = interp == INTERP_MODE_NOPERSPECTIVE;