Mesa (main): nir/opt_access: fix getting variables in presence of similar bindings/desc
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue May 18 07:46:01 UTC 2021
Module: Mesa
Branch: main
Commit: 1b1c726ca91dff781363b1b0980b47ca18f86a76
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1b1c726ca91dff781363b1b0980b47ca18f86a76
Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
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 <samuel.pitoiset at gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
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;
}
More information about the mesa-commit
mailing list