mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 18:00:10 +01:00
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:
parent
db1af91f1b
commit
a7b98dd4be
1 changed files with 13 additions and 7 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue