2 * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
24 #include "gstcudaloader.h"
27 GST_DEBUG_CATEGORY_EXTERN (gst_nvcodec_debug);
28 #define GST_CAT_DEFAULT gst_nvcodec_debug
31 #define CUDA_LIBNAME "libcuda.so.1"
33 #define CUDA_LIBNAME "nvcuda.dll"
36 #define LOAD_SYMBOL(name,func) G_STMT_START { \
37 if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->func)) { \
38 GST_ERROR ("Failed to load '%s' from %s, %s", G_STRINGIFY (name), filename, g_module_error()); \
43 typedef struct _GstNvCodecCudaVTable
47 CUresult (CUDAAPI * CuInit) (unsigned int Flags);
48 CUresult (CUDAAPI * CuGetErrorName) (CUresult error, const char **pStr);
49 CUresult (CUDAAPI * CuGetErrorString) (CUresult error, const char **pStr);
51 CUresult (CUDAAPI * CuCtxCreate) (CUcontext * pctx, unsigned int flags,
53 CUresult (CUDAAPI * CuCtxDestroy) (CUcontext ctx);
54 CUresult (CUDAAPI * CuCtxPopCurrent) (CUcontext * pctx);
55 CUresult (CUDAAPI * CuCtxPushCurrent) (CUcontext ctx);
57 CUresult (CUDAAPI * CuGraphicsMapResources) (unsigned int count,
58 CUgraphicsResource * resources, CUstream hStream);
59 CUresult (CUDAAPI * CuGraphicsUnmapResources) (unsigned int count,
60 CUgraphicsResource * resources, CUstream hStream);
61 CUresult (CUDAAPI * CuGraphicsSubResourceGetMappedArray) (CUarray * pArray,
62 CUgraphicsResource resource, unsigned int arrayIndex,
63 unsigned int mipLevel);
64 CUresult (CUDAAPI * CuGraphicsResourceGetMappedPointer) (CUdeviceptr *
65 pDevPtr, size_t * pSize, CUgraphicsResource resource);
67 CuGraphicsUnregisterResource) (CUgraphicsResource resource);
69 CUresult (CUDAAPI * CuMemAlloc) (CUdeviceptr * dptr, unsigned int bytesize);
70 CUresult (CUDAAPI * CuMemAllocPitch) (CUdeviceptr * dptr, size_t * pPitch,
71 size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes);
72 CUresult (CUDAAPI * CuMemcpy2D) (const CUDA_MEMCPY2D * pCopy);
73 CUresult (CUDAAPI * CuMemcpy2DAsync) (const CUDA_MEMCPY2D * pCopy,
75 CUresult (CUDAAPI * CuMemFree) (CUdeviceptr dptr);
76 CUresult (CUDAAPI * CuStreamCreate) (CUstream * phStream,
78 CUresult (CUDAAPI * CuStreamDestroy) (CUstream hStream);
79 CUresult (CUDAAPI * CuStreamSynchronize) (CUstream hStream);
81 CUresult (CUDAAPI * CuDeviceGet) (CUdevice * device, int ordinal);
82 CUresult (CUDAAPI * CuDeviceGetCount) (int *count);
83 CUresult (CUDAAPI * CuDeviceGetName) (char *name, int len, CUdevice dev);
84 CUresult (CUDAAPI * CuDeviceGetAttribute) (int *pi,
85 CUdevice_attribute attrib, CUdevice dev);
87 CUresult (CUDAAPI * CuGraphicsGLRegisterImage) (CUgraphicsResource *
88 pCudaResource, unsigned int image, unsigned int target,
90 CUresult (CUDAAPI * CuGraphicsGLRegisterBuffer) (CUgraphicsResource *
91 pCudaResource, unsigned int buffer, unsigned int Flags);
93 CuGraphicsResourceSetMapFlags) (CUgraphicsResource resource,
95 } GstNvCodecCudaVTable;
97 static GstNvCodecCudaVTable gst_cuda_vtable = { 0, };
100 gst_cuda_load_library (void)
103 const gchar *filename = CUDA_LIBNAME;
104 GstNvCodecCudaVTable *vtable;
106 if (gst_cuda_vtable.loaded)
109 module = g_module_open (filename, G_MODULE_BIND_LAZY);
110 if (module == NULL) {
111 GST_WARNING ("Could not open library %s, %s", filename, g_module_error ());
115 vtable = &gst_cuda_vtable;
118 LOAD_SYMBOL (cuInit, CuInit);
119 LOAD_SYMBOL (cuGetErrorName, CuGetErrorName);
120 LOAD_SYMBOL (cuGetErrorString, CuGetErrorString);
121 LOAD_SYMBOL (cuCtxCreate, CuCtxCreate);
122 LOAD_SYMBOL (cuCtxDestroy, CuCtxDestroy);
123 LOAD_SYMBOL (cuCtxPopCurrent, CuCtxPopCurrent);
124 LOAD_SYMBOL (cuCtxPushCurrent, CuCtxPushCurrent);
126 LOAD_SYMBOL (cuGraphicsMapResources, CuGraphicsMapResources);
127 LOAD_SYMBOL (cuGraphicsUnmapResources, CuGraphicsUnmapResources);
128 LOAD_SYMBOL (cuGraphicsSubResourceGetMappedArray,
129 CuGraphicsSubResourceGetMappedArray);
130 LOAD_SYMBOL (cuGraphicsResourceGetMappedPointer,
131 CuGraphicsResourceGetMappedPointer);
132 LOAD_SYMBOL (cuGraphicsUnregisterResource, CuGraphicsUnregisterResource);
134 LOAD_SYMBOL (cuMemAlloc, CuMemAlloc);
135 LOAD_SYMBOL (cuMemAllocPitch, CuMemAllocPitch);
136 LOAD_SYMBOL (cuMemcpy2D, CuMemcpy2D);
137 LOAD_SYMBOL (cuMemcpy2DAsync, CuMemcpy2DAsync);
138 LOAD_SYMBOL (cuMemFree, CuMemFree);
140 LOAD_SYMBOL (cuStreamCreate, CuStreamCreate);
141 LOAD_SYMBOL (cuStreamDestroy, CuStreamDestroy);
142 LOAD_SYMBOL (cuStreamSynchronize, CuStreamSynchronize);
144 LOAD_SYMBOL (cuDeviceGet, CuDeviceGet);
145 LOAD_SYMBOL (cuDeviceGetCount, CuDeviceGetCount);
146 LOAD_SYMBOL (cuDeviceGetName, CuDeviceGetName);
147 LOAD_SYMBOL (cuDeviceGetAttribute, CuDeviceGetAttribute);
150 LOAD_SYMBOL (cuGraphicsGLRegisterImage, CuGraphicsGLRegisterImage);
151 LOAD_SYMBOL (cuGraphicsGLRegisterBuffer, CuGraphicsGLRegisterBuffer);
152 LOAD_SYMBOL (cuGraphicsResourceSetMapFlags, CuGraphicsResourceSetMapFlags);
154 vtable->loaded = TRUE;
159 g_module_close (module);
165 CuInit (unsigned int Flags)
167 g_assert (gst_cuda_vtable.CuInit != NULL);
169 return gst_cuda_vtable.CuInit (Flags);
173 CuGetErrorName (CUresult error, const char **pStr)
175 g_assert (gst_cuda_vtable.CuGetErrorName != NULL);
177 return gst_cuda_vtable.CuGetErrorName (error, pStr);
181 CuGetErrorString (CUresult error, const char **pStr)
183 g_assert (gst_cuda_vtable.CuGetErrorString != NULL);
185 return gst_cuda_vtable.CuGetErrorString (error, pStr);
189 CuCtxCreate (CUcontext * pctx, unsigned int flags, CUdevice dev)
191 g_assert (gst_cuda_vtable.CuCtxCreate != NULL);
193 return gst_cuda_vtable.CuCtxCreate (pctx, flags, dev);
197 CuCtxDestroy (CUcontext ctx)
199 g_assert (gst_cuda_vtable.CuCtxDestroy != NULL);
201 return gst_cuda_vtable.CuCtxDestroy (ctx);
205 CuCtxPopCurrent (CUcontext * pctx)
207 g_assert (gst_cuda_vtable.CuCtxPopCurrent != NULL);
209 return gst_cuda_vtable.CuCtxPopCurrent (pctx);
213 CuCtxPushCurrent (CUcontext ctx)
215 g_assert (gst_cuda_vtable.CuCtxPushCurrent != NULL);
217 return gst_cuda_vtable.CuCtxPushCurrent (ctx);
221 CuGraphicsMapResources (unsigned int count, CUgraphicsResource * resources,
224 g_assert (gst_cuda_vtable.CuGraphicsMapResources != NULL);
226 return gst_cuda_vtable.CuGraphicsMapResources (count, resources, hStream);
230 CuGraphicsUnmapResources (unsigned int count, CUgraphicsResource * resources,
233 g_assert (gst_cuda_vtable.CuGraphicsUnmapResources != NULL);
235 return gst_cuda_vtable.CuGraphicsUnmapResources (count, resources, hStream);
239 CuGraphicsSubResourceGetMappedArray (CUarray * pArray,
240 CUgraphicsResource resource, unsigned int arrayIndex, unsigned int mipLevel)
242 g_assert (gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray != NULL);
244 return gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray (pArray, resource,
245 arrayIndex, mipLevel);
249 CuGraphicsResourceGetMappedPointer (CUdeviceptr * pDevPtr, size_t * pSize,
250 CUgraphicsResource resource)
252 g_assert (gst_cuda_vtable.CuGraphicsResourceGetMappedPointer != NULL);
254 return gst_cuda_vtable.CuGraphicsResourceGetMappedPointer (pDevPtr, pSize,
259 CuGraphicsUnregisterResource (CUgraphicsResource resource)
261 g_assert (gst_cuda_vtable.CuGraphicsUnregisterResource != NULL);
263 return gst_cuda_vtable.CuGraphicsUnregisterResource (resource);
267 CuMemAlloc (CUdeviceptr * dptr, unsigned int bytesize)
269 g_assert (gst_cuda_vtable.CuMemAlloc != NULL);
271 return gst_cuda_vtable.CuMemAlloc (dptr, bytesize);
275 CuMemAllocPitch (CUdeviceptr * dptr, size_t * pPitch, size_t WidthInBytes,
276 size_t Height, unsigned int ElementSizeBytes)
278 g_assert (gst_cuda_vtable.CuMemAllocPitch != NULL);
280 return gst_cuda_vtable.CuMemAllocPitch (dptr, pPitch, WidthInBytes, Height,
285 CuMemcpy2D (const CUDA_MEMCPY2D * pCopy)
287 g_assert (gst_cuda_vtable.CuMemcpy2D != NULL);
289 return gst_cuda_vtable.CuMemcpy2D (pCopy);
293 CuMemcpy2DAsync (const CUDA_MEMCPY2D * pCopy, CUstream hStream)
295 g_assert (gst_cuda_vtable.CuMemcpy2DAsync != NULL);
297 return gst_cuda_vtable.CuMemcpy2DAsync (pCopy, hStream);
301 CuMemFree (CUdeviceptr dptr)
303 g_assert (gst_cuda_vtable.CuMemFree != NULL);
305 return gst_cuda_vtable.CuMemFree (dptr);
309 CuStreamCreate (CUstream * phStream, unsigned int Flags)
311 g_assert (gst_cuda_vtable.CuStreamCreate != NULL);
313 return gst_cuda_vtable.CuStreamCreate (phStream, Flags);
317 CuStreamDestroy (CUstream hStream)
319 g_assert (gst_cuda_vtable.CuStreamDestroy != NULL);
321 return gst_cuda_vtable.CuStreamDestroy (hStream);
325 CuStreamSynchronize (CUstream hStream)
327 g_assert (gst_cuda_vtable.CuStreamSynchronize != NULL);
329 return gst_cuda_vtable.CuStreamSynchronize (hStream);
333 CuDeviceGet (CUdevice * device, int ordinal)
335 g_assert (gst_cuda_vtable.CuDeviceGet != NULL);
337 return gst_cuda_vtable.CuDeviceGet (device, ordinal);
341 CuDeviceGetCount (int *count)
343 g_assert (gst_cuda_vtable.CuDeviceGetCount != NULL);
345 return gst_cuda_vtable.CuDeviceGetCount (count);
349 CuDeviceGetName (char *name, int len, CUdevice dev)
351 g_assert (gst_cuda_vtable.CuDeviceGetName != NULL);
353 return gst_cuda_vtable.CuDeviceGetName (name, len, dev);
357 CuDeviceGetAttribute (int *pi, CUdevice_attribute attrib, CUdevice dev)
359 g_assert (gst_cuda_vtable.CuDeviceGetAttribute != NULL);
361 return gst_cuda_vtable.CuDeviceGetAttribute (pi, attrib, dev);
366 CuGraphicsGLRegisterImage (CUgraphicsResource * pCudaResource,
367 unsigned int image, unsigned int target, unsigned int Flags)
369 g_assert (gst_cuda_vtable.CuGraphicsGLRegisterImage != NULL);
371 return gst_cuda_vtable.CuGraphicsGLRegisterImage (pCudaResource, image,
376 CuGraphicsGLRegisterBuffer (CUgraphicsResource * pCudaResource,
377 unsigned int buffer, unsigned int Flags)
379 g_assert (gst_cuda_vtable.CuGraphicsGLRegisterBuffer != NULL);
381 return gst_cuda_vtable.CuGraphicsGLRegisterBuffer (pCudaResource, buffer,
386 CuGraphicsResourceSetMapFlags (CUgraphicsResource resource, unsigned int flags)
388 g_assert (gst_cuda_vtable.CuGraphicsResourceSetMapFlags != NULL);
390 return gst_cuda_vtable.CuGraphicsResourceSetMapFlags (resource, flags);