Mesa (main): zink: cache descriptor update templates along with layout

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 16 04:23:43 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Sun May  9 13:56:45 2021 -0400

zink: cache descriptor update templates along with layout

this simplifies a bunch of code and just makes more sense given that the
lifetimes should match

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11404>

---

 src/gallium/drivers/zink/zink_descriptors.c      | 38 +++++++-------------
 src/gallium/drivers/zink/zink_descriptors.h      | 16 ++++++---
 src/gallium/drivers/zink/zink_descriptors_lazy.c | 44 +++++++++++++-----------
 3 files changed, 48 insertions(+), 50 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c
index 4009cf2636b..f4bce1823e2 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -389,7 +389,7 @@ equals_descriptor_layout(const void *a, const void *b)
           !memcmp(a_k->bindings, b_k->bindings, a_k->num_descriptors * sizeof(VkDescriptorSetLayoutBinding));
 }
 
-VkDescriptorSetLayout
+struct zink_descriptor_layout *
 zink_descriptor_util_layout_get(struct zink_context *ctx, enum zink_descriptor_type type,
                       VkDescriptorSetLayoutBinding *bindings, unsigned num_bindings,
                       struct zink_descriptor_layout_key **layout_key)
@@ -418,11 +418,7 @@ zink_descriptor_util_layout_get(struct zink_context *ctx, enum zink_descriptor_t
       struct hash_entry *he = _mesa_hash_table_search_pre_hashed(&ctx->desc_set_layouts[type], hash, &key);
       if (he) {
          *layout_key = (void*)he->key;
-#if VK_USE_64_BIT_PTR_DEFINES == 1
-         return (VkDescriptorSetLayout)he->data;
-#else
-         return *((VkDescriptorSetLayout*)he->data);
-#endif
+         return he->data;
       }
    }
 
@@ -441,23 +437,17 @@ zink_descriptor_util_layout_get(struct zink_context *ctx, enum zink_descriptor_t
    }
    memcpy(k->bindings, key.bindings, bindings_size);
 
+   struct zink_descriptor_layout *layout = rzalloc(ctx, struct zink_descriptor_layout);
+   layout->layout = dsl;
    if (type != ZINK_DESCRIPTOR_TYPES) {
-#if VK_USE_64_BIT_PTR_DEFINES == 1
-      _mesa_hash_table_insert_pre_hashed(&ctx->desc_set_layouts[type], hash, k, dsl);
-#else
-      {
-         VkDescriptorSetLayout *dsl_p = ralloc(NULL, VkDescriptorSetLayout);
-         *dsl_p = dsl;
-         _mesa_hash_table_insert_pre_hashed(&ctx->desc_set_layouts[type], hash, k, dsl_p);
-      }
-#endif
+      _mesa_hash_table_insert_pre_hashed(&ctx->desc_set_layouts[type], hash, k, layout);
    }
    *layout_key = k;
-   return dsl;
+   return layout;
 }
 
 bool
-zink_descriptor_util_push_layouts_get(struct zink_context *ctx, VkDescriptorSetLayout *dsls, struct zink_descriptor_layout_key **layout_keys)
+zink_descriptor_util_push_layouts_get(struct zink_context *ctx, struct zink_descriptor_layout **dsls, struct zink_descriptor_layout_key **layout_keys)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
    VkDescriptorSetLayoutBinding bindings[PIPE_SHADER_TYPES];
@@ -604,7 +594,7 @@ allocate_desc_set(struct zink_context *ctx, struct zink_program *pg, enum zink_d
          bucket_size = desc_factor;
    }
    VkDescriptorSet desc_set[bucket_size];
-   if (!zink_descriptor_util_alloc_sets(screen, push_set ? ctx->dd->push_dsl[is_compute] : pg->dsl[type + 1], pool->descpool, desc_set, bucket_size))
+   if (!zink_descriptor_util_alloc_sets(screen, push_set ? ctx->dd->push_dsl[is_compute]->layout : pg->dsl[type + 1], pool->descpool, desc_set, bucket_size))
       return VK_NULL_HANDLE;
 
    struct zink_descriptor_set *alloc = ralloc_array(pool, struct zink_descriptor_set, bucket_size);
