Open Source Computer Vision Library https://opencv.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

92 lines
2.5 KiB

#include "precomp.hpp"
#if defined(HAVE_OPENCL) && !defined(HAVE_OPENCL_STATIC)
#include "opencv2/ocl/cl_runtime/cl_runtime.hpp"
#if defined(__APPLE__)
#include <dlfcn.h>
static void* AppleCLGetProcAddress(const char* name)
{
static void * image = NULL;
if (!image)
{
image = dlopen("/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL", RTLD_LAZY | RTLD_GLOBAL);
if (!image)
return NULL;
}
return dlsym(image, name);
}
#define CV_CL_GET_PROC_ADDRESS(name) AppleCLGetProcAddress(name)
#endif // __APPLE__
#if defined(_WIN32)
static void* WinGetProcAddress(const char* name)
{
static HMODULE opencl_module = NULL;
if (!opencl_module)
{
opencl_module = GetModuleHandleA("OpenCL.dll");
if (!opencl_module)
{
const char* name = "OpenCL.dll";
const char* envOpenCLBinary = getenv("OPENCV_OPENCL_BINARY");
if (envOpenCLBinary)
name = envOpenCLBinary;
opencl_module = LoadLibraryA(name);
if (!opencl_module)
return NULL;
}
}
return (void*)GetProcAddress(opencl_module, name);
}
#define CV_CL_GET_PROC_ADDRESS(name) WinGetProcAddress(name)
#endif // _WIN32
#if defined(linux)
#include <dlfcn.h>
#include <stdio.h>
static void* GetProcAddress (const char* name)
{
static void* h = NULL;
if (!h)
{
const char* name = "libOpenCL.so";
const char* envOpenCLBinary = getenv("OPENCV_OPENCL_BINARY");
if (envOpenCLBinary)
name = envOpenCLBinary;
h = dlopen(name, RTLD_LAZY | RTLD_GLOBAL);
if (!h)
return NULL;
}
return dlsym(h, name);
}
#define CV_CL_GET_PROC_ADDRESS(name) GetProcAddress(name)
#endif
#ifndef CV_CL_GET_PROC_ADDRESS
#define CV_CL_GET_PROC_ADDRESS(name) NULL
#endif
static void* opencl_check_fn(int ID)
{
extern const char* opencl_fn_names[];
void* func = CV_CL_GET_PROC_ADDRESS(opencl_fn_names[ID]);
if (!func)
{
std::ostringstream msg;
msg << "OpenCL function is not available: [" << opencl_fn_names[ID] << "]";
CV_Error(CV_StsBadFunc, msg.str());
}
extern void* opencl_fn_ptrs[];
*(void**)(opencl_fn_ptrs[ID]) = func;
return func;
}
#include "cl_runtime_opencl_impl.hpp"
#endif