Module: Mesa
Branch: main
Commit: a7b98dd4be8946856da8e6fe1a33758d864b5775
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=a7b98dd4be8946856da8e6fe1a33758d864b5775

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Feb 24 10:32:10 2023 -0500

zink: avoid adding ubo/ssbo bindings multiple times for different bitsizes

these are valid variables, but the descriptor binding needs to be unique

cc: mesa-stable

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21522>

---

 src/gallium/drivers/zink/zink_compiler.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c 
b/src/gallium/drivers/zink/zink_compiler.c
index 0e3371b55fa..0ce9d7b3429 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -4378,6 +4378,8 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
       ret->sinfo.sampler_mask = sampler_mask;
    }
 
+   unsigned ubo_binding_mask = 0;
+   unsigned ssbo_binding_mask = 0;
    foreach_list_typed_reverse_safe(nir_variable, var, node, &nir->variables) {
       if (_nir_shader_variable_has_mode(var, nir_var_uniform |
                                         nir_var_image |
@@ -4400,13 +4402,14 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
 
             if (!var->data.driver_location) {
                ret->has_uniforms = true;
-            } else {
+            } else if (!(ubo_binding_mask & BITFIELD_BIT(binding))) {
                ret->bindings[ztype][ret->num_bindings[ztype]].index = 
var->data.driver_location;
                ret->bindings[ztype][ret->num_bindings[ztype]].binding = 
binding;
                ret->bindings[ztype][ret->num_bindings[ztype]].type = vktype;
                ret->bindings[ztype][ret->num_bindings[ztype]].size = 
glsl_get_length(var->type);
                assert(ret->bindings[ztype][ret->num_bindings[ztype]].size);
                ret->num_bindings[ztype]++;
+               ubo_binding_mask |= BITFIELD_BIT(binding);
             }
          } else if (var->data.mode == nir_var_mem_ssbo) {
             ztype = ZINK_DESCRIPTOR_TYPE_SSBO;
@@ -4415,12 +4418,15 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
                                              VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
                                              var->data.driver_location,
                                              screen->compact_descriptors);
-            ret->bindings[ztype][ret->num_bindings[ztype]].index = 
var->data.driver_location;
-            ret->bindings[ztype][ret->num_bindings[ztype]].binding = 
var->data.binding;
-            ret->bindings[ztype][ret->num_bindings[ztype]].type = 
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
-            ret->bindings[ztype][ret->num_bindings[ztype]].size = 
glsl_get_length(var->type);
-            assert(ret->bindings[ztype][ret->num_bindings[ztype]].size);
-            ret->num_bindings[ztype]++;
+            if (!(ssbo_binding_mask & BITFIELD_BIT(var->data.binding))) {
+               ret->bindings[ztype][ret->num_bindings[ztype]].index = 
var->data.driver_location;
+               ret->bindings[ztype][ret->num_bindings[ztype]].binding = 
var->data.binding;
+               ret->bindings[ztype][ret->num_bindings[ztype]].type = 
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+               ret->bindings[ztype][ret->num_bindings[ztype]].size = 
glsl_get_length(var->type);
+               assert(ret->bindings[ztype][ret->num_bindings[ztype]].size);
+               ret->num_bindings[ztype]++;
+               ssbo_binding_mask |= BITFIELD_BIT(var->data.binding);
+            }
          } else {
             assert(var->data.mode == nir_var_uniform ||
                    var->data.mode == nir_var_image);

Reply via email to