@@ -1652,13 +1642,11 @@ zink_descriptor_layouts_deinit(struct zink_context *ctx)
    struct zink_screen *screen = zink_screen(ctx->base.screen);
    for (unsigned i = 0; i < ZINK_DESCRIPTOR_TYPES; i++) {
       hash_table_foreach(&ctx->desc_set_layouts[i], he) {
-#if VK_USE_64_BIT_PTR_DEFINES == 1
-         vkDestroyDescriptorSetLayout(screen->dev, (VkDescriptorSetLayout)he->data, NULL);
-#else
-         VkDescriptorSetLayout *r = (VkDescriptorSetLayout *)(he->data);
-         vkDestroyDescriptorSetLayout(screen->dev, *r, NULL);
-         ralloc_free(r);
-#endif
+         struct zink_descriptor_layout *layout = he->data;
+         vkDestroyDescriptorSetLayout(screen->dev, layout->layout, NULL);
+         if (layout->template)
+            screen->vk.DestroyDescriptorUpdateTemplate(screen->dev, layout->template, NULL);
+         ralloc_free(layout);
          _mesa_hash_table_remove(&ctx->desc_set_layouts[i], he);
       }
    }
diff --git a/src/gallium/drivers/zink/zink_descriptors.h b/src/gallium/drivers/zink/zink_descriptors.h
index 56c87014cb8..d37447b8d8f 100644
--- a/src/gallium/drivers/zink/zink_descriptors.h
+++ b/src/gallium/drivers/zink/zink_descriptors.h
@@ -88,6 +88,11 @@ struct zink_descriptor_layout_key {
    VkDescriptorSetLayoutBinding *bindings;
 };
 
