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@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11404>
This commit is contained in:
parent
2e97d8245d
commit
43dace32a0
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue