zink: make a public util function for allocating descriptor sets
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 1 Apr 2021 19:00:51 +0000 (15:00 -0400)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 26 May 2021 00:52:38 +0000 (20:52 -0400)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10849>

src/gallium/drivers/zink/zink_descriptors.c
src/gallium/drivers/zink/zink_descriptors.h

index 000020e..5d3d645 100644 (file)
@@ -363,10 +363,30 @@ get_invalidated_desc_set(struct zink_descriptor_set *zds)
    return p_atomic_read(&zds->reference.count) == 1;
 }
 
+bool
+zink_descriptor_util_alloc_sets(struct zink_screen *screen, VkDescriptorSetLayout dsl, VkDescriptorPool pool, VkDescriptorSet *sets, unsigned num_sets)
+{
+   VkDescriptorSetAllocateInfo dsai;
+   VkDescriptorSetLayout layouts[num_sets];
+   memset((void *)&dsai, 0, sizeof(dsai));
+   dsai.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+   dsai.pNext = NULL;
+   dsai.descriptorPool = pool;
+   dsai.descriptorSetCount = num_sets;
+   for (unsigned i = 0; i < num_sets; i ++)
+      layouts[i] = dsl;
+   dsai.pSetLayouts = layouts;
+
+   if (vkAllocateDescriptorSets(screen->dev, &dsai, sets) != VK_SUCCESS) {
+      debug_printf("ZINK: %" PRIu64 " failed to allocate descriptor set :/\n", (uint64_t)dsl);
+      return false;
+   }
+   return true;
+}
+
 static struct zink_descriptor_set *
 allocate_desc_set(struct zink_screen *screen, struct zink_program *pg, enum zink_descriptor_type type, unsigned descs_used, bool is_compute)
 {
-   VkDescriptorSetAllocateInfo dsai;
    struct zink_descriptor_pool *pool = pg->dd->pool[type];
 #define DESC_BUCKET_FACTOR 10
    unsigned bucket_size = pool->key.layout->num_descriptors ? DESC_BUCKET_FACTOR : 1;
@@ -374,21 +394,9 @@ allocate_desc_set(struct zink_screen *screen, struct zink_program *pg, enum zink
       for (unsigned desc_factor = DESC_BUCKET_FACTOR; desc_factor < descs_used; desc_factor *= DESC_BUCKET_FACTOR)
          bucket_size = desc_factor;
    }
-   VkDescriptorSetLayout layouts[bucket_size];
-   memset((void *)&dsai, 0, sizeof(dsai));
-   dsai.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
-   dsai.pNext = NULL;
-   dsai.descriptorPool = pool->descpool;
-   dsai.descriptorSetCount = bucket_size;
-   for (unsigned i = 0; i < bucket_size; i ++)
-      layouts[i] = pg->dsl[type];
-   dsai.pSetLayouts = layouts;
-
    VkDescriptorSet desc_set[bucket_size];
-   if (vkAllocateDescriptorSets(screen->dev, &dsai, desc_set) != VK_SUCCESS) {
-      debug_printf("ZINK: %p failed to allocate descriptor set :/\n", pg);
+   if (!zink_descriptor_util_alloc_sets(screen, pg->dsl[type], pool->descpool, desc_set, bucket_size))
       return VK_NULL_HANDLE;
-   }
 
    struct zink_descriptor_set *alloc = ralloc_array(pool, struct zink_descriptor_set, bucket_size);
    assert(alloc);
index 6562a25..e2d2498 100644 (file)
@@ -148,6 +148,8 @@ void
 zink_descriptor_layouts_deinit(struct zink_context *ctx);
 
 bool
+zink_descriptor_util_alloc_sets(struct zink_screen *screen, VkDescriptorSetLayout dsl, VkDescriptorPool pool, VkDescriptorSet *sets, unsigned num_sets);
+bool
 zink_descriptor_program_init(struct zink_context *ctx,
                        struct zink_shader *stages[ZINK_SHADER_COUNT],
                        struct zink_program *pg);