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