Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
CudaDriverLoader.h
1#pragma once
2
3#ifdef _WIN32
4#ifndef NOMINMAX
5#define NOMINMAX // Prevent Windows.h from defining min/max macros that conflict with std::min/max
6#endif
7#define WIN32_LEAN_AND_MEAN
8#include <windows.h>
9#else
10#include <dlfcn.h>
11#endif
12
13#include <cuda.h>
14#ifndef _WIN32
15// EGL is only available on Linux/Jetson
16#include <cudaEGL.h>
17#endif
18#include <string>
19
40public:
42 static CudaDriverLoader instance;
43 return instance;
44 }
45
46 // Prevent copying
49
50 bool isAvailable() const { return libHandle != nullptr; }
51
52 const std::string& getErrorMessage() const { return errorMessage; }
53
54 // CUDA Driver API function pointers
55 // Initialization
56 CUresult (*cuInit)(unsigned int Flags) = nullptr;
57
58 // Device management
59 CUresult (*cuDeviceGet)(CUdevice *device, int ordinal) = nullptr;
60 CUresult (*cuDeviceGetCount)(int *count) = nullptr;
61 CUresult (*cuDeviceGetName)(char *name, int len, CUdevice dev) = nullptr;
62
63 // Context management
64 CUresult (*cuCtxCreate)(CUcontext *pctx, unsigned int flags, CUdevice dev) = nullptr;
65 CUresult (*cuCtxDestroy)(CUcontext ctx) = nullptr;
66 CUresult (*cuCtxPushCurrent)(CUcontext ctx) = nullptr;
67 CUresult (*cuCtxPopCurrent)(CUcontext *pctx) = nullptr;
68 CUresult (*cuCtxSynchronize)(void) = nullptr;
69 CUresult (*cuDevicePrimaryCtxRetain)(CUcontext *pctx, CUdevice dev) = nullptr;
70 CUresult (*cuDevicePrimaryCtxRelease)(CUdevice dev) = nullptr;
71
72 // Memory management
73 CUresult (*cuMemAlloc)(CUdeviceptr *dptr, size_t bytesize) = nullptr;
74 CUresult (*cuMemAllocPitch)(CUdeviceptr *dptr, size_t *pPitch, size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes) = nullptr;
75 CUresult (*cuMemFree)(CUdeviceptr dptr) = nullptr;
76 CUresult (*cuMemcpy2D)(const CUDA_MEMCPY2D *pCopy) = nullptr;
77 CUresult (*cuMemcpy2DAsync)(const CUDA_MEMCPY2D *pCopy, CUstream hStream) = nullptr;
78
79 // Stream management
80 CUresult (*cuStreamCreate)(CUstream *phStream, unsigned int Flags) = nullptr;
81 CUresult (*cuStreamDestroy)(CUstream hStream) = nullptr;
82 CUresult (*cuStreamSynchronize)(CUstream hStream) = nullptr;
83
84#ifndef _WIN32
85 // Graphics interop (for DMAUtils) - Linux/Jetson only (EGL-based)
86 CUresult (*cuGraphicsEGLRegisterImage)(CUgraphicsResource *pCudaResource, EGLImageKHR image, unsigned int flags) = nullptr;
87 CUresult (*cuGraphicsResourceGetMappedEglFrame)(CUeglFrame *eglFrame, CUgraphicsResource resource, unsigned int index, unsigned int mipLevel) = nullptr;
88 CUresult (*cuGraphicsUnregisterResource)(CUgraphicsResource resource) = nullptr;
89#endif
90
91 // Error handling
92 CUresult (*cuGetErrorName)(CUresult error, const char **pStr) = nullptr;
93 CUresult (*cuGetErrorString)(CUresult error, const char **pStr) = nullptr;
94
95private:
98
99#ifdef _WIN32
100 HMODULE libHandle = nullptr;
101#else
102 void* libHandle = nullptr;
103#endif
104 std::string errorMessage;
105
106 template<typename FuncPtr>
107 void loadSymbol(FuncPtr& funcPtr, const char* symbolName) {
108#ifdef _WIN32
109 funcPtr = reinterpret_cast<FuncPtr>(GetProcAddress(libHandle, symbolName));
110#else
111 funcPtr = reinterpret_cast<FuncPtr>(dlsym(libHandle, symbolName));
112#endif
113 if (!funcPtr) {
114 // Not all symbols may be available in all CUDA versions
115 // We'll log but not fail initialization
116 }
117 }
118};
Singleton class that dynamically loads libcuda.so (Linux) or nvcuda.dll (Windows) at runtime.
Definition CudaDriverLoader.h:39
CUresult(* cuMemcpy2D)(const CUDA_MEMCPY2D *pCopy)
Definition CudaDriverLoader.h:76
CUresult(* cuCtxSynchronize)(void)
Definition CudaDriverLoader.h:68
CUresult(* cuGraphicsEGLRegisterImage)(CUgraphicsResource *pCudaResource, EGLImageKHR image, unsigned int flags)
Definition CudaDriverLoader.h:86
const std::string & getErrorMessage() const
Definition CudaDriverLoader.h:52
~CudaDriverLoader()
Definition CudaDriverLoader.cpp:114
CUresult(* cuGraphicsUnregisterResource)(CUgraphicsResource resource)
Definition CudaDriverLoader.h:88
CUresult(* cuStreamDestroy)(CUstream hStream)
Definition CudaDriverLoader.h:81
CUresult(* cuGetErrorName)(CUresult error, const char **pStr)
Definition CudaDriverLoader.h:92
CUresult(* cuCtxDestroy)(CUcontext ctx)
Definition CudaDriverLoader.h:65
CudaDriverLoader()
Definition CudaDriverLoader.cpp:27
void * libHandle
Definition CudaDriverLoader.h:102
std::string errorMessage
Definition CudaDriverLoader.h:104
CUresult(* cuCtxPushCurrent)(CUcontext ctx)
Definition CudaDriverLoader.h:66
CUresult(* cuMemFree)(CUdeviceptr dptr)
Definition CudaDriverLoader.h:75
CUresult(* cuGetErrorString)(CUresult error, const char **pStr)
Definition CudaDriverLoader.h:93
void loadSymbol(FuncPtr &funcPtr, const char *symbolName)
Definition CudaDriverLoader.h:107
CUresult(* cuMemcpy2DAsync)(const CUDA_MEMCPY2D *pCopy, CUstream hStream)
Definition CudaDriverLoader.h:77
CUresult(* cuStreamCreate)(CUstream *phStream, unsigned int Flags)
Definition CudaDriverLoader.h:80
CUresult(* cuCtxPopCurrent)(CUcontext *pctx)
Definition CudaDriverLoader.h:67
CUresult(* cuGraphicsResourceGetMappedEglFrame)(CUeglFrame *eglFrame, CUgraphicsResource resource, unsigned int index, unsigned int mipLevel)
Definition CudaDriverLoader.h:87
CUresult(* cuInit)(unsigned int Flags)
Definition CudaDriverLoader.h:56
CUresult(* cuStreamSynchronize)(CUstream hStream)
Definition CudaDriverLoader.h:82
CudaDriverLoader & operator=(const CudaDriverLoader &)=delete
bool isAvailable() const
Definition CudaDriverLoader.h:50
CUresult(* cuMemAlloc)(CUdeviceptr *dptr, size_t bytesize)
Definition CudaDriverLoader.h:73
static CudaDriverLoader & getInstance()
Definition CudaDriverLoader.h:41
CudaDriverLoader(const CudaDriverLoader &)=delete
CUresult(* cuDeviceGet)(CUdevice *device, int ordinal)
Definition CudaDriverLoader.h:59
CUresult(* cuCtxCreate)(CUcontext *pctx, unsigned int flags, CUdevice dev)
Definition CudaDriverLoader.h:64
CUresult(* cuDevicePrimaryCtxRelease)(CUdevice dev)
Definition CudaDriverLoader.h:70
CUresult(* cuDeviceGetCount)(int *count)
Definition CudaDriverLoader.h:60
CUresult(* cuDevicePrimaryCtxRetain)(CUcontext *pctx, CUdevice dev)
Definition CudaDriverLoader.h:69
CUresult(* cuMemAllocPitch)(CUdeviceptr *dptr, size_t *pPitch, size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes)
Definition CudaDriverLoader.h:74
CUresult(* cuDeviceGetName)(char *name, int len, CUdevice dev)
Definition CudaDriverLoader.h:61