+#include <string>
+#include <sstream>
#include "cvconfig.h"
+#include "opencv2/core/core.hpp"
+#include "gl_core_3_1.hpp"
#ifdef HAVE_OPENGL
+ #if defined(__APPLE__)
+ #include <mach-o/dyld.h>
-#include <string>
-#include "gl_core_3_1.hpp"
+ static void* AppleGLGetProcAddress (const char* name)
+ {
+ static const struct mach_header* image = 0;
+ if (!image)
+ image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR);
-#if defined(__APPLE__)
- #include <mach-o/dyld.h>
+ // prepend a '_' for the Unix C symbol mangling convention
+ std::string symbolName = "_";
+ symbolName += std::string(name);
- static void* AppleGLGetProcAddress (const GLubyte *name)
- {
- static const struct mach_header* image = 0;
- if (!image)
- image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR);
+ NSSymbol symbol = image ? NSLookupSymbolInImage(image, &symbolName[0], NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : 0;
- // prepend a '_' for the Unix C symbol mangling convention
- std::string symbolName = "_";
- symbolName += std::string((const char*)name);
+ return symbol ? NSAddressOfSymbol(symbol) : 0;
+ }
+ #endif // __APPLE__
- NSSymbol symbol = image ? NSLookupSymbolInImage(image, &symbolName[0], NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : 0;
+ #if defined(__sgi) || defined (__sun)
+ #include <dlfcn.h>
+ #include <stdio.h>
- return symbol ? NSAddressOfSymbol(symbol) : 0;
- }
-#endif // __APPLE__
+ static void* SunGetProcAddress (const char* name)
+ {
+ typedef void* (func_t*)(const GLubyte*);
-#if defined(__sgi) || defined (__sun)
- #include <dlfcn.h>
- #include <stdio.h>
+ static void* h = 0;
+ static func_t gpa = 0;
- static void* SunGetProcAddress (const GLubyte* name)
- {
- typedef void* (func_t*)(const GLubyte*);
+ if (!h)
+ {
+ h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL);
+ if (!h)
+ return 0;
+ gpa = (func_t) dlsym(h, "glXGetProcAddress");
+ }
+
+ return gpa ? gpa((const GLubyte*) name) : dlsym(h, name);
+ }
+ #endif // __sgi || __sun
- static void* h = 0;
- static func_t gpa = 0;
+ #if defined(_WIN32)
+ #ifdef _MSC_VER
+ #pragma warning(disable: 4055)
+ #pragma warning(disable: 4054)
+ #endif
- if (!h)
+ static int TestPointer(const PROC pTest)
{
- h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL);
- if (!h)
+ if(!pTest)
return 0;
- gpa = (func_t) dlsym(h, "glXGetProcAddress");
- }
-
- return gpa ? gpa(name) : dlsym(h, (const char*) name);
- }
-#endif /* __sgi || __sun */
-#if defined(_WIN32)
- #ifdef _MSC_VER
- #pragma warning(disable: 4055)
- #pragma warning(disable: 4054)
- #endif
+ ptrdiff_t iTest = (ptrdiff_t) pTest;
- static int TestPointer(const PROC pTest)
- {
- if(!pTest)
- return 0;
+ if (iTest == 1 || iTest == 2 || iTest == 3 || iTest == -1)
+ return 0;
- ptrdiff_t iTest = (ptrdiff_t) pTest;
+ return 1;
+ }
- if (iTest == 1 || iTest == 2 || iTest == 3 || iTest == -1)
- return 0;
+ static PROC WinGetProcAddress(const char* name)
+ {
+ PROC pFunc = wglGetProcAddress((LPCSTR) name);
+ if (TestPointer(pFunc))
+ return pFunc;
- return 1;
- }
+ HMODULE glMod = GetModuleHandleA("OpenGL32.dll");
+ return (PROC) GetProcAddress(glMod, (LPCSTR) name);
+ }
+ #endif // _WIN32
+
+ #if defined(_WIN32)
+ #define CV_GL_GET_PROC_ADDRESS(name) WinGetProcAddress(name)
+ #elif defined(__APPLE__)
+ #define CV_GL_GET_PROC_ADDRESS(name) AppleGLGetProcAddress(name)
+ #elif defined(__sgi) || defined(__sun)
+ #define CV_GL_GET_PROC_ADDRESS(name) SunGetProcAddress(name)
+ #else // GLX
+ #include <GL/glx.h>
+
+ #define CV_GL_GET_PROC_ADDRESS(name) (*glXGetProcAddressARB)((const GLubyte*) name)
+ #endif
- static PROC WinGetProcAddress(const char* name)
+ static void* IntGetProcAddress(const char* name)
{
- PROC pFunc = wglGetProcAddress((LPCSTR) name);
- if (TestPointer(pFunc))
- return pFunc;
-
- HMODULE glMod = GetModuleHandleA("OpenGL32.dll");
- return (PROC) GetProcAddress(glMod, (LPCSTR) name);
+ void* func = CV_GL_GET_PROC_ADDRESS(name);
+ if (!func)
+ {
+ std::ostringstream msg;
+ msg << "Can't load OpenGL extension [" << name << "]";
+ CV_Error(CV_OpenGlApiCallError, msg.str());
+ }
+ return func;
}
-
- #define IntGetProcAddress(name) WinGetProcAddress(name)
#else
- #if defined(__APPLE__)
- #define IntGetProcAddress(name) AppleGLGetProcAddress(name)
- #else
- #if defined(__sgi) || defined(__sun)
- #define IntGetProcAddress(name) SunGetProcAddress(name)
- #else /* GLX */
- #include <GL/glx.h>
-
- #define IntGetProcAddress(name) (*glXGetProcAddressARB)((const GLubyte*) name)
- #endif
- #endif
+ static void* IntGetProcAddress(const char*)
+ {
+ CV_Error(CV_OpenGlNotSupported, "The library is compiled without OpenGL support");
+ return 0;
+ }
#endif
namespace gl
InitializeVariables g_initVariables;
}
-
-#endif
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/core/gpumat.hpp"
-#ifdef HAVE_OPENGL
- #include "gl_core_3_1.hpp"
+#include "gl_core_3_1.hpp"
- #ifdef HAVE_CUDA
- #include <cuda_runtime.h>
- #include <cuda_gl_interop.h>
- #endif
+#ifdef HAVE_CUDA
+ #include <cuda_runtime.h>
+ #include <cuda_gl_interop.h>
#endif
using namespace std;
namespace
{
+ #ifndef HAVE_OPENGL
+ void throw_nogl() { CV_Error(CV_OpenGlNotSupported, "The library is compiled without OpenGL support"); }
+ #else
+ void throw_nogl() { CV_Error(CV_OpenGlApiCallError, "OpenGL context doesn't exist"); }
+ #endif
+
#ifndef HAVE_CUDA
void throw_nocuda() { CV_Error(CV_GpuNotSupported, "The library is compiled without GPU support"); }
#else
cv::gpu::error(cudaGetErrorString(err), file, line, func);
}
#endif
-
- #ifndef HAVE_OPENGL
- void throw_nogl() { CV_Error(CV_OpenGlNotSupported, "The library is compiled without OpenGL support"); }
- #else
- void throw_nogl() { CV_Error(CV_OpenGlApiCallError, "OpenGL context doesn't exist"); }
- #endif
}
bool cv::checkGlError(const char* file, const int line, const char* func)
(void) device;
throw_nocuda();
#else
- #ifndef HAVE_OPENGL
- (void) device;
- throw_nogl();
- #else
- cudaSafeCall( cudaGLSetGLDevice(device) );
- #endif
+ cudaSafeCall( cudaGLSetGLDevice(device) );
#endif
}