1 /* GStreamer
2 * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com>
3 *
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.
8 *
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.
13 *
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.
18 */
19
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include "gstcudaloader.h"
25 #include <gmodule.h>
26
27 GST_DEBUG_CATEGORY_EXTERN (gst_nvcodec_debug);
28 #define GST_CAT_DEFAULT gst_nvcodec_debug
29
30 #ifndef G_OS_WIN32
31 #define CUDA_LIBNAME "libcuda.so.1"
32 #else
33 #define CUDA_LIBNAME "nvcuda.dll"
34 #endif
35
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()); \
39 goto error; \
40 } \
41 } G_STMT_END;
42
43 typedef struct _GstNvCodecCudaVTable
44 {
45 gboolean loaded;
46
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);
50
51 CUresult (CUDAAPI * CuCtxCreate) (CUcontext * pctx, unsigned int flags,
52 CUdevice dev);
53 CUresult (CUDAAPI * CuCtxDestroy) (CUcontext ctx);
54 CUresult (CUDAAPI * CuCtxPopCurrent) (CUcontext * pctx);
55 CUresult (CUDAAPI * CuCtxPushCurrent) (CUcontext ctx);
56
57 CUresult (CUDAAPI * CuCtxEnablePeerAccess) (CUcontext peerContext,
58 unsigned int Flags);
59 CUresult (CUDAAPI * CuCtxDisablePeerAccess) (CUcontext peerContext);
60 CUresult (CUDAAPI * CuGraphicsMapResources) (unsigned int count,
61 CUgraphicsResource * resources, CUstream hStream);
62 CUresult (CUDAAPI * CuGraphicsUnmapResources) (unsigned int count,
63 CUgraphicsResource * resources, CUstream hStream);
64 CUresult (CUDAAPI * CuGraphicsSubResourceGetMappedArray) (CUarray * pArray,
65 CUgraphicsResource resource, unsigned int arrayIndex,
66 unsigned int mipLevel);
67 CUresult (CUDAAPI * CuGraphicsResourceGetMappedPointer) (CUdeviceptr *
68 pDevPtr, size_t * pSize, CUgraphicsResource resource);
69 CUresult (CUDAAPI *
70 CuGraphicsUnregisterResource) (CUgraphicsResource resource);
71
72 CUresult (CUDAAPI * CuMemAlloc) (CUdeviceptr * dptr, unsigned int bytesize);
73 CUresult (CUDAAPI * CuMemAllocPitch) (CUdeviceptr * dptr, size_t * pPitch,
74 size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes);
75 CUresult (CUDAAPI * CuMemAllocHost) (void **pp, unsigned int bytesize);
76 CUresult (CUDAAPI * CuMemcpy2D) (const CUDA_MEMCPY2D * pCopy);
77 CUresult (CUDAAPI * CuMemcpy2DAsync) (const CUDA_MEMCPY2D * pCopy,
78 CUstream hStream);
79
80 CUresult (CUDAAPI * CuMemFree) (CUdeviceptr dptr);
81 CUresult (CUDAAPI * CuMemFreeHost) (void *p);
82
83 CUresult (CUDAAPI * CuStreamCreate) (CUstream * phStream,
84 unsigned int Flags);
85 CUresult (CUDAAPI * CuStreamDestroy) (CUstream hStream);
86 CUresult (CUDAAPI * CuStreamSynchronize) (CUstream hStream);
87
88 CUresult (CUDAAPI * CuDeviceGet) (CUdevice * device, int ordinal);
89 CUresult (CUDAAPI * CuDeviceGetCount) (int *count);
90 CUresult (CUDAAPI * CuDeviceGetName) (char *name, int len, CUdevice dev);
91 CUresult (CUDAAPI * CuDeviceGetAttribute) (int *pi,
92 CUdevice_attribute attrib, CUdevice dev);
93 CUresult (CUDAAPI * CuDeviceCanAccessPeer) (int *canAccessPeer,
94 CUdevice dev, CUdevice peerDev);
95 CUresult (CUDAAPI * CuDriverGetVersion) (int *driverVersion);
96
97 CUresult (CUDAAPI * CuModuleLoadData) (CUmodule * module,
98 const void *image);
99 CUresult (CUDAAPI * CuModuleUnload) (CUmodule module);
100 CUresult (CUDAAPI * CuModuleGetFunction) (CUfunction * hfunc,
101 CUmodule hmod, const char *name);
102 CUresult (CUDAAPI * CuTexObjectCreate) (CUtexObject * pTexObject,
103 const CUDA_RESOURCE_DESC * pResDesc, const CUDA_TEXTURE_DESC * pTexDesc,
104 const CUDA_RESOURCE_VIEW_DESC * pResViewDesc);
105 CUresult (CUDAAPI * CuTexObjectDestroy) (CUtexObject texObject);
106 CUresult (CUDAAPI * CuLaunchKernel) (CUfunction f, unsigned int gridDimX,
107 unsigned int gridDimY, unsigned int gridDimZ,
108 unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ,
109 unsigned int sharedMemBytes, CUstream hStream, void **kernelParams,
110 void **extra);
111
112 CUresult (CUDAAPI * CuGraphicsGLRegisterImage) (CUgraphicsResource *
113 pCudaResource, unsigned int image, unsigned int target,
114 unsigned int Flags);
115 CUresult (CUDAAPI * CuGraphicsGLRegisterBuffer) (CUgraphicsResource *
116 pCudaResource, unsigned int buffer, unsigned int Flags);
117 CUresult (CUDAAPI *
118 CuGraphicsResourceSetMapFlags) (CUgraphicsResource resource,
119 unsigned int flags);
120 CUresult (CUDAAPI * CuGLGetDevices) (unsigned int *pCudaDeviceCount,
121 CUdevice * pCudaDevices, unsigned int cudaDeviceCount,
122 CUGLDeviceList deviceList);
123 } GstNvCodecCudaVTable;
124
125 static GstNvCodecCudaVTable gst_cuda_vtable = { 0, };
126
127 gboolean
gst_cuda_load_library(void)128 gst_cuda_load_library (void)
129 {
130 GModule *module;
131 const gchar *filename = CUDA_LIBNAME;
132 GstNvCodecCudaVTable *vtable;
133
134 if (gst_cuda_vtable.loaded)
135 return TRUE;
136
137 module = g_module_open (filename, G_MODULE_BIND_LAZY);
138 if (module == NULL) {
139 GST_WARNING ("Could not open library %s, %s", filename, g_module_error ());
140 return FALSE;
141 }
142
143 vtable = &gst_cuda_vtable;
144
145 /* cuda.h */
146 LOAD_SYMBOL (cuInit, CuInit);
147 LOAD_SYMBOL (cuGetErrorName, CuGetErrorName);
148 LOAD_SYMBOL (cuGetErrorString, CuGetErrorString);
149 LOAD_SYMBOL (cuCtxCreate, CuCtxCreate);
150 LOAD_SYMBOL (cuCtxDestroy, CuCtxDestroy);
151 LOAD_SYMBOL (cuCtxPopCurrent, CuCtxPopCurrent);
152 LOAD_SYMBOL (cuCtxPushCurrent, CuCtxPushCurrent);
153 LOAD_SYMBOL (cuCtxEnablePeerAccess, CuCtxEnablePeerAccess);
154 LOAD_SYMBOL (cuCtxDisablePeerAccess, CuCtxDisablePeerAccess);
155
156 LOAD_SYMBOL (cuGraphicsMapResources, CuGraphicsMapResources);
157 LOAD_SYMBOL (cuGraphicsUnmapResources, CuGraphicsUnmapResources);
158 LOAD_SYMBOL (cuGraphicsSubResourceGetMappedArray,
159 CuGraphicsSubResourceGetMappedArray);
160 LOAD_SYMBOL (cuGraphicsResourceGetMappedPointer,
161 CuGraphicsResourceGetMappedPointer);
162 LOAD_SYMBOL (cuGraphicsUnregisterResource, CuGraphicsUnregisterResource);
163
164 LOAD_SYMBOL (cuMemAlloc, CuMemAlloc);
165 LOAD_SYMBOL (cuMemAllocPitch, CuMemAllocPitch);
166 LOAD_SYMBOL (cuMemAllocHost, CuMemAllocHost);
167 LOAD_SYMBOL (cuMemcpy2D, CuMemcpy2D);
168 LOAD_SYMBOL (cuMemcpy2DAsync, CuMemcpy2DAsync);
169
170 LOAD_SYMBOL (cuMemFree, CuMemFree);
171 LOAD_SYMBOL (cuMemFreeHost, CuMemFreeHost);
172
173 LOAD_SYMBOL (cuStreamCreate, CuStreamCreate);
174 LOAD_SYMBOL (cuStreamDestroy, CuStreamDestroy);
175 LOAD_SYMBOL (cuStreamSynchronize, CuStreamSynchronize);
176
177 LOAD_SYMBOL (cuDeviceGet, CuDeviceGet);
178 LOAD_SYMBOL (cuDeviceGetCount, CuDeviceGetCount);
179 LOAD_SYMBOL (cuDeviceGetName, CuDeviceGetName);
180 LOAD_SYMBOL (cuDeviceGetAttribute, CuDeviceGetAttribute);
181 LOAD_SYMBOL (cuDeviceCanAccessPeer, CuDeviceCanAccessPeer);
182
183 LOAD_SYMBOL (cuDriverGetVersion, CuDriverGetVersion);
184
185 LOAD_SYMBOL (cuModuleLoadData, CuModuleLoadData);
186 LOAD_SYMBOL (cuModuleUnload, CuModuleUnload);
187 LOAD_SYMBOL (cuModuleGetFunction, CuModuleGetFunction);
188 LOAD_SYMBOL (cuTexObjectCreate, CuTexObjectCreate);
189 LOAD_SYMBOL (cuTexObjectDestroy, CuTexObjectDestroy);
190 LOAD_SYMBOL (cuLaunchKernel, CuLaunchKernel);
191
192 /* cudaGL.h */
193 LOAD_SYMBOL (cuGraphicsGLRegisterImage, CuGraphicsGLRegisterImage);
194 LOAD_SYMBOL (cuGraphicsGLRegisterBuffer, CuGraphicsGLRegisterBuffer);
195 LOAD_SYMBOL (cuGraphicsResourceSetMapFlags, CuGraphicsResourceSetMapFlags);
196 LOAD_SYMBOL (cuGLGetDevices, CuGLGetDevices);
197
198 vtable->loaded = TRUE;
199
200 return TRUE;
201
202 error:
203 g_module_close (module);
204
205 return FALSE;
206 }
207
208 CUresult CUDAAPI
CuInit(unsigned int Flags)209 CuInit (unsigned int Flags)
210 {
211 g_assert (gst_cuda_vtable.CuInit != NULL);
212
213 return gst_cuda_vtable.CuInit (Flags);
214 }
215
216 CUresult CUDAAPI
CuGetErrorName(CUresult error,const char ** pStr)217 CuGetErrorName (CUresult error, const char **pStr)
218 {
219 g_assert (gst_cuda_vtable.CuGetErrorName != NULL);
220
221 return gst_cuda_vtable.CuGetErrorName (error, pStr);
222 }
223
224 CUresult CUDAAPI
CuGetErrorString(CUresult error,const char ** pStr)225 CuGetErrorString (CUresult error, const char **pStr)
226 {
227 g_assert (gst_cuda_vtable.CuGetErrorString != NULL);
228
229 return gst_cuda_vtable.CuGetErrorString (error, pStr);
230 }
231
232 CUresult CUDAAPI
CuCtxCreate(CUcontext * pctx,unsigned int flags,CUdevice dev)233 CuCtxCreate (CUcontext * pctx, unsigned int flags, CUdevice dev)
234 {
235 g_assert (gst_cuda_vtable.CuCtxCreate != NULL);
236
237 return gst_cuda_vtable.CuCtxCreate (pctx, flags, dev);
238 }
239
240 CUresult CUDAAPI
CuCtxDestroy(CUcontext ctx)241 CuCtxDestroy (CUcontext ctx)
242 {
243 g_assert (gst_cuda_vtable.CuCtxDestroy != NULL);
244
245 return gst_cuda_vtable.CuCtxDestroy (ctx);
246 }
247
248 CUresult CUDAAPI
CuCtxPopCurrent(CUcontext * pctx)249 CuCtxPopCurrent (CUcontext * pctx)
250 {
251 g_assert (gst_cuda_vtable.CuCtxPopCurrent != NULL);
252
253 return gst_cuda_vtable.CuCtxPopCurrent (pctx);
254 }
255
256 CUresult CUDAAPI
CuCtxPushCurrent(CUcontext ctx)257 CuCtxPushCurrent (CUcontext ctx)
258 {
259 g_assert (gst_cuda_vtable.CuCtxPushCurrent != NULL);
260
261 return gst_cuda_vtable.CuCtxPushCurrent (ctx);
262 }
263
264 CUresult CUDAAPI
CuCtxEnablePeerAccess(CUcontext peerContext,unsigned int Flags)265 CuCtxEnablePeerAccess (CUcontext peerContext, unsigned int Flags)
266 {
267 g_assert (gst_cuda_vtable.CuCtxEnablePeerAccess != NULL);
268
269 return gst_cuda_vtable.CuCtxEnablePeerAccess (peerContext, Flags);
270 }
271
272 CUresult CUDAAPI
CuCtxDisablePeerAccess(CUcontext peerContext)273 CuCtxDisablePeerAccess (CUcontext peerContext)
274 {
275 g_assert (gst_cuda_vtable.CuCtxDisablePeerAccess != NULL);
276
277 return gst_cuda_vtable.CuCtxDisablePeerAccess (peerContext);
278 }
279
280 CUresult CUDAAPI
CuGraphicsMapResources(unsigned int count,CUgraphicsResource * resources,CUstream hStream)281 CuGraphicsMapResources (unsigned int count, CUgraphicsResource * resources,
282 CUstream hStream)
283 {
284 g_assert (gst_cuda_vtable.CuGraphicsMapResources != NULL);
285
286 return gst_cuda_vtable.CuGraphicsMapResources (count, resources, hStream);
287 }
288
289 CUresult CUDAAPI
CuGraphicsUnmapResources(unsigned int count,CUgraphicsResource * resources,CUstream hStream)290 CuGraphicsUnmapResources (unsigned int count, CUgraphicsResource * resources,
291 CUstream hStream)
292 {
293 g_assert (gst_cuda_vtable.CuGraphicsUnmapResources != NULL);
294
295 return gst_cuda_vtable.CuGraphicsUnmapResources (count, resources, hStream);
296 }
297
298 CUresult CUDAAPI
CuGraphicsSubResourceGetMappedArray(CUarray * pArray,CUgraphicsResource resource,unsigned int arrayIndex,unsigned int mipLevel)299 CuGraphicsSubResourceGetMappedArray (CUarray * pArray,
300 CUgraphicsResource resource, unsigned int arrayIndex, unsigned int mipLevel)
301 {
302 g_assert (gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray != NULL);
303
304 return gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray (pArray, resource,
305 arrayIndex, mipLevel);
306 }
307
308 CUresult CUDAAPI
CuGraphicsResourceGetMappedPointer(CUdeviceptr * pDevPtr,size_t * pSize,CUgraphicsResource resource)309 CuGraphicsResourceGetMappedPointer (CUdeviceptr * pDevPtr, size_t * pSize,
310 CUgraphicsResource resource)
311 {
312 g_assert (gst_cuda_vtable.CuGraphicsResourceGetMappedPointer != NULL);
313
314 return gst_cuda_vtable.CuGraphicsResourceGetMappedPointer (pDevPtr, pSize,
315 resource);
316 }
317
318 CUresult CUDAAPI
CuGraphicsUnregisterResource(CUgraphicsResource resource)319 CuGraphicsUnregisterResource (CUgraphicsResource resource)
320 {
321 g_assert (gst_cuda_vtable.CuGraphicsUnregisterResource != NULL);
322
323 return gst_cuda_vtable.CuGraphicsUnregisterResource (resource);
324 }
325
326 CUresult CUDAAPI
CuMemAlloc(CUdeviceptr * dptr,unsigned int bytesize)327 CuMemAlloc (CUdeviceptr * dptr, unsigned int bytesize)
328 {
329 g_assert (gst_cuda_vtable.CuMemAlloc != NULL);
330
331 return gst_cuda_vtable.CuMemAlloc (dptr, bytesize);
332 }
333
334 CUresult CUDAAPI
CuMemAllocPitch(CUdeviceptr * dptr,size_t * pPitch,size_t WidthInBytes,size_t Height,unsigned int ElementSizeBytes)335 CuMemAllocPitch (CUdeviceptr * dptr, size_t * pPitch, size_t WidthInBytes,
336 size_t Height, unsigned int ElementSizeBytes)
337 {
338 g_assert (gst_cuda_vtable.CuMemAllocPitch != NULL);
339
340 return gst_cuda_vtable.CuMemAllocPitch (dptr, pPitch, WidthInBytes, Height,
341 ElementSizeBytes);
342 }
343
344 CUresult CUDAAPI
CuMemAllocHost(void ** pp,unsigned int bytesize)345 CuMemAllocHost (void **pp, unsigned int bytesize)
346 {
347 g_assert (gst_cuda_vtable.CuMemAllocHost != NULL);
348
349 return gst_cuda_vtable.CuMemAllocHost (pp, bytesize);
350 }
351
352 CUresult CUDAAPI
CuMemcpy2D(const CUDA_MEMCPY2D * pCopy)353 CuMemcpy2D (const CUDA_MEMCPY2D * pCopy)
354 {
355 g_assert (gst_cuda_vtable.CuMemcpy2D != NULL);
356
357 return gst_cuda_vtable.CuMemcpy2D (pCopy);
358 }
359
360 CUresult CUDAAPI
CuMemcpy2DAsync(const CUDA_MEMCPY2D * pCopy,CUstream hStream)361 CuMemcpy2DAsync (const CUDA_MEMCPY2D * pCopy, CUstream hStream)
362 {
363 g_assert (gst_cuda_vtable.CuMemcpy2DAsync != NULL);
364
365 return gst_cuda_vtable.CuMemcpy2DAsync (pCopy, hStream);
366 }
367
368 CUresult CUDAAPI
CuMemFree(CUdeviceptr dptr)369 CuMemFree (CUdeviceptr dptr)
370 {
371 g_assert (gst_cuda_vtable.CuMemFree != NULL);
372
373 return gst_cuda_vtable.CuMemFree (dptr);
374 }
375
376 CUresult CUDAAPI
CuMemFreeHost(void * p)377 CuMemFreeHost (void *p)
378 {
379 g_assert (gst_cuda_vtable.CuMemFreeHost != NULL);
380
381 return gst_cuda_vtable.CuMemFreeHost (p);
382 }
383
384 CUresult CUDAAPI
CuStreamCreate(CUstream * phStream,unsigned int Flags)385 CuStreamCreate (CUstream * phStream, unsigned int Flags)
386 {
387 g_assert (gst_cuda_vtable.CuStreamCreate != NULL);
388
389 return gst_cuda_vtable.CuStreamCreate (phStream, Flags);
390 }
391
392 CUresult CUDAAPI
CuStreamDestroy(CUstream hStream)393 CuStreamDestroy (CUstream hStream)
394 {
395 g_assert (gst_cuda_vtable.CuStreamDestroy != NULL);
396
397 return gst_cuda_vtable.CuStreamDestroy (hStream);
398 }
399
400 CUresult CUDAAPI
CuStreamSynchronize(CUstream hStream)401 CuStreamSynchronize (CUstream hStream)
402 {
403 g_assert (gst_cuda_vtable.CuStreamSynchronize != NULL);
404
405 return gst_cuda_vtable.CuStreamSynchronize (hStream);
406 }
407
408 CUresult CUDAAPI
CuDeviceGet(CUdevice * device,int ordinal)409 CuDeviceGet (CUdevice * device, int ordinal)
410 {
411 g_assert (gst_cuda_vtable.CuDeviceGet != NULL);
412
413 return gst_cuda_vtable.CuDeviceGet (device, ordinal);
414 }
415
416 CUresult CUDAAPI
CuDeviceGetCount(int * count)417 CuDeviceGetCount (int *count)
418 {
419 g_assert (gst_cuda_vtable.CuDeviceGetCount != NULL);
420
421 return gst_cuda_vtable.CuDeviceGetCount (count);
422 }
423
424 CUresult CUDAAPI
CuDeviceGetName(char * name,int len,CUdevice dev)425 CuDeviceGetName (char *name, int len, CUdevice dev)
426 {
427 g_assert (gst_cuda_vtable.CuDeviceGetName != NULL);
428
429 return gst_cuda_vtable.CuDeviceGetName (name, len, dev);
430 }
431
432 CUresult CUDAAPI
CuDeviceGetAttribute(int * pi,CUdevice_attribute attrib,CUdevice dev)433 CuDeviceGetAttribute (int *pi, CUdevice_attribute attrib, CUdevice dev)
434 {
435 g_assert (gst_cuda_vtable.CuDeviceGetAttribute != NULL);
436
437 return gst_cuda_vtable.CuDeviceGetAttribute (pi, attrib, dev);
438 }
439
440 CUresult CUDAAPI
CuDeviceCanAccessPeer(int * canAccessPeer,CUdevice dev,CUdevice peerDev)441 CuDeviceCanAccessPeer (int *canAccessPeer, CUdevice dev, CUdevice peerDev)
442 {
443 g_assert (gst_cuda_vtable.CuDeviceCanAccessPeer != NULL);
444
445 return gst_cuda_vtable.CuDeviceCanAccessPeer (canAccessPeer, dev, peerDev);
446 }
447
448 CUresult CUDAAPI
CuDriverGetVersion(int * driverVersion)449 CuDriverGetVersion (int *driverVersion)
450 {
451 g_assert (gst_cuda_vtable.CuDriverGetVersion != NULL);
452
453 return gst_cuda_vtable.CuDriverGetVersion (driverVersion);
454 }
455
456 CUresult CUDAAPI
CuModuleLoadData(CUmodule * module,const void * image)457 CuModuleLoadData (CUmodule * module, const void *image)
458 {
459 g_assert (gst_cuda_vtable.CuModuleLoadData != NULL);
460
461 return gst_cuda_vtable.CuModuleLoadData (module, image);
462 }
463
464 CUresult CUDAAPI
CuModuleUnload(CUmodule module)465 CuModuleUnload (CUmodule module)
466 {
467 g_assert (gst_cuda_vtable.CuModuleUnload != NULL);
468
469 return gst_cuda_vtable.CuModuleUnload (module);
470 }
471
472 CUresult CUDAAPI
CuModuleGetFunction(CUfunction * hfunc,CUmodule hmod,const char * name)473 CuModuleGetFunction (CUfunction * hfunc, CUmodule hmod, const char *name)
474 {
475 g_assert (gst_cuda_vtable.CuModuleGetFunction != NULL);
476
477 return gst_cuda_vtable.CuModuleGetFunction (hfunc, hmod, name);
478 }
479
480 CUresult CUDAAPI
CuTexObjectCreate(CUtexObject * pTexObject,const CUDA_RESOURCE_DESC * pResDesc,const CUDA_TEXTURE_DESC * pTexDesc,const CUDA_RESOURCE_VIEW_DESC * pResViewDesc)481 CuTexObjectCreate (CUtexObject * pTexObject,
482 const CUDA_RESOURCE_DESC * pResDesc, const CUDA_TEXTURE_DESC * pTexDesc,
483 const CUDA_RESOURCE_VIEW_DESC * pResViewDesc)
484 {
485 g_assert (gst_cuda_vtable.CuTexObjectCreate != NULL);
486
487 return gst_cuda_vtable.CuTexObjectCreate (pTexObject, pResDesc, pTexDesc,
488 pResViewDesc);
489 }
490
491 CUresult CUDAAPI
CuTexObjectDestroy(CUtexObject texObject)492 CuTexObjectDestroy (CUtexObject texObject)
493 {
494 g_assert (gst_cuda_vtable.CuTexObjectDestroy != NULL);
495
496 return gst_cuda_vtable.CuTexObjectDestroy (texObject);
497 }
498
499 CUresult CUDAAPI
CuLaunchKernel(CUfunction f,unsigned int gridDimX,unsigned int gridDimY,unsigned int gridDimZ,unsigned int blockDimX,unsigned int blockDimY,unsigned int blockDimZ,unsigned int sharedMemBytes,CUstream hStream,void ** kernelParams,void ** extra)500 CuLaunchKernel (CUfunction f, unsigned int gridDimX,
501 unsigned int gridDimY, unsigned int gridDimZ,
502 unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ,
503 unsigned int sharedMemBytes, CUstream hStream, void **kernelParams,
504 void **extra)
505 {
506 g_assert (gst_cuda_vtable.CuLaunchKernel != NULL);
507
508 return gst_cuda_vtable.CuLaunchKernel (f, gridDimX, gridDimY, gridDimZ,
509 blockDimX, blockDimY, blockDimZ, sharedMemBytes, hStream, kernelParams,
510 extra);
511 }
512
513 /* cudaGL.h */
514 CUresult CUDAAPI
CuGraphicsGLRegisterImage(CUgraphicsResource * pCudaResource,unsigned int image,unsigned int target,unsigned int Flags)515 CuGraphicsGLRegisterImage (CUgraphicsResource * pCudaResource,
516 unsigned int image, unsigned int target, unsigned int Flags)
517 {
518 g_assert (gst_cuda_vtable.CuGraphicsGLRegisterImage != NULL);
519
520 return gst_cuda_vtable.CuGraphicsGLRegisterImage (pCudaResource, image,
521 target, Flags);
522 }
523
524 CUresult CUDAAPI
CuGraphicsGLRegisterBuffer(CUgraphicsResource * pCudaResource,unsigned int buffer,unsigned int Flags)525 CuGraphicsGLRegisterBuffer (CUgraphicsResource * pCudaResource,
526 unsigned int buffer, unsigned int Flags)
527 {
528 g_assert (gst_cuda_vtable.CuGraphicsGLRegisterBuffer != NULL);
529
530 return gst_cuda_vtable.CuGraphicsGLRegisterBuffer (pCudaResource, buffer,
531 Flags);
532 }
533
534 CUresult CUDAAPI
CuGraphicsResourceSetMapFlags(CUgraphicsResource resource,unsigned int flags)535 CuGraphicsResourceSetMapFlags (CUgraphicsResource resource, unsigned int flags)
536 {
537 g_assert (gst_cuda_vtable.CuGraphicsResourceSetMapFlags != NULL);
538
539 return gst_cuda_vtable.CuGraphicsResourceSetMapFlags (resource, flags);
540 }
541
542 CUresult CUDAAPI
CuGLGetDevices(unsigned int * pCudaDeviceCount,CUdevice * pCudaDevices,unsigned int cudaDeviceCount,CUGLDeviceList deviceList)543 CuGLGetDevices (unsigned int *pCudaDeviceCount, CUdevice * pCudaDevices,
544 unsigned int cudaDeviceCount, CUGLDeviceList deviceList)
545 {
546 g_assert (gst_cuda_vtable.CuGLGetDevices != NULL);
547
548 return gst_cuda_vtable.CuGLGetDevices (pCudaDeviceCount, pCudaDevices,
549 cudaDeviceCount, deviceList);
550 }
551