diff options
author | Matthew Waters <matthew@centricular.com> | 2019-07-04 14:03:51 +1000 |
---|---|---|
committer | Matthew Waters <matthew@centricular.com> | 2019-07-04 14:18:15 +1000 |
commit | b5256d94fccc574b31243572001783c65547ca26 (patch) | |
tree | 1cd2679986eb33fd3240f6db4d373c3dea65a3e5 /ext/vulkan | |
parent | cef839533e9a39c35f6b3c31d6397c3de761c790 (diff) | |
download | gstreamer-plugins-bad-b5256d94fccc574b31243572001783c65547ca26.tar.gz |
vulkan: move trash list to library
Diffstat (limited to 'ext/vulkan')
-rw-r--r-- | ext/vulkan/meson.build | 1 | ||||
-rw-r--r-- | ext/vulkan/vkcolorconvert.c | 19 | ||||
-rw-r--r-- | ext/vulkan/vkdownload.c | 11 | ||||
-rw-r--r-- | ext/vulkan/vkfullscreenrender.c | 22 | ||||
-rw-r--r-- | ext/vulkan/vkfullscreenrender.h | 2 | ||||
-rw-r--r-- | ext/vulkan/vkimageidentity.c | 12 | ||||
-rw-r--r-- | ext/vulkan/vkswapper.c | 15 | ||||
-rw-r--r-- | ext/vulkan/vktrash.c | 260 | ||||
-rw-r--r-- | ext/vulkan/vktrash.h | 81 | ||||
-rw-r--r-- | ext/vulkan/vkupload.c | 17 |
10 files changed, 51 insertions, 389 deletions
diff --git a/ext/vulkan/meson.build b/ext/vulkan/meson.build index a9b8542ca..25b16699b 100644 --- a/ext/vulkan/meson.build +++ b/ext/vulkan/meson.build @@ -17,7 +17,6 @@ vulkan_sources = [ 'vksink.c', 'vkshader.c', 'vkswapper.c', - 'vktrash.c', 'vkupload.c', ] diff --git a/ext/vulkan/vkcolorconvert.c b/ext/vulkan/vkcolorconvert.c index bceaca3eb..f617ee15e 100644 --- a/ext/vulkan/vkcolorconvert.c +++ b/ext/vulkan/vkcolorconvert.c @@ -32,7 +32,6 @@ #include <string.h> #include "vkcolorconvert.h" -#include "vktrash.h" #include "vkshader.h" #include "shaders/identity.vert.h" #include "shaders/swizzle.frag.h" @@ -1532,13 +1531,13 @@ gst_vulkan_color_convert_set_caps (GstBaseTransform * bt, GstCaps * in_caps, if (render->last_fence) { if (conv->descriptor_pool) - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_descriptor_pool (gst_vulkan_fence_ref (render->last_fence), conv->descriptor_pool)); conv->descriptor_set = NULL; conv->descriptor_pool = NULL; if (conv->uniform) - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_mini_object_unref (gst_vulkan_fence_ref (render->last_fence), (GstMiniObject *) conv->uniform)); conv->uniform = NULL; @@ -1579,18 +1578,18 @@ gst_vulkan_color_convert_stop (GstBaseTransform * bt) if (render->device) { if (render->last_fence) { if (conv->descriptor_pool) - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_descriptor_pool (gst_vulkan_fence_ref (render->last_fence), conv->descriptor_pool)); conv->descriptor_set = NULL; conv->descriptor_pool = NULL; if (conv->sampler) - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_sampler (gst_vulkan_fence_ref (render->last_fence), conv->sampler)); conv->sampler = NULL; if (conv->uniform) - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_mini_object_unref (gst_vulkan_fence_ref (render->last_fence), (GstMiniObject *) conv->uniform)); conv->uniform = NULL; @@ -1907,8 +1906,7 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, out_img_mems[i]->barrier.image_layout, 1, &blit, VK_FILTER_LINEAR); /* XXX: try to reuse this image later */ - render->trash_list = - g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_mini_object_unref (gst_vulkan_fence_ref (fence), (GstMiniObject *) render_img_mems[i])); } @@ -1918,11 +1916,10 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, if (gst_vulkan_error_to_g_error (err, &error, "vkEndCommandBuffer") < 0) goto error; - render->trash_list = - g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_framebuffer (gst_vulkan_fence_ref (fence), framebuffer)); - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_command_buffer (gst_vulkan_fence_ref (fence), conv->cmd_pool, cmd)); diff --git a/ext/vulkan/vkdownload.c b/ext/vulkan/vkdownload.c index d07101e54..4ca0aebed 100644 --- a/ext/vulkan/vkdownload.c +++ b/ext/vulkan/vkdownload.c @@ -32,7 +32,6 @@ #include <string.h> #include "vkdownload.h" -#include "vktrash.h" GST_DEBUG_CATEGORY (gst_debug_vulkan_download); #define GST_CAT_DEFAULT gst_debug_vulkan_download @@ -86,7 +85,7 @@ struct ImageToRawDownload gboolean pool_active; GstVulkanCommandPool *cmd_pool; - GList *trash_list; + GstVulkanTrashList *trash_list; }; static gpointer @@ -95,6 +94,7 @@ _image_to_raw_new_impl (GstVulkanDownload * download) struct ImageToRawDownload *raw = g_new0 (struct ImageToRawDownload, 1); raw->download = download; + raw->trash_list = gst_vulkan_trash_fence_list_new (); return raw; } @@ -315,7 +315,7 @@ _image_to_raw_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) if (gst_vulkan_error_to_g_error (err, &error, "vkQueueSubmit") < 0) goto error; - raw->trash_list = g_list_prepend (raw->trash_list, + gst_vulkan_trash_list_add (raw->trash_list, gst_vulkan_trash_new_free_command_buffer (fence, raw->cmd_pool, cmd)); } @@ -323,7 +323,7 @@ _image_to_raw_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) * Need to have the buffer gst_memory_map() wait for this fence before * allowing access */ gst_vulkan_trash_list_wait (raw->trash_list, -1); - raw->trash_list = NULL; + gst_vulkan_trash_list_gc (raw->trash_list); ret = GST_FLOW_OK; @@ -361,6 +361,9 @@ _image_to_raw_free (gpointer impl) raw->cmd_pool = NULL; } + gst_object_unref (raw->trash_list); + raw->trash_list = NULL; + g_free (impl); } diff --git a/ext/vulkan/vkfullscreenrender.c b/ext/vulkan/vkfullscreenrender.c index 9880685b3..26cb56baa 100644 --- a/ext/vulkan/vkfullscreenrender.c +++ b/ext/vulkan/vkfullscreenrender.c @@ -32,7 +32,6 @@ #include <string.h> #include "vkimageidentity.h" -#include "vktrash.h" #include "vkshader.h" GST_DEBUG_CATEGORY (gst_debug_vulkan_full_screen_render); @@ -564,25 +563,25 @@ gst_vulkan_full_screen_render_set_caps (GstBaseTransform * bt, if (render->last_fence) { if (render->descriptor_set_layout) { - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_descriptor_set_layout (gst_vulkan_fence_ref (render->last_fence), render->descriptor_set_layout)); render->descriptor_set_layout = NULL; } if (render->pipeline_layout) { - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_pipeline_layout (gst_vulkan_fence_ref (render->last_fence), render->pipeline_layout)); render->pipeline_layout = NULL; } if (render->render_pass) { - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_render_pass (gst_vulkan_fence_ref (render->last_fence), render->render_pass)); render->render_pass = NULL; } if (render->graphics_pipeline) { - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_pipeline (gst_vulkan_fence_ref (render->last_fence), render->graphics_pipeline)); render->graphics_pipeline = NULL; @@ -757,6 +756,8 @@ gst_vulkan_full_screen_render_start (GstBaseTransform * bt) if (!_create_vertex_buffers (render)) return FALSE; + render->trash_list = gst_vulkan_trash_fence_list_new (); + return TRUE; } @@ -767,19 +768,19 @@ gst_vulkan_full_screen_render_stop (GstBaseTransform * bt) if (render->device) { if (render->last_fence) { - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_pipeline (gst_vulkan_fence_ref (render->last_fence), render->graphics_pipeline)); render->graphics_pipeline = NULL; - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_pipeline_layout (gst_vulkan_fence_ref (render->last_fence), render->pipeline_layout)); render->pipeline_layout = NULL; - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_render_pass (gst_vulkan_fence_ref (render->last_fence), render->render_pass)); render->render_pass = NULL; - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_descriptor_set_layout (gst_vulkan_fence_ref (render->last_fence), render->descriptor_set_layout)); render->descriptor_set_layout = NULL; @@ -806,6 +807,7 @@ gst_vulkan_full_screen_render_stop (GstBaseTransform * bt) if (!gst_vulkan_trash_list_wait (render->trash_list, -1)) GST_WARNING_OBJECT (render, "Failed to wait for all resources to be freed"); + gst_object_unref (render->trash_list); render->trash_list = NULL; if (render->vertices) @@ -914,7 +916,7 @@ gst_vulkan_full_screen_render_submit (GstVulkanFullScreenRender * render, if (gst_vulkan_error_to_g_error (err, &error, "vkQueueSubmit") < 0) goto error; - render->trash_list = gst_vulkan_trash_list_gc (render->trash_list); + gst_vulkan_trash_list_gc (render->trash_list); gst_vulkan_fence_unref (fence); diff --git a/ext/vulkan/vkfullscreenrender.h b/ext/vulkan/vkfullscreenrender.h index 2d90fefab..9a61491e0 100644 --- a/ext/vulkan/vkfullscreenrender.h +++ b/ext/vulkan/vkfullscreenrender.h @@ -71,7 +71,7 @@ struct _GstVulkanFullScreenRender GstMemory *vertices; GstMemory *indices; - GList *trash_list; + GstVulkanTrashList *trash_list; GstVulkanFence *last_fence; }; diff --git a/ext/vulkan/vkimageidentity.c b/ext/vulkan/vkimageidentity.c index 2d666ba3d..4bc49b765 100644 --- a/ext/vulkan/vkimageidentity.c +++ b/ext/vulkan/vkimageidentity.c @@ -32,7 +32,6 @@ #include <string.h> #include "vkimageidentity.h" -#include "vktrash.h" #include "vkshader.h" #include "shaders/identity.vert.h" #include "shaders/identity.frag.h" @@ -355,7 +354,7 @@ gst_vulkan_image_identity_set_caps (GstBaseTransform * bt, GstCaps * in_caps, return FALSE; if (render->last_fence) { - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_descriptor_pool (gst_vulkan_fence_ref (render->last_fence), vk_identity->descriptor_pool)); vk_identity->descriptor_set = NULL; @@ -438,12 +437,12 @@ gst_vulkan_image_identity_stop (GstBaseTransform * bt) if (render->device) { if (render->last_fence) { - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_descriptor_pool (gst_vulkan_fence_ref (render->last_fence), vk_identity->descriptor_pool)); vk_identity->descriptor_set = NULL; vk_identity->descriptor_pool = NULL; - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_sampler (gst_vulkan_fence_ref (render->last_fence), vk_identity->sampler)); vk_identity->sampler = NULL; @@ -658,11 +657,10 @@ gst_vulkan_image_identity_transform (GstBaseTransform * bt, GstBuffer * inbuf, if (gst_vulkan_error_to_g_error (err, &error, "vkEndCommandBuffer") < 0) goto error; - render->trash_list = - g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_framebuffer (gst_vulkan_fence_ref (fence), framebuffer)); - render->trash_list = g_list_prepend (render->trash_list, + gst_vulkan_trash_list_add (render->trash_list, gst_vulkan_trash_new_free_command_buffer (gst_vulkan_fence_ref (fence), vk_identity->cmd_pool, cmd)); diff --git a/ext/vulkan/vkswapper.c b/ext/vulkan/vkswapper.c index cf12d4043..684b583fb 100644 --- a/ext/vulkan/vkswapper.c +++ b/ext/vulkan/vkswapper.c @@ -25,7 +25,6 @@ #include <string.h> #include "vkswapper.h" -#include "vktrash.h" #define GST_CAT_DEFAULT gst_vulkan_swapper_debug GST_DEBUG_CATEGORY (GST_CAT_DEFAULT); @@ -38,7 +37,7 @@ struct _GstVulkanSwapperPrivate { GMutex render_lock; - GList *trash_list; + GstVulkanTrashList *trash_list; /* source sizes accounting for all aspect ratios */ guint dar_width; @@ -435,6 +434,7 @@ gst_vulkan_swapper_finalize (GObject * object) if (!gst_vulkan_trash_list_wait (swapper->priv->trash_list, -1)) GST_WARNING_OBJECT (swapper, "Failed to wait for all fences to complete " "before shutting down"); + gst_object_unref (swapper->priv->trash_list); swapper->priv->trash_list = NULL; if (swapper->swap_chain_images) { @@ -497,6 +497,8 @@ gst_vulkan_swapper_init (GstVulkanSwapper * swapper) swapper->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO; swapper->par_n = DEFAULT_PIXEL_ASPECT_RATIO_N; swapper->par_d = DEFAULT_PIXEL_ASPECT_RATIO_D; + + swapper->priv->trash_list = gst_vulkan_trash_fence_list_new (); } static void @@ -1064,8 +1066,7 @@ _render_buffer_unlocked (GstVulkanSwapper * swapper, guint32 swap_idx; VkResult err, present_err = VK_SUCCESS; - swapper->priv->trash_list = - gst_vulkan_trash_list_gc (swapper->priv->trash_list); + gst_vulkan_trash_list_gc (swapper->priv->trash_list); if (!buffer) { g_set_error (error, GST_VULKAN_ERROR, @@ -1147,10 +1148,10 @@ reacquire: if (gst_vulkan_error_to_g_error (err, error, "vkQueueSubmit") < 0) goto error; - swapper->priv->trash_list = g_list_prepend (swapper->priv->trash_list, + gst_vulkan_trash_list_add (swapper->priv->trash_list, gst_vulkan_trash_new_free_command_buffer (gst_vulkan_fence_ref (fence), swapper->cmd_pool, cmd)); - swapper->priv->trash_list = g_list_prepend (swapper->priv->trash_list, + gst_vulkan_trash_list_add (swapper->priv->trash_list, gst_vulkan_trash_new_free_semaphore (fence, acquire_semaphore)); cmd = VK_NULL_HANDLE; @@ -1204,7 +1205,7 @@ reacquire: if (gst_vulkan_error_to_g_error (err, error, "vkQueueSubmit") < 0) goto error; - swapper->priv->trash_list = g_list_prepend (swapper->priv->trash_list, + gst_vulkan_trash_list_add (swapper->priv->trash_list, gst_vulkan_trash_new_free_semaphore (fence, present_semaphore)); fence = NULL; } diff --git a/ext/vulkan/vktrash.c b/ext/vulkan/vktrash.c deleted file mode 100644 index 854d61b44..000000000 --- a/ext/vulkan/vktrash.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2016 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "vktrash.h" - -GST_DEBUG_CATEGORY (gst_debug_vulkan_trash); -#define GST_CAT_DEFAULT gst_debug_vulkan_trash - -static void -_init_debug (void) -{ - static volatile gsize init; - - if (g_once_init_enter (&init)) { - GST_DEBUG_CATEGORY_INIT (gst_debug_vulkan_trash, - "vulkantrash", 0, "Vulkan Trash"); - g_once_init_leave (&init, 1); - } -} - -void -gst_vulkan_trash_free (GstVulkanTrash * trash) -{ - if (!trash) - return; - - GST_TRACE ("Freeing trash object %p with fence %" GST_PTR_FORMAT, trash, - trash->fence); - - gst_vulkan_fence_unref (trash->fence); - - g_free (trash); -} - -GstVulkanTrash * -gst_vulkan_trash_new (GstVulkanFence * fence, GstVulkanTrashNotify notify, - gpointer user_data) -{ - GstVulkanTrash *ret = NULL; - - g_return_val_if_fail (fence != NULL, NULL); - g_return_val_if_fail (GST_IS_VULKAN_DEVICE (fence->device), NULL); - g_return_val_if_fail (notify != NULL, NULL); - - _init_debug (); - - ret = g_new0 (GstVulkanTrash, 1); - GST_TRACE ("Creating new trash object %p with fence %" GST_PTR_FORMAT - " on device %" GST_PTR_FORMAT, ret, fence, fence->device); - ret->fence = fence; - ret->notify = notify; - ret->user_data = user_data; - - return ret; -} - -GList * -gst_vulkan_trash_list_gc (GList * trash_list) -{ - GList *l = trash_list; - - while (l) { - GstVulkanTrash *trash = l->data; - - if (gst_vulkan_fence_is_signaled (trash->fence)) { - GList *next = g_list_next (l); - GST_TRACE ("fence %" GST_PTR_FORMAT " has been signalled, notifying", - trash->fence); - trash->notify (trash->fence->device, trash->user_data); - gst_vulkan_trash_free (trash); - trash_list = g_list_delete_link (trash_list, l); - l = next; - } else { - l = g_list_next (l); - } - } - - return trash_list; -} - -gboolean -gst_vulkan_trash_list_wait (GList * trash_list, guint64 timeout) -{ - VkResult err = VK_SUCCESS; - guint i, n; - - /* remove all the previously signaled fences */ - trash_list = gst_vulkan_trash_list_gc (trash_list); - - n = g_list_length (trash_list); - if (n > 0) { - VkFence *fences; - GstVulkanDevice *device = NULL; - GList *l = NULL; - - fences = g_new0 (VkFence, n); - for (i = 0, l = trash_list; i < n; i++, l = g_list_next (l)) { - GstVulkanTrash *trash = l->data; - - if (device == NULL) - device = trash->fence->device; - - fences[i] = trash->fence->fence; - - /* only support waiting on fences from the same device */ - g_assert (device == trash->fence->device); - } - - GST_TRACE ("Waiting on %d fences with timeout %" GST_TIME_FORMAT, n, - GST_TIME_ARGS (timeout)); - err = vkWaitForFences (device->device, n, fences, TRUE, timeout); - g_free (fences); - - trash_list = gst_vulkan_trash_list_gc (trash_list); - } - - return err == VK_SUCCESS; -} - -#define FREE_DESTROY_FUNC(func, type, type_name) \ -static void \ -G_PASTE(_free_,type_name) (GstVulkanDevice * device, type resource) \ -{ \ - GST_TRACE_OBJECT (device, "Freeing vulkan " G_STRINGIFY (type) " %p", resource); \ - func (device->device, resource, NULL); \ -} \ -GstVulkanTrash * \ -G_PASTE(gst_vulkan_trash_new_free_,type_name) (GstVulkanFence * fence, \ - type type_name) \ -{ \ - GstVulkanTrash *trash; \ - g_return_val_if_fail (type_name != NULL, NULL); \ - trash = gst_vulkan_trash_new (fence, \ - (GstVulkanTrashNotify) G_PASTE(_free_,type_name), type_name); \ - return trash; \ -} - -FREE_DESTROY_FUNC (vkDestroyDescriptorPool, VkDescriptorPool, descriptor_pool); -FREE_DESTROY_FUNC (vkDestroyDescriptorSetLayout, VkDescriptorSetLayout, - descriptor_set_layout); -FREE_DESTROY_FUNC (vkDestroyFramebuffer, VkFramebuffer, framebuffer); -FREE_DESTROY_FUNC (vkDestroyPipeline, VkPipeline, pipeline); -FREE_DESTROY_FUNC (vkDestroyPipelineLayout, VkPipelineLayout, pipeline_layout); -FREE_DESTROY_FUNC (vkDestroyRenderPass, VkRenderPass, render_pass); -FREE_DESTROY_FUNC (vkDestroySemaphore, VkSemaphore, semaphore) - FREE_DESTROY_FUNC (vkDestroySampler, VkSampler, sampler); -#define FREE_WITH_GST_PARENT(func, type, type_name, parent_type, parent_resource) \ -struct G_PASTE(free_parent_info_,type_name) \ -{ \ - parent_type parent; \ - type resource; \ -}; \ -static void \ -G_PASTE(_free_,type_name) (GstVulkanDevice * device, struct G_PASTE(free_parent_info_,type_name) *info) \ -{ \ - GST_TRACE_OBJECT (device, "Freeing vulkan " G_STRINGIFY (type) " %p", info->resource); \ - func (device->device, info->parent parent_resource, 1, &info->resource); \ - gst_object_unref (info->parent); \ - g_free (info); \ -} \ -GstVulkanTrash * \ -G_PASTE(gst_vulkan_trash_new_free_,type_name) (GstVulkanFence * fence, \ - parent_type parent, type type_name) \ -{ \ - struct G_PASTE(free_parent_info_,type_name) *info; \ - GstVulkanTrash *trash; \ - g_return_val_if_fail (type_name != NULL, NULL); \ - info = g_new0 (struct G_PASTE(free_parent_info_,type_name), 1); \ - info->parent = gst_object_ref (parent); \ - info->resource = (gpointer) type_name; \ - trash = gst_vulkan_trash_new (fence, \ - (GstVulkanTrashNotify) G_PASTE(_free_,type_name), info); \ - return trash; \ -} -FREE_WITH_GST_PARENT (vkFreeCommandBuffers, VkCommandBuffer, command_buffer, - GstVulkanCommandPool *,->pool); -#define FREE_WITH_VK_PARENT(func, type, type_name, parent_type) \ -struct G_PASTE(free_parent_info_,type_name) \ -{ \ - parent_type parent; \ - type resource; \ -}; \ -static void \ -G_PASTE(_free_,type_name) (GstVulkanDevice * device, struct G_PASTE(free_parent_info_,type_name) *info) \ -{ \ - GST_TRACE_OBJECT (device, "Freeing vulkan " G_STRINGIFY (type) " %p", info->resource); \ - func (device->device, info->parent, 1, &info->resource); \ - g_free (info); \ -} \ -GstVulkanTrash * \ -G_PASTE(gst_vulkan_trash_new_free_,type_name) (GstVulkanFence * fence, \ - parent_type parent, type type_name) \ -{ \ - struct G_PASTE(free_parent_info_,type_name) *info; \ - GstVulkanTrash *trash; \ - g_return_val_if_fail (type_name != NULL, NULL); \ - info = g_new0 (struct G_PASTE(free_parent_info_,type_name), 1); \ - /* FIXME: keep parent alive ? */\ - info->parent = parent; \ - info->resource = (gpointer) type_name; \ - trash = gst_vulkan_trash_new (fence, \ - (GstVulkanTrashNotify) G_PASTE(_free_,type_name), info); \ - return trash; \ -} -FREE_WITH_VK_PARENT (vkFreeDescriptorSets, VkDescriptorSet, descriptor_set, - VkDescriptorPool); - - static void - _trash_object_unref (GstVulkanDevice * device, GstObject * object) -{ - gst_object_unref (object); -} - -GstVulkanTrash * -gst_vulkan_trash_new_object_unref (GstVulkanFence * fence, GstObject * object) -{ - GstVulkanTrash *trash; - g_return_val_if_fail (GST_IS_OBJECT (object), NULL); - trash = gst_vulkan_trash_new (fence, - (GstVulkanTrashNotify) _trash_object_unref, object); - return trash; -} - -static void -_trash_mini_object_unref (GstVulkanDevice * device, GstMiniObject * object) -{ - gst_mini_object_unref (object); -} - -GstVulkanTrash * -gst_vulkan_trash_new_mini_object_unref (GstVulkanFence * fence, - GstMiniObject * object) -{ - GstVulkanTrash *trash; - g_return_val_if_fail (object != NULL, NULL); - trash = gst_vulkan_trash_new (fence, - (GstVulkanTrashNotify) _trash_mini_object_unref, object); - return trash; -} diff --git a/ext/vulkan/vktrash.h b/ext/vulkan/vktrash.h deleted file mode 100644 index cd84b371e..000000000 --- a/ext/vulkan/vktrash.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2016 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_VULKAN_TRASH_H__ -#define __GST_VULKAN_TRASH_H__ - -#include <gst/vulkan/vulkan.h> - -G_BEGIN_DECLS - -typedef void (*GstVulkanTrashNotify) (GstVulkanDevice * device, gpointer user_data); - -typedef struct _GstVulkanTrash GstVulkanTrash; - -struct _GstVulkanTrash -{ - GstVulkanFence *fence; - - GstVulkanTrashNotify notify; - gpointer user_data; -}; - -GstVulkanTrash * gst_vulkan_trash_new (GstVulkanFence * fence, - GstVulkanTrashNotify notify, - gpointer user_data); - -GstVulkanTrash * gst_vulkan_trash_new_free_descriptor_pool (GstVulkanFence * fence, - VkDescriptorPool descriptor_pool); -GstVulkanTrash * gst_vulkan_trash_new_free_descriptor_set_layout (GstVulkanFence * fence, - VkDescriptorSetLayout descriptor_set_layout); -GstVulkanTrash * gst_vulkan_trash_new_free_framebuffer (GstVulkanFence * fence, - VkFramebuffer framebuffer); -GstVulkanTrash * gst_vulkan_trash_new_free_pipeline (GstVulkanFence * fence, - VkPipeline pipeline); -GstVulkanTrash * gst_vulkan_trash_new_free_pipeline_layout (GstVulkanFence * fence, - VkPipelineLayout pipeline_layout); -GstVulkanTrash * gst_vulkan_trash_new_free_render_pass (GstVulkanFence * fence, - VkRenderPass render_pass); -GstVulkanTrash * gst_vulkan_trash_new_free_sampler (GstVulkanFence * fence, - VkSampler sampler); -GstVulkanTrash * gst_vulkan_trash_new_free_semaphore (GstVulkanFence * fence, - VkSemaphore semaphore); - -GstVulkanTrash * gst_vulkan_trash_new_free_command_buffer (GstVulkanFence * fence, - GstVulkanCommandPool * parent, - VkCommandBuffer command_buffer); -GstVulkanTrash * gst_vulkan_trash_new_free_descriptor_set (GstVulkanFence * fence, - VkDescriptorPool parent, - VkDescriptorSet descriptor_set); - -GstVulkanTrash * gst_vulkan_trash_new_object_unref (GstVulkanFence * fence, - GstObject * object); -GstVulkanTrash * gst_vulkan_trash_new_mini_object_unref (GstVulkanFence * fence, - GstMiniObject * object); - -void gst_vulkan_trash_free (GstVulkanTrash * trash); - -GList * gst_vulkan_trash_list_gc (GList * trash_list); -gboolean gst_vulkan_trash_list_wait (GList * trash_list, - guint64 timeout); - -G_END_DECLS - -#endif /* __GST_VULKAN_TRASH_H__ */ diff --git a/ext/vulkan/vkupload.c b/ext/vulkan/vkupload.c index b75aadfab..af1996072 100644 --- a/ext/vulkan/vkupload.c +++ b/ext/vulkan/vkupload.c @@ -32,7 +32,6 @@ #include <string.h> #include "vkupload.h" -#include "vktrash.h" GST_DEBUG_CATEGORY (gst_debug_vulkan_upload); #define GST_CAT_DEFAULT gst_debug_vulkan_upload @@ -379,7 +378,7 @@ struct BufferToImageUpload gboolean pool_active; GstVulkanCommandPool *cmd_pool; - GList *trash_list; + GstVulkanTrashList *trash_list; }; static gpointer @@ -388,6 +387,7 @@ _buffer_to_image_new_impl (GstVulkanUpload * upload) struct BufferToImageUpload *raw = g_new0 (struct BufferToImageUpload, 1); raw->upload = upload; + raw->trash_list = gst_vulkan_trash_fence_list_new (); return raw; } @@ -608,11 +608,11 @@ _buffer_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) if (gst_vulkan_error_to_g_error (err, &error, "vkQueueSubmit") < 0) goto error; - raw->trash_list = g_list_prepend (raw->trash_list, + gst_vulkan_trash_list_add (raw->trash_list, gst_vulkan_trash_new_free_command_buffer (fence, raw->cmd_pool, cmd)); } - raw->trash_list = gst_vulkan_trash_list_gc (raw->trash_list); + gst_vulkan_trash_list_gc (raw->trash_list); ret = GST_FLOW_OK; @@ -651,6 +651,7 @@ _buffer_to_image_free (gpointer impl) if (!gst_vulkan_trash_list_wait (raw->trash_list, -1)) GST_WARNING_OBJECT (raw->upload, "Failed to wait for all fences to complete " "before shutting down"); + gst_object_unref (raw->trash_list); raw->trash_list = NULL; g_free (impl); @@ -687,7 +688,7 @@ struct RawToImageUpload gboolean in_pool_active; GstVulkanCommandPool *cmd_pool; - GList *trash_list; + GstVulkanTrashList *trash_list; }; static gpointer @@ -696,6 +697,7 @@ _raw_to_image_new_impl (GstVulkanUpload * upload) struct RawToImageUpload *raw = g_new0 (struct RawToImageUpload, 1); raw->upload = upload; + raw->trash_list = gst_vulkan_trash_fence_list_new (); return raw; } @@ -982,11 +984,11 @@ _raw_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) if (gst_vulkan_error_to_g_error (err, &error, "vkQueueSubmit") < 0) goto error; - raw->trash_list = g_list_prepend (raw->trash_list, + gst_vulkan_trash_list_add (raw->trash_list, gst_vulkan_trash_new_free_command_buffer (fence, raw->cmd_pool, cmd)); } - raw->trash_list = gst_vulkan_trash_list_gc (raw->trash_list); + gst_vulkan_trash_list_gc (raw->trash_list); ret = GST_FLOW_OK; @@ -1037,6 +1039,7 @@ _raw_to_image_free (gpointer impl) if (!gst_vulkan_trash_list_wait (raw->trash_list, -1)) GST_WARNING_OBJECT (raw->upload, "Failed to wait for all fences to complete " "before shutting down"); + gst_object_unref (raw->trash_list); raw->trash_list = NULL; g_free (impl); |