[PATCH vkd3d 03/11] vkd3d: Use bigger descriptor pools.

Józef Kucia joseph.kucia at gmail.com
Wed Sep 12 08:19:54 CDT 2018


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 libs/vkd3d/command.c       | 150 ++++++++++++++++++++++++++++-----------------
 libs/vkd3d/vkd3d_private.h |   2 +
 2 files changed, 95 insertions(+), 57 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 16c61352ed76..609edea1c9fb 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -787,6 +787,89 @@ static bool d3d12_command_allocator_add_transfer_buffer(struct d3d12_command_all
     return true;
 }
 
+static VkDescriptorPool d3d12_command_allocator_allocate_descriptor_pool(
+        struct d3d12_command_allocator *allocator)
+{
+    static const VkDescriptorPoolSize pool_sizes[] =
+    {
+        {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1024},
+        {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1024},
+        {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1024},
+        {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1024},
+        {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1024},
+        {VK_DESCRIPTOR_TYPE_SAMPLER, 1024},
+    };
+    struct d3d12_device *device = allocator->device;
+    const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
+    struct VkDescriptorPoolCreateInfo pool_desc;
+    VkDevice vk_device = device->vk_device;
+    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 (!(d3d12_command_allocator_add_descriptor_pool(allocator, vk_pool)))
+    {
+        ERR("Failed to add descriptor pool.\n");
+        VK_CALL(vkDestroyDescriptorPool(vk_device, vk_pool, NULL));
+        return VK_NULL_HANDLE;
+    }
+
+    return vk_pool;
+}
+
+static VkDescriptorSet d3d12_command_allocator_allocate_descriptor_set(
+        struct d3d12_command_allocator *allocator, VkDescriptorSetLayout vk_set_layout)
+{
+    struct d3d12_device *device = allocator->device;
+    const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
+    struct VkDescriptorSetAllocateInfo set_desc;
+    VkDevice vk_device = device->vk_device;
+    VkDescriptorSet vk_descriptor_set;
+    VkResult vr;
+
+    if (!allocator->vk_descriptor_pool)
+        allocator->vk_descriptor_pool = d3d12_command_allocator_allocate_descriptor_pool(allocator);
+    if (!allocator->vk_descriptor_pool)
+        return VK_NULL_HANDLE;
+
+    set_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+    set_desc.pNext = NULL;
+    set_desc.descriptorPool = allocator->vk_descriptor_pool;
+    set_desc.descriptorSetCount = 1;
+    set_desc.pSetLayouts = &vk_set_layout;
+    if ((vr = VK_CALL(vkAllocateDescriptorSets(vk_device, &set_desc, &vk_descriptor_set))) >= 0)
+        return vk_descriptor_set;
+
+    allocator->vk_descriptor_pool = VK_NULL_HANDLE;
+    if (vr == VK_ERROR_FRAGMENTED_POOL || vr == VK_ERROR_OUT_OF_POOL_MEMORY_KHR)
+        allocator->vk_descriptor_pool = d3d12_command_allocator_allocate_descriptor_pool(allocator);
+    if (!allocator->vk_descriptor_pool)
+    {
+        ERR("Failed to allocate descriptor set, vr %d.\n", vr);
+        return VK_NULL_HANDLE;
+    }
+
+    set_desc.descriptorPool = allocator->vk_descriptor_pool;
+    if ((vr = VK_CALL(vkAllocateDescriptorSets(vk_device, &set_desc, &vk_descriptor_set))) < 0)
+    {
+        FIXME("Failed to allocate descriptor set from a new pool, vr %d.\n", vr);
+        return VK_NULL_HANDLE;
+    }
+
+    return vk_descriptor_set;
+}
+
 static void d3d12_command_list_allocator_destroyed(struct d3d12_command_list *list)
 {
     TRACE("list %p.\n", list);
@@ -809,6 +892,8 @@ static void d3d12_command_allocator_free_resources(struct d3d12_command_allocato
     const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
     unsigned int i;
 
+    allocator->vk_descriptor_pool = VK_NULL_HANDLE;
+
     for (i = 0; i < allocator->transfer_buffer_count; ++i)
     {
         vkd3d_buffer_destroy(&allocator->transfer_buffers[i], device);
@@ -1081,6 +1166,8 @@ static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allo
         return hresult_from_vk_result(vr);
     }
 
+    allocator->vk_descriptor_pool = VK_NULL_HANDLE;
+
     allocator->passes = NULL;
     allocator->passes_size = 0;
     allocator->pass_count = 0;
@@ -1834,55 +1921,6 @@ static bool d3d12_command_list_update_current_pipeline(struct d3d12_command_list
     return true;
 }
 
-static VkDescriptorSet d3d12_command_list_allocate_descriptor_set(struct d3d12_command_list *list,
-        const VkDescriptorPoolSize *pool_sizes, unsigned int pool_size_count,
-        VkDescriptorSetLayout vk_set_layout)
-{
-    const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
-    VkDevice vk_device = list->device->vk_device;
-    struct VkDescriptorSetAllocateInfo set_desc;
-    struct VkDescriptorPoolCreateInfo pool_desc;
-    VkDescriptorSet vk_descriptor_set;
-    VkDescriptorPool vk_pool;
-    VkResult vr;
-
-    if (!pool_size_count)
-        return VK_NULL_HANDLE;
-
-    pool_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
-    pool_desc.pNext = NULL;
-    pool_desc.flags = 0;
-    pool_desc.maxSets = 1;
-    pool_desc.poolSizeCount = pool_size_count;
-    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;
-    }
-
-    set_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
-    set_desc.pNext = NULL;
-    set_desc.descriptorPool = vk_pool;
-    set_desc.descriptorSetCount = 1;
-    set_desc.pSetLayouts = &vk_set_layout;
-    if ((vr = VK_CALL(vkAllocateDescriptorSets(vk_device, &set_desc, &vk_descriptor_set))) < 0)
-    {
-        ERR("Failed to allocate descriptor set, vr %d.\n", vr);
-        VK_CALL(vkDestroyDescriptorPool(vk_device, vk_pool, NULL));
-        return VK_NULL_HANDLE;
-    }
-
-    if (!(d3d12_command_allocator_add_descriptor_pool(list->allocator, vk_pool)))
-    {
-        ERR("Failed to add descriptor pool.\n");
-        VK_CALL(vkDestroyDescriptorPool(vk_device, vk_pool, NULL));
-        return VK_NULL_HANDLE;
-    }
-
-    return vk_descriptor_set;
-}
-
 static void d3d12_command_list_copy_descriptors(struct d3d12_command_list *list,
         const struct vkd3d_pipeline_bindings *bindings, VkDescriptorSet src_set)
 {
@@ -2010,8 +2048,8 @@ static void d3d12_command_list_prepare_descriptors(struct d3d12_command_list *li
      *   by an update command, or freed) between when the command is recorded
      *   and when the command completes executing on the queue."
      */
-    bindings->descriptor_set = d3d12_command_list_allocate_descriptor_set(list,
-            root_signature->pool_sizes, root_signature->pool_size_count, root_signature->vk_set_layout);
+    bindings->descriptor_set = d3d12_command_allocator_allocate_descriptor_set(list->allocator,
+            root_signature->vk_set_layout);
     bindings->in_use = false;
 
     if (previous_descriptor_set)
@@ -2175,7 +2213,6 @@ static void d3d12_command_list_update_uav_counter_descriptors(struct d3d12_comma
     VkDevice vk_device = list->device->vk_device;
     VkWriteDescriptorSet *vk_descriptor_writes;
     VkDescriptorSet vk_descriptor_set;
-    VkDescriptorPoolSize pool_size;
     unsigned int uav_counter_count;
     unsigned int i;
 
@@ -2184,10 +2221,9 @@ static void d3d12_command_list_update_uav_counter_descriptors(struct d3d12_comma
 
     uav_counter_count = vkd3d_popcount(state->uav_counter_mask);
 
-    pool_size.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
-    pool_size.descriptorCount = uav_counter_count;
-    vk_descriptor_set = d3d12_command_list_allocate_descriptor_set(list,
-            &pool_size, 1, state->vk_set_layout);
+    vk_descriptor_set = d3d12_command_allocator_allocate_descriptor_set(list->allocator, state->vk_set_layout);
+    if (!vk_descriptor_set)
+        return;
 
     if (!(vk_descriptor_writes = vkd3d_calloc(uav_counter_count, sizeof(*vk_descriptor_writes))))
         return;
@@ -2205,7 +2241,7 @@ static void d3d12_command_list_update_uav_counter_descriptors(struct d3d12_comma
         vk_descriptor_writes[i].dstBinding = uav_counter->binding.binding;
         vk_descriptor_writes[i].dstArrayElement = 0;
         vk_descriptor_writes[i].descriptorCount = 1;
-        vk_descriptor_writes[i].descriptorType = pool_size.type;
+        vk_descriptor_writes[i].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
         vk_descriptor_writes[i].pImageInfo = NULL;
         vk_descriptor_writes[i].pBufferInfo = NULL;
         vk_descriptor_writes[i].pTexelBufferView = &vk_uav_counter_views[uav_counter->register_index];
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index df444471cf5b..286186b46757 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -548,6 +548,8 @@ struct d3d12_command_allocator
 
     VkCommandPool vk_command_pool;
 
+    VkDescriptorPool vk_descriptor_pool;
+
     VkRenderPass *passes;
     size_t passes_size;
     size_t pass_count;
-- 
2.16.4




More information about the wine-devel mailing list