mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 04:05:34 +00:00
cudabufferpool: Add support for virtual memory
Configure malloc or mmap allocator depending on config option Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4510>
This commit is contained in:
parent
547b13c68f
commit
7b1e4d6051
2 changed files with 113 additions and 5 deletions
|
@ -24,6 +24,7 @@
|
||||||
#include "gstcudabufferpool.h"
|
#include "gstcudabufferpool.h"
|
||||||
#include "gstcudacontext.h"
|
#include "gstcudacontext.h"
|
||||||
#include "gstcudamemory.h"
|
#include "gstcudamemory.h"
|
||||||
|
#include "gstcuda-private.h"
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (gst_cuda_buffer_pool_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_cuda_buffer_pool_debug);
|
||||||
#define GST_CAT_DEFAULT gst_cuda_buffer_pool_debug
|
#define GST_CAT_DEFAULT gst_cuda_buffer_pool_debug
|
||||||
|
@ -33,6 +34,8 @@ struct _GstCudaBufferPoolPrivate
|
||||||
GstVideoInfo info;
|
GstVideoInfo info;
|
||||||
GstCudaStream *stream;
|
GstCudaStream *stream;
|
||||||
GstCudaPoolAllocator *alloc;
|
GstCudaPoolAllocator *alloc;
|
||||||
|
GstCudaMemoryAllocMethod alloc_method;
|
||||||
|
CUmemAllocationProp prop;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define gst_cuda_buffer_pool_parent_class parent_class
|
#define gst_cuda_buffer_pool_parent_class parent_class
|
||||||
|
@ -48,6 +51,41 @@ gst_cuda_buffer_pool_get_options (GstBufferPool * pool)
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_cuda_buffer_pool_update_alloc_prop (GstCudaBufferPool * self)
|
||||||
|
{
|
||||||
|
GstCudaBufferPoolPrivate *priv = self->priv;
|
||||||
|
gboolean virtual_mem_supported;
|
||||||
|
gboolean os_handle_supported;
|
||||||
|
guint device;
|
||||||
|
|
||||||
|
g_object_get (self->context, "cuda-device-id", &device,
|
||||||
|
"virtual-memory", &virtual_mem_supported,
|
||||||
|
"os-handle", &os_handle_supported, nullptr);
|
||||||
|
|
||||||
|
if (!virtual_mem_supported) {
|
||||||
|
GST_DEBUG_OBJECT (self, "Virtual memory management is not supported");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!os_handle_supported) {
|
||||||
|
GST_DEBUG_OBJECT (self, "OS handle is not supported");;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
|
||||||
|
priv->prop.location.type = CU_MEM_LOCATION_TYPE_DEVICE;
|
||||||
|
priv->prop.location.id = (int) device;
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
priv->prop.requestedHandleTypes = CU_MEM_HANDLE_TYPE_WIN32;
|
||||||
|
priv->prop.win32HandleMetaData = gst_cuda_get_win32_handle_metadata ();
|
||||||
|
#else
|
||||||
|
priv->prop.requestedHandleTypes = CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_cuda_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
gst_cuda_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
||||||
{
|
{
|
||||||
|
@ -56,7 +94,7 @@ gst_cuda_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
||||||
GstCaps *caps = nullptr;
|
GstCaps *caps = nullptr;
|
||||||
guint size, min_buffers, max_buffers;
|
guint size, min_buffers, max_buffers;
|
||||||
GstVideoInfo info;
|
GstVideoInfo info;
|
||||||
GstMemory *mem;
|
GstMemory *mem = nullptr;
|
||||||
GstCudaMemory *cmem;
|
GstCudaMemory *cmem;
|
||||||
|
|
||||||
if (!gst_buffer_pool_config_get_params (config, &caps, &size, &min_buffers,
|
if (!gst_buffer_pool_config_get_params (config, &caps, &size, &min_buffers,
|
||||||
|
@ -77,19 +115,40 @@ gst_cuda_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
||||||
|
|
||||||
if (priv->alloc) {
|
if (priv->alloc) {
|
||||||
gst_cuda_allocator_set_active (GST_CUDA_ALLOCATOR (priv->alloc), FALSE);
|
gst_cuda_allocator_set_active (GST_CUDA_ALLOCATOR (priv->alloc), FALSE);
|
||||||
gst_object_unref (priv->alloc);
|
gst_clear_object (&priv->alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_clear_cuda_stream (&priv->stream);
|
gst_clear_cuda_stream (&priv->stream);
|
||||||
priv->stream = gst_buffer_pool_config_get_cuda_stream (config);
|
priv->stream = gst_buffer_pool_config_get_cuda_stream (config);
|
||||||
priv->alloc = gst_cuda_pool_allocator_new (self->context, priv->stream,
|
priv->alloc_method = gst_buffer_pool_config_get_cuda_alloc_method (config);
|
||||||
&info);
|
if (priv->alloc_method == GST_CUDA_MEMORY_ALLOC_UNKNOWN)
|
||||||
|
priv->alloc_method = GST_CUDA_MEMORY_ALLOC_MALLOC;
|
||||||
|
|
||||||
|
if (priv->alloc_method == GST_CUDA_MEMORY_ALLOC_MMAP) {
|
||||||
|
if (!gst_cuda_buffer_pool_update_alloc_prop (self)) {
|
||||||
|
GST_ERROR_OBJECT (self, "Virtual memory management is not supported");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->alloc = gst_cuda_pool_allocator_new_for_virtual_memory (self->context,
|
||||||
|
priv->stream, &info, &priv->prop, CU_MEM_ALLOC_GRANULARITY_MINIMUM);
|
||||||
|
} else {
|
||||||
|
priv->alloc = gst_cuda_pool_allocator_new (self->context, priv->stream,
|
||||||
|
&info);
|
||||||
|
}
|
||||||
|
|
||||||
if (!priv->alloc) {
|
if (!priv->alloc) {
|
||||||
GST_ERROR_OBJECT (self, "Couldn't create allocator");
|
GST_ERROR_OBJECT (self, "Couldn't create allocator");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
mem = gst_cuda_allocator_alloc (nullptr, self->context, nullptr, &info);
|
if (!gst_cuda_allocator_set_active (GST_CUDA_ALLOCATOR (priv->alloc), TRUE)) {
|
||||||
|
GST_ERROR_OBJECT (self, "Couldn't set active");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_cuda_pool_allocator_acquire_memory (priv->alloc, &mem);
|
||||||
|
gst_cuda_allocator_set_active (GST_CUDA_ALLOCATOR (priv->alloc), FALSE);
|
||||||
if (!mem) {
|
if (!mem) {
|
||||||
GST_WARNING_OBJECT (self, "Failed to allocate memory");
|
GST_WARNING_OBJECT (self, "Failed to allocate memory");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -187,6 +246,7 @@ gst_cuda_buffer_pool_new (GstCudaContext * context)
|
||||||
gst_object_ref_sink (self);
|
gst_object_ref_sink (self);
|
||||||
|
|
||||||
self->context = (GstCudaContext *) gst_object_ref (context);
|
self->context = (GstCudaContext *) gst_object_ref (context);
|
||||||
|
self->priv->alloc_method = GST_CUDA_MEMORY_ALLOC_MALLOC;
|
||||||
|
|
||||||
return GST_BUFFER_POOL_CAST (self);
|
return GST_BUFFER_POOL_CAST (self);
|
||||||
}
|
}
|
||||||
|
@ -233,6 +293,47 @@ gst_buffer_pool_config_set_cuda_stream (GstStructure * config,
|
||||||
"cuda-stream", GST_TYPE_CUDA_STREAM, stream, nullptr);
|
"cuda-stream", GST_TYPE_CUDA_STREAM, stream, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_buffer_pool_config_get_cuda_alloc_method:
|
||||||
|
* @config: a buffer pool config
|
||||||
|
*
|
||||||
|
* Gets configured allocation method
|
||||||
|
*
|
||||||
|
* Since: 1.24
|
||||||
|
*/
|
||||||
|
GstCudaMemoryAllocMethod
|
||||||
|
gst_buffer_pool_config_get_cuda_alloc_method (GstStructure * config)
|
||||||
|
{
|
||||||
|
GstCudaMemoryAllocMethod type;
|
||||||
|
|
||||||
|
g_return_val_if_fail (config, GST_CUDA_MEMORY_ALLOC_UNKNOWN);
|
||||||
|
|
||||||
|
if (gst_structure_get_enum (config, "cuda-alloc-method",
|
||||||
|
GST_TYPE_CUDA_MEMORY_ALLOC_METHOD, (gint *) & type)) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GST_CUDA_MEMORY_ALLOC_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_buffer_pool_config_set_cuda_alloc_method:
|
||||||
|
* @config: a buffer pool config
|
||||||
|
*
|
||||||
|
* Sets allocation method
|
||||||
|
*
|
||||||
|
* Since: 1.24
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_buffer_pool_config_set_cuda_alloc_method (GstStructure * config,
|
||||||
|
GstCudaMemoryAllocMethod method)
|
||||||
|
{
|
||||||
|
g_return_if_fail (config);
|
||||||
|
|
||||||
|
gst_structure_set (config, "cuda-alloc-method",
|
||||||
|
GST_TYPE_CUDA_MEMORY_ALLOC_METHOD, method, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_cuda_buffer_pool_dispose (GObject * object)
|
gst_cuda_buffer_pool_dispose (GObject * object)
|
||||||
{
|
{
|
||||||
|
|
|
@ -79,5 +79,12 @@ GST_CUDA_API
|
||||||
void gst_buffer_pool_config_set_cuda_stream (GstStructure * config,
|
void gst_buffer_pool_config_set_cuda_stream (GstStructure * config,
|
||||||
GstCudaStream * stream);
|
GstCudaStream * stream);
|
||||||
|
|
||||||
|
GST_CUDA_API
|
||||||
|
GstCudaMemoryAllocMethod gst_buffer_pool_config_get_cuda_alloc_method (GstStructure * config);
|
||||||
|
|
||||||
|
GST_CUDA_API
|
||||||
|
void gst_buffer_pool_config_set_cuda_alloc_method (GstStructure * config,
|
||||||
|
GstCudaMemoryAllocMethod method);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue