diff options
author | Mike Blumenkrantz <michael.blumenkrantz@gmail.com> | 2023-02-24 10:32:10 -0500 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2023-03-08 18:00:12 +0000 |
commit | b47265ecd199d1155284a4256ecc8813516b5676 (patch) | |
tree | a5a2bf47bbc1dbd1d4cae4a82137e555f247f094 | |
parent | 0759f1b56cb59ea1863e52148eaff3764cf2806f (diff) | |
download | mesa-b47265ecd199d1155284a4256ecc8813516b5676.tar.gz |
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>
(cherry picked from commit a7b98dd4be8946856da8e6fe1a33758d864b5775)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_compiler.c | 20 |
2 files changed, 14 insertions, 8 deletions
diff --git a/.pick_status.json b/.pick_status.json index 0d89288afa4..d5ebef64bce 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -5494,7 +5494,7 @@ "description": "zink: avoid adding ubo/ssbo bindings multiple times for different bitsizes", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 7712b031f89..a23212aa878 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -3508,6 +3508,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 | @@ -3530,13 +3532,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; @@ -3545,12 +3548,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); |