Module: Mesa Branch: main Commit: 1b1c726ca91dff781363b1b0980b47ca18f86a76 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1b1c726ca91dff781363b1b0980b47ca18f86a76
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> --- src/compiler/nir/nir.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) 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
