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

Author: Chia-I Wu <[email protected]>
Date:   Mon Oct  9 16:43:36 2023 -0700

anv: support alternative push descriptor sets

Do not assume anv_cmd_pipeline_state::push_descriptor is the currently
bound push descriptor set.  With this and anv_push_descriptor_set_init,
it is possible to initialize a temporary push descriptor set on stack
for internal use.

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

---

 src/intel/vulkan/anv_descriptor_set.c |  7 +++++++
 src/intel/vulkan/anv_private.h        |  1 +
 src/intel/vulkan/genX_cmd_buffer.c    | 31 ++++++++++++++++---------------
 3 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/src/intel/vulkan/anv_descriptor_set.c 
b/src/intel/vulkan/anv_descriptor_set.c
index bb08cb2dce3..1945fafee66 100644
--- a/src/intel/vulkan/anv_descriptor_set.c
+++ b/src/intel/vulkan/anv_descriptor_set.c
@@ -845,6 +845,7 @@ anv_pipeline_sets_layout_init(struct 
anv_pipeline_sets_layout *layout,
    memset(layout, 0, sizeof(*layout));
 
    layout->device = device;
+   layout->push_descriptor_set_index = -1;
    layout->independent_sets = independent_sets;
 }
 
@@ -874,6 +875,12 @@ anv_pipeline_sets_layout_add(struct 
anv_pipeline_sets_layout *layout,
    layout->num_dynamic_buffers += set_layout->dynamic_offset_count;
 
    assert(layout->num_dynamic_buffers < MAX_DYNAMIC_BUFFERS);
+
+   if (set_layout->flags &
+       VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR) {
+      assert(layout->push_descriptor_set_index == -1);
+      layout->push_descriptor_set_index = set_idx;
+   }
 }
 
 void
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index b745837a19b..fb65719f48b 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -2574,6 +2574,7 @@ struct anv_pipeline_sets_layout {
 
    uint32_t num_sets;
    uint32_t num_dynamic_buffers;
+   int push_descriptor_set_index;
 
    bool independent_sets;
 
diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index 63fd078c90f..a75fe633f2d 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -2444,25 +2444,26 @@ 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_layout *layout = set->layout;
-
-   if (pipeline->use_push_descriptor) {
-      while (set->generate_surface_states) {
-         int desc_idx = u_bit_scan(&set->generate_surface_states);
-         struct anv_descriptor *desc = &set->descriptors[desc_idx];
-         struct anv_buffer_view *bview = desc->set_buffer_view;
-
-         if (bview != NULL) {
-            bview->general.state =
-               anv_cmd_buffer_alloc_surface_state(cmd_buffer);
-            anv_descriptor_write_surface_state(cmd_buffer->device, desc,
-                                               bview->general.state);
-         }
+   assert(pipeline->use_push_descriptor &&
+          pipeline->layout.push_descriptor_set_index != -1);
+
+   struct anv_descriptor_set *set =
+      state->descriptors[pipeline->layout.push_descriptor_set_index];
+   while (set->generate_surface_states) {
+      int desc_idx = u_bit_scan(&set->generate_surface_states);
+      struct anv_descriptor *desc = &set->descriptors[desc_idx];
+      struct anv_buffer_view *bview = desc->set_buffer_view;
+
+      if (bview != NULL) {
+         bview->general.state =
+            anv_cmd_buffer_alloc_surface_state(cmd_buffer);
+         anv_descriptor_write_surface_state(cmd_buffer->device, desc,
+                                            bview->general.state);
       }
    }
 
    if (pipeline->use_push_descriptor_buffer) {
+      struct anv_descriptor_set_layout *layout = set->layout;
       enum isl_format format =
          anv_isl_format_for_descriptor_type(cmd_buffer->device,
                                             VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);

Reply via email to