=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d: Reuse descriptor pools.
Alexandre Julliard
julliard at winehq.org
Wed Sep 12 16:37:56 CDT 2018
Module: vkd3d
Branch: master
Commit: b0bfe90c9e5d86c66da058a135446b96c705ab37
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=b0bfe90c9e5d86c66da058a135446b96c705ab37
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Wed Sep 12 15:19:55 2018 +0200
vkd3d: Reuse descriptor pools.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
libs/vkd3d/command.c | 68 ++++++++++++++++++++++++++++++++++++----------
libs/vkd3d/vkd3d_private.h | 4 +++
2 files changed, 58 insertions(+), 14 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 609edea..0940269 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -806,16 +806,25 @@ static VkDescriptorPool d3d12_command_allocator_allocate_descriptor_pool(
VkDescriptorPool vk_pool;
VkResult vr;
- pool_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
- pool_desc.pNext = NULL;
- pool_desc.flags = 0;
- pool_desc.maxSets = 512;
- pool_desc.poolSizeCount = ARRAY_SIZE(pool_sizes);
- pool_desc.pPoolSizes = pool_sizes;
- if ((vr = VK_CALL(vkCreateDescriptorPool(vk_device, &pool_desc, NULL, &vk_pool))) < 0)
- {
- ERR("Failed to create descriptor pool, vr %d.\n", vr);
- return VK_NULL_HANDLE;
+ if (allocator->free_descriptor_pool_count > 0)
+ {
+ vk_pool = allocator->free_descriptor_pools[allocator->free_descriptor_pool_count - 1];
+ allocator->free_descriptor_pools[allocator->free_descriptor_pool_count - 1] = VK_NULL_HANDLE;
+ --allocator->free_descriptor_pool_count;
+ }
+ else
+ {
+ pool_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ pool_desc.pNext = NULL;
+ pool_desc.flags = 0;
+ pool_desc.maxSets = 512;
+ pool_desc.poolSizeCount = ARRAY_SIZE(pool_sizes);
+ pool_desc.pPoolSizes = pool_sizes;
+ if ((vr = VK_CALL(vkCreateDescriptorPool(vk_device, &pool_desc, NULL, &vk_pool))) < 0)
+ {
+ ERR("Failed to create descriptor pool, vr %d.\n", vr);
+ return VK_NULL_HANDLE;
+ }
}
if (!(d3d12_command_allocator_add_descriptor_pool(allocator, vk_pool)))
@@ -886,14 +895,40 @@ static void vkd3d_buffer_destroy(struct vkd3d_buffer *buffer, struct d3d12_devic
VK_CALL(vkDestroyBuffer(device->vk_device, buffer->vk_buffer, NULL));
}
-static void d3d12_command_allocator_free_resources(struct d3d12_command_allocator *allocator)
+static void d3d12_command_allocator_free_resources(struct d3d12_command_allocator *allocator,
+ bool keep_reusable_resources)
{
struct d3d12_device *device = allocator->device;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
- unsigned int i;
+ unsigned int i, j;
allocator->vk_descriptor_pool = VK_NULL_HANDLE;
+ if (keep_reusable_resources)
+ {
+ if (vkd3d_array_reserve((void **)&allocator->free_descriptor_pools,
+ &allocator->free_descriptor_pools_size,
+ allocator->free_descriptor_pool_count + allocator->descriptor_pool_count,
+ sizeof(*allocator->free_descriptor_pools)))
+ {
+ for (i = 0, j = allocator->free_descriptor_pool_count; i < allocator->descriptor_pool_count; ++i, ++j)
+ {
+ VK_CALL(vkResetDescriptorPool(device->vk_device, allocator->descriptor_pools[i], 0));
+ allocator->free_descriptor_pools[j] = allocator->descriptor_pools[i];
+ }
+ allocator->free_descriptor_pool_count += allocator->descriptor_pool_count;
+ allocator->descriptor_pool_count = 0;
+ }
+ }
+ else
+ {
+ for (i = 0; i < allocator->free_descriptor_pool_count; ++i)
+ {
+ VK_CALL(vkDestroyDescriptorPool(device->vk_device, allocator->free_descriptor_pools[i], NULL));
+ }
+ allocator->free_descriptor_pool_count = 0;
+ }
+
for (i = 0; i < allocator->transfer_buffer_count; ++i)
{
vkd3d_buffer_destroy(&allocator->transfer_buffers[i], device);
@@ -990,11 +1025,12 @@ static ULONG STDMETHODCALLTYPE d3d12_command_allocator_Release(ID3D12CommandAllo
if (allocator->current_command_list)
d3d12_command_list_allocator_destroyed(allocator->current_command_list);
- d3d12_command_allocator_free_resources(allocator);
+ d3d12_command_allocator_free_resources(allocator, false);
vkd3d_free(allocator->transfer_buffers);
vkd3d_free(allocator->buffer_views);
vkd3d_free(allocator->views);
vkd3d_free(allocator->descriptor_pools);
+ vkd3d_free(allocator->free_descriptor_pools);
vkd3d_free(allocator->pipelines);
vkd3d_free(allocator->framebuffers);
vkd3d_free(allocator->passes);
@@ -1078,7 +1114,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_allocator_Reset(ID3D12CommandAllo
device = allocator->device;
vk_procs = &device->vk_procs;
- d3d12_command_allocator_free_resources(allocator);
+ d3d12_command_allocator_free_resources(allocator, true);
if (allocator->command_buffer_count)
{
VK_CALL(vkFreeCommandBuffers(device->vk_device, allocator->vk_command_pool,
@@ -1168,6 +1204,10 @@ static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allo
allocator->vk_descriptor_pool = VK_NULL_HANDLE;
+ allocator->free_descriptor_pools = NULL;
+ allocator->free_descriptor_pools_size = 0;
+ allocator->free_descriptor_pool_count = 0;
+
allocator->passes = NULL;
allocator->passes_size = 0;
allocator->pass_count = 0;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 286186b..cb11866 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -550,6 +550,10 @@ struct d3d12_command_allocator
VkDescriptorPool vk_descriptor_pool;
+ VkDescriptorPool *free_descriptor_pools;
+ size_t free_descriptor_pools_size;
+ size_t free_descriptor_pool_count;
+
VkRenderPass *passes;
size_t passes_size;
size_t pass_count;
More information about the wine-cvs
mailing list