Module: Mesa Branch: main Commit: 2d627f28c8fb55336d001846cfe70877b446d978 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d627f28c8fb55336d001846cfe70877b446d978
Author: Lionel Landwerlin <[email protected]> Date: Sat Jan 7 02:54:44 2023 +0200 anv: use the null surface with unused push descriptor binding table entries Some binding table entries have been identify as unused in the shaders by the push constant analysis pass. We can just put the null entry in there. Signed-off-by: Lionel Landwerlin <[email protected]> Fixes: b49b18f0b7 ("anv: reduce BT emissions & surface state writes with push descriptors") Reviewed-by: Emma Anholt <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20555> --- src/intel/vulkan/genX_cmd_buffer.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 3f20836c237..8914c831f3c 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2048,11 +2048,20 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, } case ANV_DESCRIPTOR_SET_DESCRIPTORS: { + struct anv_descriptor_set *set = + pipe_state->descriptors[binding->index]; + + /* If the shader doesn't access the set buffer, just put the null + * surface. + */ + if (set->is_push && !shader->push_desc_info.used_set_buffer) { + bt_map[s] = 0; + break; + } + /* This is a descriptor set buffer so the set index is actually * given by binding->binding. (Yes, that's confusing.) */ - struct anv_descriptor_set *set = - pipe_state->descriptors[binding->index]; assert(set->desc_mem.alloc_size); assert(set->desc_surface_state.alloc_size); bt_map[s] = set->desc_surface_state.offset + state_offset; @@ -2065,6 +2074,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, assert(binding->set < MAX_SETS); const struct anv_descriptor_set *set = pipe_state->descriptors[binding->set]; + if (binding->index >= set->descriptor_count) { /* From the Vulkan spec section entitled "DescriptorSet and * Binding Assignment": @@ -2081,6 +2091,21 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, assert(binding->index < set->layout->descriptor_count); continue; } + + /* For push descriptor, if the binding is fully promoted to push + * constants, just reference the null surface in the binding table. + * It's unused and we didn't allocate/pack a surface state for it . + */ + if (set->is_push) { + uint32_t desc_idx = set->layout->binding[binding->binding].descriptor_index; + assert(desc_idx < MAX_PUSH_DESCRIPTORS); + + if (shader->push_desc_info.fully_promoted_ubo_descriptors & BITFIELD_BIT(desc_idx)) { + surface_state = cmd_buffer->device->null_surface_state; + break; + } + } + const struct anv_descriptor *desc = &set->descriptors[binding->index]; /* Relative offset in the STATE_BASE_ADDRESS::SurfaceStateBaseAddress * heap. Depending on where the descriptor surface state is
