diff options
Diffstat (limited to 'src/intel/compiler/brw_fs.cpp')
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 4151ed7485e..36d8191ee46 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -7743,6 +7743,27 @@ fs_visitor::run_cs(unsigned min_dispatch_width) return !failed; } +static bool +is_used_in_not_interp_frag_coord(nir_ssa_def *def) +{ + nir_foreach_use(src, def) { + if (src->parent_instr->type != nir_instr_type_intrinsic) + return true; + + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(src->parent_instr); + if (intrin->intrinsic != nir_intrinsic_load_interpolated_input) + return true; + + if (nir_intrinsic_base(intrin) != VARYING_SLOT_POS) + return true; + } + + nir_foreach_if_use(src, def) + return true; + + return false; +} + /** * Return a bitfield where bit n is set if barycentric interpolation mode n * (see enum brw_barycentric_mode) is needed by the fragment shader. @@ -7767,14 +7788,20 @@ brw_compute_barycentric_interp_modes(const struct gen_device_info *devinfo, continue; nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); - if (intrin->intrinsic != nir_intrinsic_load_interpolated_input) + switch (intrin->intrinsic) { + case nir_intrinsic_load_barycentric_pixel: + case nir_intrinsic_load_barycentric_centroid: + case nir_intrinsic_load_barycentric_sample: + break; + default: continue; + } /* Ignore WPOS; it doesn't require interpolation. */ - if (nir_intrinsic_base(intrin) == VARYING_SLOT_POS) + assert(intrin->dest.is_ssa); + if (!is_used_in_not_interp_frag_coord(&intrin->dest.ssa)) continue; - intrin = nir_instr_as_intrinsic(intrin->src[0].ssa->parent_instr); enum glsl_interp_mode interp = (enum glsl_interp_mode) nir_intrinsic_interp_mode(intrin); nir_intrinsic_op bary_op = intrin->intrinsic; |