diff --git a/.pick_status.json b/.pick_status.json index 20fdee469f1..59048fda2d1 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -562,7 +562,7 @@ "description": "nir/opt_access: fix getting variables in presence of similar bindings/desc", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 5e81447c039..9d7cb35765b 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2411,6 +2411,9 @@ nir_binding nir_chase_binding(nir_src rsrc) nir_variable *nir_get_binding_variable(nir_shader *shader, nir_binding binding) { + nir_variable *binding_var = NULL; + unsigned count = 0; + if (!binding.success) return NULL; @@ -2418,9 +2421,17 @@ nir_variable *nir_get_binding_variable(nir_shader *shader, nir_binding binding) return binding.var; nir_foreach_variable_with_modes(var, shader, nir_var_mem_ubo | nir_var_mem_ssbo) { - if (var->data.descriptor_set == binding.desc_set && var->data.binding == binding.binding) - return var; + if (var->data.descriptor_set == binding.desc_set && var->data.binding == binding.binding) { + binding_var = var; + count++; + } } - return NULL; + /* Be conservative if another variable is using the same binding/desc_set + * because the access mask might be different and we can't get it reliably. + */ + if (count > 1) + return NULL; + + return binding_var; }