Module: Mesa Branch: staging/21.1 Commit: 3560bce8f5129b550ff17673672f7f2223dd019d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3560bce8f5129b550ff17673672f7f2223dd019d
Author: Samuel Pitoiset <[email protected]> Date: Fri May 7 15:50:24 2021 +0200 nir/opt_access: fix getting variables in presence of similar bindings/desc It's perfectly legal to declare multiple SSBOs that point to the same binding/descriptor_set with different access mask. Currently, it will always get the first one in the list that matches binding/desc_set regardless of the access mask, but other variables might have different access mask. Fix this by being conservative if another variable uses the same binding/desc_set because we can't get it reliably without adding a new field to vulkan_resource_index. This fixes rendering issues in Resident Evil Village with vkd3d-proton. This bug has been uncovered by ("spirv: Don't remove variables used by resource indexing intrinsics") because variables are no longer removed No fossils-db changes. Cc: 21.1 mesa-stable Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Rhys Perry <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10692> (cherry picked from commit 1b1c726ca91dff781363b1b0980b47ca18f86a76) --- .pick_status.json | 2 +- src/compiler/nir/nir.c | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 3d891396985..fac487e8f64 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; } _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
