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>
This commit is contained in:
Mike Blumenkrantz 2023-02-24 10:32:10 -05:00 committed by Marge Bot
parent db1af91f1b
commit a7b98dd4be

View file

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