summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2023-02-24 10:32:10 -0500
committerEric Engestrom <eric@engestrom.ch>2023-03-08 18:00:12 +0000
commitb47265ecd199d1155284a4256ecc8813516b5676 (patch)
treea5a2bf47bbc1dbd1d4cae4a82137e555f247f094
parent0759f1b56cb59ea1863e52148eaff3764cf2806f (diff)
downloadmesa-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.json2
-rw-r--r--src/gallium/drivers/zink/zink_compiler.c20
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);