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);
