[gtk+/wip/gbsneto/vulkan-wayland: 4/4] vulkanrender: Don't grow descriptor pool exponentially



commit 44870b14e1e6ae014905b82e8e414a4431c668f5
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Tue Jan 3 21:16:50 2017 -0200

    vulkanrender: Don't grow descriptor pool exponentially

 gsk/gskvulkanrender.c |   44 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 35 insertions(+), 9 deletions(-)
---
diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c
index 35e2dce..d4687b2 100644
--- a/gsk/gskvulkanrender.c
+++ b/gsk/gskvulkanrender.c
@@ -363,6 +363,21 @@ gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
   return GPOINTER_TO_SIZE (id_plus_one) - 1;
 }
 
+static VkResult
+create_descriptor_set (GskVulkanRender       *self,
+                       guint                  needed_sets,
+                       VkDescriptorSetLayout *layouts)
+{
+  return GSK_VK_CHECK (vkAllocateDescriptorSets, gdk_vulkan_context_get_device (self->vulkan),
+                                                 &(VkDescriptorSetAllocateInfo) {
+                                                    .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
+                                                    .descriptorPool = self->descriptor_pool,
+                                                    .descriptorSetCount = needed_sets,
+                                                    .pSetLayouts = layouts
+                                                 },
+                                                 self->descriptor_sets);
+}
+
 static void
 gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self,
                                            VkSampler        sampler)
@@ -392,7 +407,7 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self,
           vkDestroyDescriptorPool (device,
                                    self->descriptor_pool,
                                    NULL);
-          self->descriptor_pool_maxsets += added_sets;
+          self->descriptor_pool_maxsets = added_sets;
           GSK_VK_CHECK (vkCreateDescriptorPool, device,
                                                 &(VkDescriptorPoolCreateInfo) {
                                                     .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
@@ -423,14 +438,25 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self,
         {
           layouts[i] = gsk_vulkan_pipeline_layout_get_descriptor_set_layout (self->layout);
         }
-      GSK_VK_CHECK (vkAllocateDescriptorSets, device,
-                                              &(VkDescriptorSetAllocateInfo) {
-                                                  .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
-                                                  .descriptorPool = self->descriptor_pool,
-                                                  .descriptorSetCount = needed_sets,
-                                                  .pSetLayouts = layouts
-                                              },
-                                              self->descriptor_sets);
+
+      /*
+       * Per https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkAllocateDescriptorSets.html
+       * the memory allocation can fail here.
+       */
+      switch (create_descriptor_set (self, needed_sets, layouts))
+        {
+        case VK_ERROR_OUT_OF_HOST_MEMORY:
+          GSK_NOTE (VULKAN, g_print ("Host memory error\n"));
+          break;
+
+        case VK_ERROR_OUT_OF_DEVICE_MEMORY:
+          GSK_NOTE (VULKAN, g_print ("Device memory error\n"));
+          break;
+
+        default:
+          GSK_NOTE (VULKAN, g_print ("Fragmented pool error\n"));
+          break;
+        }
     }
 
   g_hash_table_iter_init (&iter, self->descriptor_set_indexes);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]