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;