fixed build with CUDA and witout OpenGL
authorVladislav Vinogradov <vlad.vinogradov@itseez.com>
Fri, 7 Dec 2012 10:03:23 +0000 (14:03 +0400)
committerVladislav Vinogradov <vlad.vinogradov@itseez.com>
Fri, 7 Dec 2012 10:03:23 +0000 (14:03 +0400)
modules/core/src/gl_core_3_1.cpp
modules/core/src/opengl_interop.cpp

index 97c11d2..716d02b 100644 (file)
+#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
index 6473979..86c8558 100644 (file)
 #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;
@@ -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
 }