[PATCH] wined3d: Reset and reuse Vulkan descriptor pools.
Henri Verbeet
hverbeet at gmail.com
Fri Apr 1 10:30:42 CDT 2022
On Thu, 31 Mar 2022 at 12:58, Jan Sikorski <jsikorski at codeweavers.com> wrote:
> +VkDescriptorSet wined3d_context_vk_create_vk_descriptor_set(struct wined3d_context_vk *context_vk,
> + VkDescriptorSetLayout vk_set_layout)
> +{
> + struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
> + const struct wined3d_vk_info *vk_info = context_vk->vk_info;
> + struct VkDescriptorSetAllocateInfo set_desc;
> + VkDescriptorPool vk_descriptor_pool;
> + VkDescriptorSet vk_descriptor_set;
> + VkResult vr;
> +
> + if (!(vk_descriptor_pool = wined3d_context_vk_get_vk_descriptor_pool(context_vk)))
> + return VK_NULL_HANDLE;
> +
> set_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
> set_desc.pNext = NULL;
> - set_desc.descriptorPool = context_vk->vk_descriptor_pool;
> + set_desc.descriptorPool = vk_descriptor_pool;
> set_desc.descriptorSetCount = 1;
> set_desc.pSetLayouts = &vk_set_layout;
> - if ((vr = VK_CALL(vkAllocateDescriptorSets(device_vk->vk_device, &set_desc, vk_descriptor_set))) >= 0)
> - return vr;
> + if ((vr = VK_CALL(vkAllocateDescriptorSets(device_vk->vk_device, &set_desc, &vk_descriptor_set))) >= 0)
> + return vk_descriptor_set;
>
> if (vr == VK_ERROR_FRAGMENTED_POOL || vr == VK_ERROR_OUT_OF_POOL_MEMORY)
> {
> - wined3d_context_vk_destroy_vk_descriptor_pool(context_vk,
> - context_vk->vk_descriptor_pool, context_vk->current_command_buffer.id);
> - context_vk->vk_descriptor_pool = VK_NULL_HANDLE;
> - if ((vr = wined3d_context_vk_create_vk_descriptor_pool(device_vk, vk_info, &context_vk->vk_descriptor_pool)))
> + wined3d_context_vk_reset_vk_descriptor_pool(context_vk,
> + vk_descriptor_pool, context_vk->current_command_buffer.id);
> + context_vk->vk_descriptor_pools[0] = context_vk->vk_descriptor_pools[--context_vk->vk_descriptor_pool_count];
It think the way we remove the pool from the array above is a little
awkward. It depends on knowledge about the internals of
wined3d_context_vk_get_vk_descriptor_pool() to know that
"vk_descriptor_pool" is the first entry in the array, which is never
quite ideal for users of such functions. Conceptually, this seems like
something wined3d_context_vk_reset_vk_descriptor_pool() should take
care of.
More information about the wine-devel
mailing list