|
|
|
@ -1,94 +1,111 @@ |
|
|
|
|
#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 |
|
|
|
@ -2699,5 +2716,3 @@ namespace gl |
|
|
|
|
|
|
|
|
|
InitializeVariables g_initVariables; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|