From 77a5590de3e026458a5ba503cb9bd2bdf298a05b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 24 Feb 2023 10:32:10 -0500 Subject: [PATCH] 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: (cherry picked from commit a7b98dd4be8946856da8e6fe1a33758d864b5775) --- .pick_status.json | 2 +- 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 e6dfd5d18df..eb205ad2c18 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -292,7 +292,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 9ffcd674e07..e0afebd73f4 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -4116,6 +4116,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 | @@ -4138,13 +4140,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; @@ -4153,12 +4156,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);