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

Reply via email to