Module: Mesa
Branch: main
Commit: ebb68d506d235afff1e17ded77186782c2f90e60
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ebb68d506d235afff1e17ded77186782c2f90e60

Author: Lionel Landwerlin <[email protected]>
Date:   Sat Oct  7 00:42:11 2023 +0300

anv: simplify push descriptors

There can only be one push descriptor amongst all descriptor sets.

Signed-off-by: Lionel Landwerlin <[email protected]>
Reviewed-by: Chia-I Wu <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25598>

---

 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 e8a9d61f186..748a2ae5f45 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 b664f223fa9..65fbdb51b3f 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 c151a5dec13..66ec3361667 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) {

Reply via email to