+struct zink_descriptor_layout {
+   VkDescriptorSetLayout layout;
+   VkDescriptorUpdateTemplateKHR template;
+};
+
 struct zink_descriptor_pool_key {
    struct zink_descriptor_layout_key *layout;
    unsigned num_type_sizes;
@@ -107,7 +112,7 @@ struct zink_descriptor_data {
 
    struct zink_descriptor_layout_key *push_layout_keys[2]; //gfx, compute
    struct zink_descriptor_pool *push_pool[2]; //gfx, compute
-   VkDescriptorSetLayout push_dsl[2]; //gfx, compute
+   struct zink_descriptor_layout *push_dsl[2]; //gfx, compute
    uint8_t last_push_usage[2];
    bool push_valid[2];
    uint32_t push_state[2];
@@ -116,7 +121,7 @@ struct zink_descriptor_data {
    struct zink_descriptor_set *last_set[2];
 
    VkDescriptorPool dummy_pool;
-   VkDescriptorSetLayout dummy_dsl;
+   struct zink_descriptor_layout *dummy_dsl;
    VkDescriptorSet dummy_set;
 
    bool changed[2][ZINK_DESCRIPTOR_TYPES + 1];
@@ -128,7 +133,8 @@ struct zink_program_descriptor_data {
    VkDescriptorPoolSize sizes[6]; //zink_descriptor_size_index
    struct zink_descriptor_layout_key *layout_key[ZINK_DESCRIPTOR_TYPES]; //push set doesn't need one
    uint8_t binding_usage;
-   VkDescriptorUpdateTemplateKHR templates[ZINK_DESCRIPTOR_TYPES + 1];
+   struct zink_descriptor_layout *layouts[ZINK_DESCRIPTOR_TYPES + 1];
+   VkDescriptorUpdateTemplateKHR push_template;
 };
 
 struct zink_batch_descriptor_data {
@@ -187,12 +193,12 @@ uint32_t
 zink_get_image_view_hash(struct zink_context *ctx, struct zink_image_view *image_view, bool is_buffer);
 bool
 zink_descriptor_util_alloc_sets(struct zink_screen *screen, VkDescriptorSetLayout dsl, VkDescriptorPool pool, VkDescriptorSet *sets, unsigned num_sets);
-VkDescriptorSetLayout
+struct zink_descriptor_layout *
 zink_descriptor_util_layout_get(struct zink_context *ctx, enum zink_descriptor_type type,
                       VkDescriptorSetLayoutBinding *bindings, unsigned num_bindings,
                       struct zink_descriptor_layout_key **layout_key);
 bool
-zink_descriptor_util_push_layouts_get(struct zink_context *ctx, VkDescriptorSetLayout *dsls, struct zink_descriptor_layout_key **layout_keys);
+zink_descriptor_util_push_layouts_get(struct zink_context *ctx, struct zink_descriptor_layout **dsls, struct zink_descriptor_layout_key **layout_keys);
 void
 zink_descriptor_util_init_null_set(struct zink_context *ctx, VkDescriptorSet desc_set);
 struct zink_resource *
diff --git a/src/gallium/drivers/zink/zink_descriptors_lazy.c b/src/gallium/drivers/zink/zink_descriptors_lazy.c
index 46c6a9046f4..17ecfb9d39f 100644
--- a/src/gallium/drivers/zink/zink_descriptors_lazy.c
+++ b/src/gallium/drivers/zink/zink_descriptors_lazy.c
@@ -202,18 +202,20 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, struct zink_program
       return !!pg->layout;
    }
 
-   pg->dsl[pg->num_dsl++] = push_count ? ctx->dd->push_dsl[pg->is_compute] : ctx->dd->dummy_dsl;
+   pg->dsl[pg->num_dsl++] = push_count ? ctx->dd->push_dsl[pg->is_compute]->layout : ctx->dd->dummy_dsl->layout;
    if (has_bindings) {
       u_foreach_bit(type, has_bindings) {
          for (unsigned i = 0; i < type; i++) {
             /* push set is always 0 */
             if (!pg->dsl[i + 1]) {
                /* inject a null dsl */
-               pg->dsl[pg->num_dsl++] = ctx->dd->dummy_dsl;
+               pg->dsl[pg->num_dsl++] = ctx->dd->dummy_dsl->layout;
                pg->dd->binding_usage |= BITFIELD_BIT(i);
             }
          }
-         pg->dsl[pg->num_dsl++] = zink_descriptor_util_layout_get(ctx, type, bindings[type], num_bindings[type], &pg->dd->layout_key[type]);
+         pg->dd->layouts[pg->num_dsl] = zink_descriptor_util_layout_get(ctx, type, bindings[type], num_bindings[type], &pg->dd->layout_key[type]);
+         pg->dsl[pg->num_dsl] = pg->dd->layouts[pg->num_dsl]->layout;
+         pg->num_dsl++;
       }
       for (unsigned i = 0; i < ARRAY_SIZE(pg->dd->sizes); i++)
          pg->dd->sizes[i].descriptorCount *= ZINK_DEFAULT_MAX_DESCS;
@@ -244,8 +246,9 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, struct zink_program
    };
    for (unsigned i = 0; i < pg->num_dsl; i++) {
       bool is_push = i == 0;
-      if (pg->dsl[i] == ctx->dd->dummy_dsl)
-         /* no need for empty templates */
+      /* no need for empty templates */
+      if (pg->dsl[i] == ctx->dd->dummy_dsl->layout ||
+          (!is_push && pg->dd->layouts[i]->template))
          continue;
       template[i].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO;
       assert(wd_count[i]);
@@ -259,8 +262,13 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, struct zink_program
       template[i].pipelineBindPoint = pg->is_compute ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS;
       template[i].pipelineLayout = pg->layout;
       template[i].set = i;
-      if (screen->vk.CreateDescriptorUpdateTemplate(screen->dev, &template[i], NULL, &pg->dd->templates[i]) != VK_SUCCESS)
+      VkDescriptorUpdateTemplateKHR t;
+      if (screen->vk.CreateDescriptorUpdateTemplate(screen->dev, &template[i], NULL, &t) != VK_SUCCESS)
          return false;
+      if (is_push)
+         pg->dd->push_template = t;
+      else
+         pg->dd->layouts[i]->template = t;
    }
    return true;
 }
@@ -268,12 +276,8 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, struct zink_program
 void
 zink_descriptor_program_deinit_lazy(struct zink_screen *screen, struct zink_program *pg)
 {
-   if (!pg->dd)
-      return;
-   for (unsigned i = 0; i < ARRAY_SIZE(pg->dd->templates); i++) {
-      if (pg->dd->templates[i])
-         screen->vk.DestroyDescriptorUpdateTemplate(screen->dev, pg->dd->templates[i], NULL);
-   }
+   if (pg->dd && pg->dd->push_template)
+      screen->vk.DestroyDescriptorUpdateTemplate(screen->dev, pg->dd->push_template, NULL);
    ralloc_free(pg->dd);
 }
 
@@ -334,7 +338,7 @@ get_descriptor_set_lazy(struct zink_context *ctx, struct zink_program *pg, enum
       zink_fence_wait(&ctx->base);
       return get_descriptor_set_lazy(ctx, pg, type, pool, is_compute);
    }
-   if (!zink_descriptor_util_alloc_sets(screen, pg ? pg->dsl[type + 1] : ctx->dd->push_dsl[is_compute],
+   if (!zink_descriptor_util_alloc_sets(screen, pg ? pg->dsl[type + 1] : ctx->dd->push_dsl[is_compute]->layout,
                                         pool->pool, &pool->sets[pool->sets_alloc], sets_to_alloc))
       return VK_NULL_HANDLE;
    pool->sets_alloc += sets_to_alloc;
@@ -381,7 +385,7 @@ void
 zink_descriptor_set_update_lazy(struct zink_context *ctx, struct zink_program *pg, enum zink_descriptor_type type, VkDescriptorSet set)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
-   screen->vk.UpdateDescriptorSetWithTemplate(screen->dev, set, pg->dd->templates[type + 1], ctx);
+   screen->vk.UpdateDescriptorSetWithTemplate(screen->dev, set, pg->dd->layouts[type + 1]->template, ctx);
 }
 
 void
@@ -436,7 +440,7 @@ zink_descriptors_update_lazy(struct zink_context *ctx, bool is_compute)
    if (pg->dd->binding_usage && changed_sets) {
       u_foreach_bit(type, changed_sets) {
          if (pg->dd->layout_key[type])
-            screen->vk.UpdateDescriptorSetWithTemplate(screen->dev, desc_sets[type + 1], pg->dd->templates[type + 1], ctx);
+            screen->vk.UpdateDescriptorSetWithTemplate(screen->dev, desc_sets[type + 1], pg->dd->layouts[type + 1]->template, ctx);
          assert(type + 1 < pg->num_dsl);
          vkCmdBindDescriptorSets(bs->cmdbuf,
                                  is_compute ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS,
@@ -449,11 +453,11 @@ zink_descriptors_update_lazy(struct zink_context *ctx, bool is_compute)
 
    if (pg->dd->push_usage && dd_lazy(ctx)->push_state_changed[is_compute]) {
       if (screen->info.have_KHR_push_descriptor)
-         screen->vk.CmdPushDescriptorSetWithTemplateKHR(batch->state->cmdbuf, pg->dd->templates[0],
+         screen->vk.CmdPushDescriptorSetWithTemplateKHR(batch->state->cmdbuf, pg->dd->push_template,
                                                      pg->layout, 0, ctx);
       else {
          assert(desc_sets[0]);
-         screen->vk.UpdateDescriptorSetWithTemplate(screen->dev, desc_sets[0], pg->dd->templates[0], ctx);
+         screen->vk.UpdateDescriptorSetWithTemplate(screen->dev, desc_sets[0], pg->dd->push_template, ctx);
          vkCmdBindDescriptorSets(batch->state->cmdbuf,
                                  is_compute ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS,
                                  pg->layout, 0, 1, &desc_sets[0],
@@ -575,7 +579,7 @@ zink_descriptors_init_lazy(struct zink_context *ctx)
       return false;
    VkDescriptorPoolSize null_size = {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1};
    ctx->dd->dummy_pool = create_pool(screen, 1, &null_size, 0);
-   zink_descriptor_util_alloc_sets(screen, ctx->dd->dummy_dsl,
+   zink_descriptor_util_alloc_sets(screen, ctx->dd->dummy_dsl->layout,
                                    ctx->dd->dummy_pool, &ctx->dd->dummy_set, 1);
    zink_descriptor_util_init_null_set(ctx, ctx->dd->dummy_set);
    return true;
@@ -590,8 +594,8 @@ zink_descriptors_deinit_lazy(struct zink_context *ctx)
          vkDestroyDescriptorPool(screen->dev, ctx->dd->dummy_pool, NULL);
       if (screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY &&
           screen->info.have_KHR_push_descriptor) {
-         vkDestroyDescriptorSetLayout(screen->dev, ctx->dd->push_dsl[0], NULL);
-         vkDestroyDescriptorSetLayout(screen->dev, ctx->dd->push_dsl[1], NULL);
+         vkDestroyDescriptorSetLayout(screen->dev, ctx->dd->push_dsl[0]->layout, NULL);
+         vkDestroyDescriptorSetLayout(screen->dev, ctx->dd->push_dsl[1]->layout, NULL);
       }
    }
    ralloc_free(ctx->dd);



More information about the mesa-commit mailing list