From c6263eb25332170ad43d550cffbb0648c0db1d0f Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Fri, 7 Dec 2012 14:03:23 +0400 Subject: [PATCH] fixed build with CUDA and witout OpenGL --- modules/core/src/gl_core_3_1.cpp | 153 ++++++++++++++++++++---------------- modules/core/src/opengl_interop.cpp | 29 +++---- 2 files changed, 95 insertions(+), 87 deletions(-) diff --git a/modules/core/src/gl_core_3_1.cpp b/modules/core/src/gl_core_3_1.cpp index 97c11d2..716d02b 100644 --- a/modules/core/src/gl_core_3_1.cpp +++ b/modules/core/src/gl_core_3_1.cpp @@ -1,94 +1,111 @@ +#include +#include #include "cvconfig.h" +#include "opencv2/core/core.hpp" +#include "gl_core_3_1.hpp" #ifdef HAVE_OPENGL + #if defined(__APPLE__) + #include -#include -#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 + // 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 + #include - 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 - #include + 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 + + #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 - - #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 diff --git a/modules/core/src/opengl_interop.cpp b/modules/core/src/opengl_interop.cpp index 6473979..86c8558 100644 --- a/modules/core/src/opengl_interop.cpp +++ b/modules/core/src/opengl_interop.cpp @@ -44,13 +44,11 @@ #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 - #include - #endif +#ifdef HAVE_CUDA + #include + #include #endif using namespace std; @@ -59,6 +57,12 @@ using namespace cv::gpu; 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 @@ -76,12 +80,6 @@ namespace 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) @@ -145,12 +143,7 @@ void cv::gpu::setGlDevice(int device) (void) device; throw_nocuda(); #else - #ifndef HAVE_OPENGL - (void) device; - throw_nogl(); - #else - cudaSafeCall( cudaGLSetGLDevice(device) ); - #endif + cudaSafeCall( cudaGLSetGLDevice(device) ); #endif } -- 2.7.4