Module: Mesa Branch: staging/23.1 Commit: 6e84dfe468bdddb2bff245da3b0bbef3e3427d80 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6e84dfe468bdddb2bff245da3b0bbef3e3427d80
Author: Mike Blumenkrantz <[email protected]> Date: Fri Aug 4 12:17:20 2023 -0400 zink: better handle separate shader dsl creation when no bindings exist this otherwise underflows the array and provides a (probably huge) garbage value for the binding id, which then causes the driver to massively overallocate both the layout and set/pool/buffer the main result of this is that on radv any simple test that should be near-instant takes 2-3 seconds to execute, which somehow nobody noticed Fixes: e3b746e3a31 ("zink: use GPL to handle (simple) separate shader objects") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24501> (cherry picked from commit 652e87bc5d02903e4ea00602de84d803f10d414e) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_descriptors.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 80fab8344fb..d0a6a736b53 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -85,7 +85,7 @@ "description": "zink: better handle separate shader dsl creation when no bindings exist", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "e3b746e3a31e350e9f0962717e49acba28efee30" }, diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index af1aa5d07eb..d656b2ea7dd 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -676,9 +676,15 @@ void zink_descriptor_shader_get_binding_offsets(const struct zink_shader *shader, unsigned *offsets) { offsets[ZINK_DESCRIPTOR_TYPE_UBO] = 0; - offsets[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] = shader->bindings[ZINK_DESCRIPTOR_TYPE_UBO][shader->num_bindings[ZINK_DESCRIPTOR_TYPE_UBO] - 1].binding + 1; - offsets[ZINK_DESCRIPTOR_TYPE_SSBO] = offsets[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] + shader->bindings[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW][shader->num_bindings[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] - 1].binding + 1; - offsets[ZINK_DESCRIPTOR_TYPE_IMAGE] = offsets[ZINK_DESCRIPTOR_TYPE_SSBO] + shader->bindings[ZINK_DESCRIPTOR_TYPE_SSBO][shader->num_bindings[ZINK_DESCRIPTOR_TYPE_SSBO] - 1].binding + 1; + offsets[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] = (shader->num_bindings[ZINK_DESCRIPTOR_TYPE_UBO] ? + shader->bindings[ZINK_DESCRIPTOR_TYPE_UBO][shader->num_bindings[ZINK_DESCRIPTOR_TYPE_UBO] - 1].binding + 1 : + 1); + offsets[ZINK_DESCRIPTOR_TYPE_SSBO] = offsets[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] + (shader->num_bindings[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] ? + shader->bindings[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW][shader->num_bindings[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW] - 1].binding + 1 : + 1); + offsets[ZINK_DESCRIPTOR_TYPE_IMAGE] = offsets[ZINK_DESCRIPTOR_TYPE_SSBO] + (shader->num_bindings[ZINK_DESCRIPTOR_TYPE_SSBO] ? + shader->bindings[ZINK_DESCRIPTOR_TYPE_SSBO][shader->num_bindings[ZINK_DESCRIPTOR_TYPE_SSBO] - 1].binding + 1 : + 1); } void
