From ebb68d506d235afff1e17ded77186782c2f90e60 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Sat, 7 Oct 2023 00:42:11 +0300 Subject: [PATCH] anv: simplify push descriptors There can only be one push descriptor amongst all descriptor sets. Signed-off-by: Lionel Landwerlin Reviewed-by: Chia-I Wu Part-of: --- src/intel/vulkan/anv_cmd_buffer.c | 93 ++++++++++++++++---------------------- src/intel/vulkan/anv_private.h | 2 +- src/intel/vulkan/genX_cmd_buffer.c | 2 +- 3 files changed, 42 insertions(+), 55 deletions(-) diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index e8a9d61..748a2ae 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -62,10 +62,9 @@ static void anv_cmd_pipeline_state_finish(struct anv_cmd_buffer *cmd_buffer, struct anv_cmd_pipeline_state *pipe_state) { - if (pipe_state->push_descriptor) { + if (pipe_state->push_descriptor.set.layout) { anv_descriptor_set_layout_unref(cmd_buffer->device, - pipe_state->push_descriptor->set.layout); - vk_free(&cmd_buffer->vk.pool->alloc, pipe_state->push_descriptor); + pipe_state->push_descriptor.set.layout); } } @@ -1132,45 +1131,30 @@ void anv_CmdPushConstants( cmd_buffer->state.push_constants_dirty |= stageFlags; } -static struct anv_descriptor_set * -anv_cmd_buffer_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer, - VkPipelineBindPoint bind_point, - struct anv_descriptor_set_layout *layout, - uint32_t _set) +static struct anv_cmd_pipeline_state * +anv_cmd_buffer_get_pipe_state(struct anv_cmd_buffer *cmd_buffer, + VkPipelineBindPoint bind_point) { - struct anv_cmd_pipeline_state *pipe_state; - switch (bind_point) { case VK_PIPELINE_BIND_POINT_GRAPHICS: - pipe_state = &cmd_buffer->state.gfx.base; - break; - + return &cmd_buffer->state.gfx.base; case VK_PIPELINE_BIND_POINT_COMPUTE: - pipe_state = &cmd_buffer->state.compute.base; - break; - + return &cmd_buffer->state.compute.base; case VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR: - pipe_state = &cmd_buffer->state.rt.base; + return &cmd_buffer->state.rt.base; break; - default: unreachable("invalid bind point"); } +} - struct anv_push_descriptor_set **push_set = - &pipe_state->push_descriptor; - - if (*push_set == NULL) { - *push_set = vk_zalloc(&cmd_buffer->vk.pool->alloc, - sizeof(struct anv_push_descriptor_set), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (*push_set == NULL) { - anv_batch_set_error(&cmd_buffer->batch, VK_ERROR_OUT_OF_HOST_MEMORY); - return NULL; - } - } - - struct anv_descriptor_set *set = &(*push_set)->set; +static void +anv_cmd_buffer_alloc_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer, + struct anv_descriptor_set_layout *layout, + uint32_t _set, + struct anv_push_descriptor_set *push_set) +{ + struct anv_descriptor_set *set = &push_set->set; if (set->layout != layout) { if (set->layout) @@ -1183,10 +1167,10 @@ anv_cmd_buffer_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer, set->size = anv_descriptor_set_layout_size(layout, false /* host_only */, 0); set->buffer_view_count = layout->buffer_view_count; set->descriptor_count = layout->descriptor_count; - set->buffer_views = (*push_set)->buffer_views; + set->buffer_views = push_set->buffer_views; if (layout->descriptor_buffer_size && - ((*push_set)->set_used_on_gpu || + (push_set->set_used_on_gpu || set->desc_mem.alloc_size < layout->descriptor_buffer_size)) { struct anv_physical_device *pdevice = cmd_buffer->device->physical; struct anv_state_stream *push_stream = @@ -1217,8 +1201,6 @@ anv_cmd_buffer_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer, set->desc_offset = anv_address_physical(set->desc_addr) - push_base_address; } - - return set; } void anv_CmdPushDescriptorSetKHR( @@ -1237,11 +1219,11 @@ void anv_CmdPushDescriptorSetKHR( struct anv_descriptor_set_layout *set_layout = layout->set[_set].layout; - struct anv_descriptor_set *set = - anv_cmd_buffer_push_descriptor_set(cmd_buffer, pipelineBindPoint, - set_layout, _set); - if (!set) - return; + struct anv_push_descriptor_set *push_set = + &anv_cmd_buffer_get_pipe_state(cmd_buffer, + pipelineBindPoint)->push_descriptor; + anv_cmd_buffer_alloc_push_descriptor_set(cmd_buffer, set_layout, + _set, push_set); /* Go through the user supplied descriptors. */ for (uint32_t i = 0; i < descriptorWriteCount; i++) { @@ -1254,7 +1236,8 @@ void anv_CmdPushDescriptorSetKHR( case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: for (uint32_t j = 0; j < write->descriptorCount; j++) { - anv_descriptor_set_write_image_view(cmd_buffer->device, set, + anv_descriptor_set_write_image_view(cmd_buffer->device, + &push_set->set, write->pImageInfo + j, write->descriptorType, write->dstBinding, @@ -1268,7 +1251,8 @@ void anv_CmdPushDescriptorSetKHR( ANV_FROM_HANDLE(anv_buffer_view, bview, write->pTexelBufferView[j]); - anv_descriptor_set_write_buffer_view(cmd_buffer->device, set, + anv_descriptor_set_write_buffer_view(cmd_buffer->device, + &push_set->set, write->descriptorType, bview, write->dstBinding, @@ -1283,7 +1267,8 @@ void anv_CmdPushDescriptorSetKHR( for (uint32_t j = 0; j < write->descriptorCount; j++) { ANV_FROM_HANDLE(anv_buffer, buffer, write->pBufferInfo[j].buffer); - anv_descriptor_set_write_buffer(cmd_buffer->device, set, + anv_descriptor_set_write_buffer(cmd_buffer->device, + &push_set->set, write->descriptorType, buffer, write->dstBinding, @@ -1302,7 +1287,7 @@ void anv_CmdPushDescriptorSetKHR( ANV_FROM_HANDLE(vk_acceleration_structure, accel, accel_write->pAccelerationStructures[j]); anv_descriptor_set_write_acceleration_structure(cmd_buffer->device, - set, accel, + &push_set->set, accel, write->dstBinding, write->dstArrayElement + j); } @@ -1315,7 +1300,8 @@ void anv_CmdPushDescriptorSetKHR( } anv_cmd_buffer_bind_descriptor_set(cmd_buffer, pipelineBindPoint, - layout, _set, set, NULL, NULL); + layout, _set, &push_set->set, + NULL, NULL); } void anv_CmdPushDescriptorSetWithTemplateKHR( @@ -1335,18 +1321,19 @@ void anv_CmdPushDescriptorSetWithTemplateKHR( struct anv_descriptor_set_layout *set_layout = layout->set[_set].layout; - struct anv_descriptor_set *set = - anv_cmd_buffer_push_descriptor_set(cmd_buffer, template->bind_point, - set_layout, _set); - if (!set) - return; + struct anv_push_descriptor_set *push_set = + &anv_cmd_buffer_get_pipe_state(cmd_buffer, + template->bind_point)->push_descriptor; + anv_cmd_buffer_alloc_push_descriptor_set(cmd_buffer, set_layout, + _set, push_set); - anv_descriptor_set_write_template(cmd_buffer->device, set, + anv_descriptor_set_write_template(cmd_buffer->device, &push_set->set, template, pData); anv_cmd_buffer_bind_descriptor_set(cmd_buffer, template->bind_point, - layout, _set, set, NULL, NULL); + layout, _set, &push_set->set, + NULL, NULL); } void anv_CmdSetRayTracingPipelineStackSizeKHR( diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index b664f22..65fbdb5 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3239,7 +3239,7 @@ struct anv_simple_shader { */ struct anv_cmd_pipeline_state { struct anv_descriptor_set *descriptors[MAX_SETS]; - struct anv_push_descriptor_set *push_descriptor; + struct anv_push_descriptor_set push_descriptor; struct anv_push_constants push_constants; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index c151a5d..66ec336 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2442,7 +2442,7 @@ flush_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer, struct anv_cmd_pipeline_state *state, struct anv_pipeline *pipeline) { - struct anv_descriptor_set *set = &state->push_descriptor->set; + struct anv_descriptor_set *set = &state->push_descriptor.set; struct anv_descriptor_set_layout *layout = set->layout; if (pipeline->use_push_descriptor) { -- 2.7.4