[gtk+/wip/gbsneto/vulkan-wayland: 4/4] vulkanrender: Don't grow descriptor pool exponentially
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/gbsneto/vulkan-wayland: 4/4] vulkanrender: Don't grow descriptor pool exponentially
- Date: Tue, 3 Jan 2017 23:18:58 +0000 (UTC)
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]