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);