summaryrefslogtreecommitdiff
path: root/gst-libs/gst/vulkan/gstvkdescriptorcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst/vulkan/gstvkdescriptorcache.c')
-rw-r--r--gst-libs/gst/vulkan/gstvkdescriptorcache.c141
1 files changed, 67 insertions, 74 deletions
diff --git a/gst-libs/gst/vulkan/gstvkdescriptorcache.c b/gst-libs/gst/vulkan/gstvkdescriptorcache.c
index a2dff8a5b..c90156f4e 100644
--- a/gst-libs/gst/vulkan/gstvkdescriptorcache.c
+++ b/gst-libs/gst/vulkan/gstvkdescriptorcache.c
@@ -23,7 +23,6 @@
#endif
#include "gstvkdescriptorcache.h"
-#include "gstvkdescriptorcache-private.h"
/**
* SECTION:vkdescriptorcache
@@ -41,42 +40,14 @@ struct _GstVulkanDescriptorCachePrivate
{
guint n_layouts;
GstVulkanHandle **layouts;
-
- GQueue *available;
- gsize outstanding;
};
#define parent_class gst_vulkan_descriptor_cache_parent_class
G_DEFINE_TYPE_WITH_CODE (GstVulkanDescriptorCache, gst_vulkan_descriptor_cache,
- GST_TYPE_OBJECT, G_ADD_PRIVATE (GstVulkanDescriptorCache);
+ GST_TYPE_VULKAN_HANDLE_POOL, G_ADD_PRIVATE (GstVulkanDescriptorCache);
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT,
"vulkancommandcache", 0, "Vulkan Command Cache"));
-static void gst_vulkan_descriptor_cache_finalize (GObject * object);
-
-static void
-gst_vulkan_descriptor_cache_init (GstVulkanDescriptorCache * cache)
-{
- GstVulkanDescriptorCachePrivate *priv = GET_PRIV (cache);
-
- priv->available = g_queue_new ();
-}
-
-static void
-gst_vulkan_descriptor_cache_class_init (GstVulkanDescriptorCacheClass *
- device_class)
-{
- GObjectClass *gobject_class = (GObjectClass *) device_class;
-
- gobject_class->finalize = gst_vulkan_descriptor_cache_finalize;
-}
-
-static void
-do_free_set (GstVulkanHandle * handle)
-{
- gst_vulkan_handle_unref (handle);
-}
-
static void
gst_vulkan_descriptor_cache_finalize (GObject * object)
{
@@ -84,17 +55,10 @@ gst_vulkan_descriptor_cache_finalize (GObject * object)
GstVulkanDescriptorCachePrivate *priv = GET_PRIV (cache);
guint i;
- if (priv->outstanding > 0)
- g_critical
- ("Destroying a Vulkan descriptor cache that has outstanding descriptors!");
-
for (i = 0; i < priv->n_layouts; i++)
gst_vulkan_handle_unref (priv->layouts[i]);
g_free (priv->layouts);
- g_queue_free_full (priv->available, (GDestroyNotify) do_free_set);
- priv->available = NULL;
-
gst_clear_object (&cache->pool);
G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -114,6 +78,7 @@ GstVulkanDescriptorCache *
gst_vulkan_descriptor_cache_new (GstVulkanDescriptorPool * pool,
guint n_layouts, GstVulkanHandle ** layouts)
{
+ GstVulkanHandlePool *handle_pool;
GstVulkanDescriptorCache *ret;
GstVulkanDescriptorCachePrivate *priv;
guint i;
@@ -129,11 +94,61 @@ gst_vulkan_descriptor_cache_new (GstVulkanDescriptorPool * pool,
for (i = 0; i < n_layouts; i++)
priv->layouts[i] = gst_vulkan_handle_ref (layouts[i]);
+ handle_pool = GST_VULKAN_HANDLE_POOL (ret);
+ handle_pool->device = gst_object_ref (pool->device);
+
gst_object_ref_sink (ret);
return ret;
}
+static gpointer
+gst_vulkan_descriptor_cache_acquire_impl (GstVulkanHandlePool * pool,
+ GError ** error)
+{
+ GstVulkanDescriptorSet *set;
+
+ if ((set =
+ GST_VULKAN_HANDLE_POOL_CLASS (parent_class)->acquire (pool, error)))
+ set->cache = gst_object_ref (pool);
+
+ return set;
+}
+
+static gpointer
+gst_vulkan_descriptor_cache_alloc_impl (GstVulkanHandlePool * pool,
+ GError ** error)
+{
+ GstVulkanDescriptorCache *desc = GST_VULKAN_DESCRIPTOR_CACHE (pool);
+ GstVulkanDescriptorCachePrivate *priv = GET_PRIV (desc);
+
+ return gst_vulkan_descriptor_pool_create (desc->pool, priv->n_layouts,
+ priv->layouts, error);
+}
+
+static void
+gst_vulkan_descriptor_cache_release_impl (GstVulkanHandlePool * pool,
+ gpointer handle)
+{
+ GstVulkanDescriptorSet *set = handle;
+
+ GST_VULKAN_HANDLE_POOL_CLASS (parent_class)->release (pool, handle);
+
+ /* decrease the refcount that the set had to us */
+ gst_clear_object (&set->cache);
+}
+
+static void
+gst_vulkan_descriptor_cache_free_impl (GstVulkanHandlePool * pool,
+ gpointer handle)
+{
+ GstVulkanDescriptorSet *set = handle;
+
+ GST_VULKAN_HANDLE_POOL_CLASS (parent_class)->free (pool, handle);
+
+ gst_vulkan_descriptor_set_unref (set);
+}
+
/**
* gst_vulkan_descriptor_cache_acquire:
* @cache: a #GstVulkanDescriptorCache
@@ -147,47 +162,25 @@ GstVulkanDescriptorSet *
gst_vulkan_descriptor_cache_acquire (GstVulkanDescriptorCache * cache,
GError ** error)
{
- GstVulkanDescriptorSet *set = NULL;
- GstVulkanDescriptorCachePrivate *priv;
-
- g_return_val_if_fail (GST_IS_VULKAN_DESCRIPTOR_CACHE (cache), NULL);
-
- priv = GET_PRIV (cache);
-
- GST_OBJECT_LOCK (cache);
- set = g_queue_pop_head (priv->available);
- GST_OBJECT_UNLOCK (cache);
-
- if (!set)
- set = gst_vulkan_descriptor_pool_create (cache->pool, priv->n_layouts,
- priv->layouts, error);
- if (!set)
- return NULL;
-
- GST_OBJECT_LOCK (cache);
- priv->outstanding++;
- GST_OBJECT_UNLOCK (cache);
-
- set->cache = gst_object_ref (cache);
- return set;
+ return gst_vulkan_handle_pool_acquire (GST_VULKAN_HANDLE_POOL_CAST (cache),
+ error);
}
-void
-gst_vulkan_descriptor_cache_release_set (GstVulkanDescriptorCache * cache,
- GstVulkanDescriptorSet * set)
+static void
+gst_vulkan_descriptor_cache_init (GstVulkanDescriptorCache * cache)
{
- GstVulkanDescriptorCachePrivate *priv;
-
- g_return_if_fail (GST_IS_VULKAN_DESCRIPTOR_CACHE (cache));
- g_return_if_fail (set != NULL);
+}
- priv = GET_PRIV (cache);
+static void
+gst_vulkan_descriptor_cache_class_init (GstVulkanDescriptorCacheClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstVulkanHandlePoolClass *handle_class = (GstVulkanHandlePoolClass *) klass;
- GST_OBJECT_LOCK (cache);
- g_queue_push_tail (priv->available, set);
- priv->outstanding--;
- GST_OBJECT_UNLOCK (cache);
+ gobject_class->finalize = gst_vulkan_descriptor_cache_finalize;
- /* decrease the refcount that the set had to us */
- gst_clear_object (&set->cache);
+ handle_class->acquire = gst_vulkan_descriptor_cache_acquire_impl;
+ handle_class->alloc = gst_vulkan_descriptor_cache_alloc_impl;
+ handle_class->release = gst_vulkan_descriptor_cache_release_impl;
+ handle_class->free = gst_vulkan_descriptor_cache_free_impl;
}