diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index a486db7f4ff..5e28730e932 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -590,7 +590,6 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_load_ssbo_address: case nir_intrinsic_load_global_constant_bounded: case nir_intrinsic_load_global_constant_offset: - case nir_intrinsic_resource_intel: case nir_intrinsic_load_reg: case nir_intrinsic_load_constant_agx: case nir_intrinsic_load_reg_indirect: @@ -608,6 +607,23 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) break; } + case nir_intrinsic_resource_intel: + /* Not having the non_uniform flag with divergent sources is undefined + * behavior. The Intel driver defines it pick the lowest numbered live + * SIMD lane (via emit_uniformize). + */ + if ((nir_intrinsic_resource_access_intel(instr) & + nir_resource_intel_non_uniform) != 0) { + unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs; + for (unsigned i = 0; i < num_srcs; i++) { + if (instr->src[i].ssa->divergent) { + is_divergent = true; + break; + } + } + } + break; + case nir_intrinsic_shuffle: is_divergent = instr->src[0].ssa->divergent && instr->src[1].ssa->divergent;