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

Author: Mike Blumenkrantz <[email protected]>
Date:   Mon May 16 17:26:59 2022 -0400

zink: use descriptor set index indirection in program init

should be no functional changes

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16645>

---

 src/gallium/drivers/zink/zink_descriptors.c      | 14 ++++---
 src/gallium/drivers/zink/zink_descriptors.h      |  1 +
 src/gallium/drivers/zink/zink_descriptors_lazy.c | 53 ++++++++++++++++--------
 3 files changed, 44 insertions(+), 24 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_descriptors.c 
b/src/gallium/drivers/zink/zink_descriptors.c
index 4cfc17c2fb6..8db4ec0880b 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -327,9 +327,10 @@ descriptor_pool_create(struct zink_screen *screen, enum 
zink_descriptor_type typ
    VkDescriptorPoolCreateInfo dpci = {0};
    dpci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
    dpci.pPoolSizes = pool_key->sizes;
-   dpci.poolSizeCount = pool_key->sizes[1].descriptorCount ? 2 : 1;
+   dpci.poolSizeCount = pool_key->num_type_sizes;
    dpci.flags = 0;
    dpci.maxSets = ZINK_DEFAULT_MAX_DESCS;
+   assert(pool_key->num_type_sizes);
    if (VKSCR(CreateDescriptorPool)(screen->dev, &dpci, 0, &pool->descpool) != 
VK_SUCCESS) {
       mesa_loge("ZINK: vkCreateDescriptorPool failed");
       goto fail;
@@ -464,8 +465,7 @@ hash_descriptor_pool_key(const void *key)
    uint32_t hash = 0;
    const struct zink_descriptor_pool_key *k = key;
    hash = XXH32(&k->layout, sizeof(void*), hash);
-   const unsigned num_type_sizes = k->sizes[1].descriptorCount ? 2 : 1;
-   for (unsigned i = 0; i < num_type_sizes; i++)
+   for (unsigned i = 0; i < k->num_type_sizes; i++)
       hash = XXH32(&k->sizes[i], sizeof(VkDescriptorPoolSize), hash);
 
    return hash;
@@ -476,8 +476,8 @@ equals_descriptor_pool_key(const void *a, const void *b)
 {
    const struct zink_descriptor_pool_key *a_k = a;
    const struct zink_descriptor_pool_key *b_k = b;
-   const unsigned a_num_type_sizes = a_k->sizes[1].descriptorCount ? 2 : 1;
-   const unsigned b_num_type_sizes = b_k->sizes[1].descriptorCount ? 2 : 1;
+   const unsigned a_num_type_sizes = a_k->num_type_sizes;
+   const unsigned b_num_type_sizes = b_k->num_type_sizes;
    return a_k->layout == b_k->layout &&
           a_num_type_sizes == b_num_type_sizes &&
           !memcmp(a_k->sizes, b_k->sizes, b_num_type_sizes * 
sizeof(VkDescriptorPoolSize));
@@ -490,9 +490,9 @@ zink_descriptor_util_pool_key_get(struct zink_context *ctx, 
enum zink_descriptor
 {
    uint32_t hash = 0;
    struct zink_descriptor_pool_key key;
+   key.num_type_sizes = num_type_sizes;
    if (type != ZINK_DESCRIPTOR_TYPES) {
       key.layout = layout_key;
-      key.sizes[1].descriptorCount = 0;
       memcpy(key.sizes, sizes, num_type_sizes * sizeof(VkDescriptorPoolSize));
       hash = hash_descriptor_pool_key(&key);
       struct set_entry *he = 
_mesa_set_search_pre_hashed(&ctx->desc_pool_keys[type], hash, &key);
@@ -502,6 +502,8 @@ zink_descriptor_util_pool_key_get(struct zink_context *ctx, 
enum zink_descriptor
 
    struct zink_descriptor_pool_key *pool_key = rzalloc(ctx, struct 
zink_descriptor_pool_key);
    pool_key->layout = layout_key;
+   pool_key->num_type_sizes = num_type_sizes;
+   assert(pool_key->num_type_sizes);
    memcpy(pool_key->sizes, sizes, num_type_sizes * 
sizeof(VkDescriptorPoolSize));
    if (type != ZINK_DESCRIPTOR_TYPES)
       _mesa_set_add_pre_hashed(&ctx->desc_pool_keys[type], hash, pool_key);
diff --git a/src/gallium/drivers/zink/zink_descriptors.h 
b/src/gallium/drivers/zink/zink_descriptors.h
index e743aec845a..d60a15abdc1 100644
--- a/src/gallium/drivers/zink/zink_descriptors.h
+++ b/src/gallium/drivers/zink/zink_descriptors.h
@@ -101,6 +101,7 @@ struct zink_descriptor_layout {
 
 struct zink_descriptor_pool_key {
    unsigned use_count;
+   unsigned num_type_sizes;
    struct zink_descriptor_layout_key *layout;
    VkDescriptorPoolSize sizes[2];
 };
diff --git a/src/gallium/drivers/zink/zink_descriptors_lazy.c 
b/src/gallium/drivers/zink/zink_descriptors_lazy.c
index eb1c74ac2ec..d6d0bbcbe3e 100644
--- a/src/gallium/drivers/zink/zink_descriptors_lazy.c
+++ b/src/gallium/drivers/zink/zink_descriptors_lazy.c
@@ -182,6 +182,7 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, 
struct zink_program
       enum pipe_shader_type stage = 
pipe_shader_type_from_mesa(shader->nir->info.stage);
       VkShaderStageFlagBits stage_flags = zink_shader_stage(stage);
       for (int j = 0; j < ZINK_DESCRIPTOR_TYPES; j++) {
+         unsigned desc_set = screen->desc_set_id[j] - 1;
          for (int k = 0; k < shader->num_bindings[j]; k++) {
             /* dynamic ubos handled in push */
             if (shader->bindings[j][k].type == 
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) {
@@ -191,8 +192,8 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, 
struct zink_program
                continue;
             }
 
-            assert(num_bindings[j] < ARRAY_SIZE(bindings[j]));
-            VkDescriptorSetLayoutBinding *binding = 
&bindings[j][num_bindings[j]];
+            assert(num_bindings[desc_set] < ARRAY_SIZE(bindings[desc_set]));
+            VkDescriptorSetLayoutBinding *binding = 
&bindings[desc_set][num_bindings[desc_set]];
             binding->binding = shader->bindings[j][k].binding;
             binding->descriptorType = shader->bindings[j][k].type;
             binding->descriptorCount = shader->bindings[j][k].size;
@@ -202,11 +203,11 @@ zink_descriptor_program_init_lazy(struct zink_context 
*ctx, struct zink_program
             enum zink_descriptor_size_index idx = 
zink_vktype_to_size_idx(shader->bindings[j][k].type);
             sizes[idx].descriptorCount += shader->bindings[j][k].size;
             sizes[idx].type = shader->bindings[j][k].type;
-            init_template_entry(shader, j, k, &entries[j][entry_idx[j]], 
&entry_idx[j], screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY);
-            num_bindings[j]++;
-            has_bindings |= BITFIELD_BIT(j);
+            init_template_entry(shader, j, k, 
&entries[desc_set][entry_idx[desc_set]], &entry_idx[desc_set], 
screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY);
+            num_bindings[desc_set]++;
+            has_bindings |= BITFIELD_BIT(desc_set);
          }
-         num_type_sizes[j] = descriptor_program_num_sizes(sizes, j);
+         num_type_sizes[desc_set] = descriptor_program_num_sizes(sizes, j);
       }
       pg->dd->bindless |= shader->bindless;
    }
@@ -225,8 +226,8 @@ zink_descriptor_program_init_lazy(struct zink_context *ctx, 
struct zink_program
    if (has_bindings) {
       for (unsigned i = 0; i < ARRAY_SIZE(sizes); i++)
          sizes[i].descriptorCount *= screen->descriptor_mode == 
ZINK_DESCRIPTOR_MODE_LAZY ? MAX_LAZY_DESCRIPTORS : ZINK_DEFAULT_MAX_DESCS;
-      u_foreach_bit(type, has_bindings) {
-         for (unsigned i = 0; i < type; i++) {
+      u_foreach_bit(desc_set, has_bindings) {
+         for (unsigned i = 0; i < desc_set; i++) {
             /* push set is always 0 */
             if (!pg->dsl[i + 1]) {
                /* inject a null dsl */
@@ -235,29 +236,45 @@ zink_descriptor_program_init_lazy(struct zink_context 
*ctx, struct zink_program
             }
          }
          struct zink_descriptor_layout_key *key;
-         pg->dd->layouts[pg->num_dsl] = zink_descriptor_util_layout_get(ctx, 
type, bindings[type], num_bindings[type], &key);
-         enum zink_descriptor_size_index idx = 
zink_descriptor_type_to_size_idx(type);
+         pg->dd->layouts[pg->num_dsl] = zink_descriptor_util_layout_get(ctx, 
desc_set, bindings[desc_set], num_bindings[desc_set], &key);
+         unsigned idx = screen->compact_descriptors ? 
zink_descriptor_type_to_size_idx_comp(desc_set) :
+                                                      
zink_descriptor_type_to_size_idx(desc_set);
          VkDescriptorPoolSize *sz = &sizes[idx];
-         if (!sz->descriptorCount)
-            sz++;
-         pg->dd->pool_key[type] = zink_descriptor_util_pool_key_get(ctx, type, 
key, sz, num_type_sizes[type]);
-         pg->dd->pool_key[type]->use_count++;
+         VkDescriptorPoolSize sz2[4];
+         if (screen->compact_descriptors) {
+            unsigned found = 0;
+            while (found < num_type_sizes[desc_set]) {
+               if (sz->descriptorCount) {
+                  memcpy(&sz2[found], sz, sizeof(VkDescriptorPoolSize));
+                  found++;
+               }
+               sz++;
+            }
+            sz = sz2;
+         } else {
+            if (!sz->descriptorCount)
+               sz++;
+         }
+         pg->dd->pool_key[desc_set] = zink_descriptor_util_pool_key_get(ctx, 
desc_set, key, sz, num_type_sizes[desc_set]);
+         pg->dd->pool_key[desc_set]->use_count++;
          pg->dsl[pg->num_dsl] = pg->dd->layouts[pg->num_dsl]->layout;
          pg->num_dsl++;
       }
    }
    /* TODO: make this dynamic? */
    if (pg->dd->bindless) {
-      pg->num_dsl = ZINK_DESCRIPTOR_BINDLESS + 1;
-      pg->dsl[ZINK_DESCRIPTOR_BINDLESS] = ctx->dd->bindless_layout;
-      for (unsigned i = 0; i < ZINK_DESCRIPTOR_BINDLESS; i++) {
+      unsigned desc_set = screen->desc_set_id[ZINK_DESCRIPTOR_BINDLESS];
+      pg->num_dsl = desc_set + 1;
+      pg->dsl[desc_set] = ctx->dd->bindless_layout;
+      for (unsigned i = 0; i < desc_set; i++) {
          if (!pg->dsl[i]) {
             /* inject a null dsl */
             pg->dsl[i] = ctx->dd->dummy_dsl->layout;
-            if (i != ZINK_DESCRIPTOR_TYPES)
+            if (i != screen->desc_set_id[ZINK_DESCRIPTOR_TYPES])
                pg->dd->binding_usage |= BITFIELD_BIT(i);
          }
       }
+      pg->dd->binding_usage |= BITFIELD_MASK(ZINK_DESCRIPTOR_TYPES);
    }
 
    pg->layout = zink_pipeline_layout_create(screen, pg, &pg->compat_id);

Reply via email to