summaryrefslogtreecommitdiff
path: root/ext/vulkan
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2019-07-04 14:03:51 +1000
committerMatthew Waters <matthew@centricular.com>2019-07-04 14:18:15 +1000
commitb5256d94fccc574b31243572001783c65547ca26 (patch)
tree1cd2679986eb33fd3240f6db4d373c3dea65a3e5 /ext/vulkan
parentcef839533e9a39c35f6b3c31d6397c3de761c790 (diff)
downloadgstreamer-plugins-bad-b5256d94fccc574b31243572001783c65547ca26.tar.gz
vulkan: move trash list to library
Diffstat (limited to 'ext/vulkan')
-rw-r--r--ext/vulkan/meson.build1
-rw-r--r--ext/vulkan/vkcolorconvert.c19
-rw-r--r--ext/vulkan/vkdownload.c11
-rw-r--r--ext/vulkan/vkfullscreenrender.c22
-rw-r--r--ext/vulkan/vkfullscreenrender.h2
-rw-r--r--ext/vulkan/vkimageidentity.c12
-rw-r--r--ext/vulkan/vkswapper.c15
-rw-r--r--ext/vulkan/vktrash.c260
-rw-r--r--ext/vulkan/vktrash.h81
-rw-r--r--ext/vulkan/vkupload.c17
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);