summaryrefslogtreecommitdiffstats
path: root/video/out/opengl/cuda_dynamic.c
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2016-10-08 16:51:15 -0700
committerwm4 <wm4@nowhere>2016-11-23 01:07:26 +0100
commitf5e82d5ed345dbb894ff75591abc4b262b65d0dd (patch)
tree04cf9d9c47e0a89ddeeccb295f15fe25bed40d4b /video/out/opengl/cuda_dynamic.c
parentebd9ce9fca557eb0e1388c944dc2438442785e95 (diff)
downloadmpv-f5e82d5ed345dbb894ff75591abc4b262b65d0dd.tar.bz2
mpv-f5e82d5ed345dbb894ff75591abc4b262b65d0dd.tar.xz
vo_opengl: hwdec_cuda: Use dynamic loading for cuda functions
This change applies the pattern used in ffmpeg to dynamically load cuda, to avoid requiring the CUDA SDK at build time.
Diffstat (limited to 'video/out/opengl/cuda_dynamic.c')
-rw-r--r--video/out/opengl/cuda_dynamic.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/video/out/opengl/cuda_dynamic.c b/video/out/opengl/cuda_dynamic.c
new file mode 100644
index 0000000000..112e81a521
--- /dev/null
+++ b/video/out/opengl/cuda_dynamic.c
@@ -0,0 +1,63 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "cuda_dynamic.h"
+
+#include <pthread.h>
+
+#if defined(_WIN32)
+# include <windows.h>
+# define dlopen(filename, flags) LoadLibrary(TEXT(filename))
+# define dlsym(handle, symbol) GetProcAddress(handle, symbol)
+# define dlclose(handle) FreeLibrary(handle)
+#else
+# include <dlfcn.h>
+#endif
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+# define CUDA_LIBNAME "nvcuda.dll"
+#else
+# define CUDA_LIBNAME "libcuda.so.1"
+#endif
+
+#define CUDA_DECL(NAME, TYPE) \
+ TYPE *NAME;
+CUDA_FNS(CUDA_DECL)
+
+static bool cuda_loaded = false;
+static pthread_once_t cuda_load_once = PTHREAD_ONCE_INIT;
+
+static void cuda_do_load(void)
+{
+ void *lib = dlopen(CUDA_LIBNAME, RTLD_LAZY);
+ if (!lib) {
+ return;
+ }
+
+#define CUDA_LOAD_SYMBOL(NAME, TYPE) \
+ NAME = dlsym(lib, #NAME); if (!NAME) return;
+
+ CUDA_FNS(CUDA_LOAD_SYMBOL)
+
+ cuda_loaded = true;
+}
+
+bool cuda_load(void)
+{
+ pthread_once(&cuda_load_once, cuda_do_load);
+ return cuda_loaded;
+}