diff options
author | Benjamin Otte <otte@redhat.com> | 2018-02-17 07:14:04 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2018-02-17 08:04:43 +0100 |
commit | 710c39027b22e116c451e44e2d29cef1ac20233f (patch) | |
tree | dbeb1e8cbd42e53e833828d8aa353aba0e98e12e | |
parent | 95ddb5756266b4aaf17c540851ab5ac4f67a5ad2 (diff) | |
download | gtk+-710c39027b22e116c451e44e2d29cef1ac20233f.tar.gz |
vulkan: Keep track of command buffers
Fixes a rather large memleak.
-rw-r--r-- | gsk/vulkan/gskvulkancommandpool.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/gsk/vulkan/gskvulkancommandpool.c b/gsk/vulkan/gskvulkancommandpool.c index bcba6a9fc1..03d4bdc6ed 100644 --- a/gsk/vulkan/gskvulkancommandpool.c +++ b/gsk/vulkan/gskvulkancommandpool.c @@ -8,6 +8,7 @@ struct _GskVulkanCommandPool GdkVulkanContext *vulkan; VkCommandPool vk_command_pool; + GPtrArray *buffers; }; GskVulkanCommandPool * @@ -28,12 +29,28 @@ gsk_vulkan_command_pool_new (GdkVulkanContext *context) NULL, &self->vk_command_pool); + self->buffers = g_ptr_array_new (); + return self; } +static void +gsk_vulkan_command_pool_free_buffers (GskVulkanCommandPool *self) +{ + vkFreeCommandBuffers (gdk_vulkan_context_get_device (self->vulkan), + self->vk_command_pool, + self->buffers->len, + (VkCommandBuffer *) self->buffers->pdata); + + g_ptr_array_set_size (self->buffers, 0); +} + void gsk_vulkan_command_pool_free (GskVulkanCommandPool *self) { + gsk_vulkan_command_pool_free_buffers (self); + g_ptr_array_unref (self->buffers); + vkDestroyCommandPool (gdk_vulkan_context_get_device (self->vulkan), self->vk_command_pool, NULL); @@ -44,6 +61,8 @@ gsk_vulkan_command_pool_free (GskVulkanCommandPool *self) void gsk_vulkan_command_pool_reset (GskVulkanCommandPool *self) { + gsk_vulkan_command_pool_free_buffers (self); + GSK_VK_CHECK (vkResetCommandPool, gdk_vulkan_context_get_device (self->vulkan), self->vk_command_pool, 0); @@ -62,6 +81,7 @@ gsk_vulkan_command_pool_get_buffer (GskVulkanCommandPool *self) .commandBufferCount = 1, }, &command_buffer); + g_ptr_array_add (self->buffers, command_buffer); GSK_VK_CHECK (vkBeginCommandBuffer, command_buffer, &(VkCommandBufferBeginInfo) { |