GL.hh 10.7 KB
Newer Older
1
2
3
4
5
/***********************************************************************
 * Copyright 2011-2012 Computer Graphics Group RWTH Aachen University. *
 * All rights reserved.                                                *
 * Distributed under the terms of the MIT License (see LICENSE.TXT).   *
 **********************************************************************/
Robert Menzel's avatar
Robert Menzel committed
6

7
8
#ifndef ACGL_OPENGL_GL_HH
#define ACGL_OPENGL_GL_HH
Robert Menzel's avatar
Robert Menzel committed
9
10

/*
11
 * This simple OpenGL wrapper is used to include OpenGL (and if needed GLEW)
Robert Menzel's avatar
Robert Menzel committed
12
13
14
15
16
17
 * on different platforms.
 *
 * While these includes are located in a subdirectory of GL/ on most systems,
 * Apple hides them on different locations.
 *
 *
18
 * This wrapper can get configured with external defines:
19
20
 * ACGL_OPENGL_PROFILE_CORE      : if defined: if possible include/load only core OpenGL functions
 *                                 if not defined: support for CORE and deprecated functions
21
 *                                 (NOTE: the OpenGL context itself is not created by ACGL!)
22
23
 * ACGL_OPENGLES_VERSION_20      : if defined: OpenGL ES 2.0
 * ACGL_OPENGLES_VERSION_30      : if defined: OpenGL ES 3.0
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 * ACGL_OPENGL_VERSION_41        : (or other versions): minimal OpenGL version that can be assumed to be present.
 *                                 The app can't run on older contexts and will probably terminate at startup.
 *                                 Set this to a low version and it will run on lost machines
 *                                 Set this to a high version and less run-time checks have to be performed to
 *                                 work around missing features (like querying extensions etc).
 * ACGL_OPENGL_INCLUDE_LATEST_GL : If this is set and GL function loading is done with the internal loader, all
 *                                 functions of the latest GL version are loaded (if available) and the header
 *                                 of the latest version gets included. ACGL however will only assume the version
 *                                 set by ACGL_OPENGL_VERSION_XY to be present.
 *
 * ACGL_USE_GLEW                 : if this is set, GLEW gets used to load the GL functions,
 *                                 otherwise an internal GL loader based on glLoadGen gets used on desktop systems.
 *
 * Note: If nothing is defined, core 3.2 gets defined but all functions are loaded.
 *       If *just* ACGL_OPENGL_INCLUDE_LATEST_GL is defined, the latest GL version gets defined *and* loaded
 *       (full/compatibility profile).
Robert Menzel's avatar
Robert Menzel committed
40
41
 */

42
// Android autodetection:
Robert Menzel's avatar
Robert Menzel committed
43
44
45
46
#ifdef __ANDROID__
#   define ACGL_OPENGL_ES
#   define PLATFORM_ANDROID
#endif
Robert Menzel's avatar
Robert Menzel committed
47
48
49

// If we're compiling for an Apple system we need this to distinquish between Mac and iOS:
#ifdef __APPLE__
Robert Menzel's avatar
Robert Menzel committed
50
#   include <TargetConditionals.h>
Robert Menzel's avatar
Robert Menzel committed
51
52
53
#endif

#if (defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR))
54
55
#   if (TARGET_OS_IPHONE == 1)
#       define PLATFORM_IOS
56
#       define ACGL_OPENGL_ES
57
#   endif
Robert Menzel's avatar
Robert Menzel committed
58
59
#endif

Robert Menzel's avatar
Robert Menzel committed
60
61
62
63
64
65
66
// To compare the OpenGL version number we define a new ACGL_OPENGL_VERSION XY define here
// analog to ACGL_OPENGL_VERSION_XY

// OpenGL ES 2.0 is the default for embedded:
#ifdef ACGL_OPENGL_ES
#  if   defined (ACGL_OPENGLES_VERSION_30)
#       define   ACGL_OPENGLES_VERSION 30
67
#       define   ACGL_OPENGL_VERSION    0
Robert Menzel's avatar
Robert Menzel committed
68
69
70
#  else 
#       define ACGL_OPENGLES_VERSION_20
#       define ACGL_OPENGLES_VERSION 20
71
#       define ACGL_OPENGL_VERSION    0
Robert Menzel's avatar
Robert Menzel committed
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#  endif
#else
    // Desktop:
    #if   defined (ACGL_OPENGL_VERSION_21)
    #     define   ACGL_OPENGL_VERSION 21
    #elif defined (ACGL_OPENGL_VERSION_30)
    #     define   ACGL_OPENGL_VERSION 30
    #elif defined (ACGL_OPENGL_VERSION_31)
    #     define   ACGL_OPENGL_VERSION 31
    #elif defined (ACGL_OPENGL_VERSION_32)
    #     define   ACGL_OPENGL_VERSION 32
    #elif defined (ACGL_OPENGL_VERSION_33)
    #     define   ACGL_OPENGL_VERSION 33
    #elif defined (ACGL_OPENGL_VERSION_40)
    #     define   ACGL_OPENGL_VERSION 40
    #elif defined (ACGL_OPENGL_VERSION_41)
    #     define   ACGL_OPENGL_VERSION 41
    #elif defined (ACGL_OPENGL_VERSION_42)
    #     define   ACGL_OPENGL_VERSION 42
    #elif defined (ACGL_OPENGL_VERSION_43)
    #     define   ACGL_OPENGL_VERSION 43
93
94
    #elif defined (ACGL_OPENGL_VERSION_44)
    #     define   ACGL_OPENGL_VERSION 44
Robert Menzel's avatar
Robert Menzel committed
95
96
    #else
	#if defined (ACGL_OPENGL_INCLUDE_LATEST_GL)
97
98
        #define ACGL_OPENGL_VERSION_44
        #define ACGL_OPENGL_VERSION 44
Robert Menzel's avatar
Robert Menzel committed
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
	    #define ACGL_OPENGL_PROFILE_FULL
	#else
	    // fallback:
	    #warning "NO ACGL_OPENGL_VERSION_XY SET! Default to 3.2 core (but load all available functions)"
	    // *we* only assume OpenGL 3.2 core...
	    #define ACGL_OPENGL_VERSION_32
	    #define ACGL_OPENGL_VERSION 32
	    #define ACGL_OPENGL_PROFILE_CORE
	    // ... but include the latest header and try to load all function in case the app needs more:
	    // (only if the internal loader gets used, but GLEW will also try to load everything)
	    #define ACGL_OPENGL_INCLUDE_LATEST_GL
	#endif // latest GL
    #endif // version checks
#endif // OpenGL ES

114
115
116
117
118
119

#if (ACGL_OPENGL_VERSION < 32) && defined(ACGL_OPENGL_PROFILE_CORE)
    #warning "OpenGL prior to 3.2 did not have core or compatibility profiles"
    #undef ACGL_OPENGL_PROFILE_CORE
#endif

120
121
122
123
124
125
126
127
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//  Include the right headers with the OpenGL functions and defines:
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

128
129
130
131
132
133
#if ACGL_OPENGL_VERSION > 32
// prevents QT from redefining the debug functions
#define GL_ARB_debug_output
#define GL_KHR_debug
#endif

134
135
void CHECKGLERROR();

136
#ifdef ACGL_OPENGL_ES
137
138
139
140
  // ES does not know 64bit ints but we need them for the Buffer class:
  #include <stdint.h>
  typedef int64_t GLint64;
  
Robert Menzel's avatar
Robert Menzel committed
141
    #if (PLATFORM_IOS)
142
        //iOS:
Robert Menzel's avatar
Robert Menzel committed
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
        #if defined (ACGL_OPENGLES_VERSION_20)
            #import <OpenGLES/ES1/gl.h>
            #import <OpenGLES/ES1/glext.h>
            #import <OpenGLES/ES2/gl.h>
            #import <OpenGLES/ES2/glext.h>
        #else
            #error "location of ES 3 headers not known"
        #endif
    #elif defined (PLATFORM_ANDROID)
        // Android:
        #if defined (ACGL_OPENGLES_VERSION_20)
            //#include <GLES/gl.h>
            //#include <GLES/glext.h>
            #include <GLES2/gl2.h>
            #include <GLES2/gl2ext.h>
        #else
            #include <GLES3/gl3.h>
            #include <GLES3/gl3ext.h>
        #endif
Robert Menzel's avatar
Robert Menzel committed
162
    #else
163
164
165
166
        #error "UNKNOWN mobile plattform! Don't know what to include!"
    #endif
#else // ACGL_OPENGL_ES
    // desktop:
167
168
169
170
171
172
173
174
175
    #ifndef __glew_h__
        // if glew was already included, don't include anything else
        // not the recommended way to do it but possible
        #if (defined(__APPLE__) || defined(MACOSX)) && defined(ACGL_OPENGL_PROFILE_FULL)
            #if ACGL_OPENGL_VERSION > 21
                #warning "On MacOS X only core profile is supported for OpenGL >= 3.2"
                #undef ACGL_OPENGL_PROFILE_FULL
                #define ACGL_OPENGL_PROFILE_CORE
            #endif
Robert Menzel's avatar
Robert Menzel committed
176
        #endif
177
        #ifdef ACGL_USE_GLEW
178
179
180
            #define ACGL_EXTENSION_LOADER_GLEW
            #if defined(__APPLE__) || defined(MACOSX)
                #include <OpenGL/glew.h>
181
            #else
182
183
                #include <GL/glew.h>
            #endif
184
        #else
185
186
            // use the internal loader:
            #define ACGL_EXTENSION_LOADER_GLLOADGEN
187
188
189
            #if defined(__gl_h_) || defined(__GL_H__) || defined(__glext_h_) || defined(__GLEXT_H_) || defined(__gl_ATI_h_) || defined(__gl3_h_)
            #error ACGL/GL.hh has to be the first OpenGL related file to include!
            #endif
190
191
192
193
194
195

            //
            // Include the right header which has just what is needed to catch compatibility problems at compiletime.
            // The selection could also be done with some preprocessor magic but it confuses most IDEs.
            //
            #ifdef ACGL_OPENGL_PROFILE_CORE
196
                #if defined (ACGL_OPENGL_VERSION_32)
197
198
199
200
201
202
203
204
205
                    #include <ACGL/OpenGL/glloaders/gl_core_32.hh>
                #elif defined (ACGL_OPENGL_VERSION_33)
                    #include <ACGL/OpenGL/glloaders/gl_core_33.hh>
                #elif defined (ACGL_OPENGL_VERSION_40)
                    #include <ACGL/OpenGL/glloaders/gl_core_40.hh>
                #elif defined (ACGL_OPENGL_VERSION_41)
                    #include <ACGL/OpenGL/glloaders/gl_core_41.hh>
                #elif defined (ACGL_OPENGL_VERSION_42)
                    #include <ACGL/OpenGL/glloaders/gl_core_42.hh>
206
207
208
209
                #elif defined (ACGL_OPENGL_VERSION_43)
                    #include <ACGL/OpenGL/glloaders/gl_core_43.hh>
                #elif defined (ACGL_OPENGL_VERSION_44)
                    #include <ACGL/OpenGL/glloaders/gl_core_44.hh>
210
211
212
                #endif
            #else
                // compatibility profile:
213
214
                #if defined (ACGL_OPENGL_VERSION_21)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_21.hh>
215
                #elif defined (ACGL_OPENGL_VERSION_30)
216
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_30.hh>
217
                #elif defined (ACGL_OPENGL_VERSION_31)
218
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_31.hh>
219
220
221
222
223
224
225
226
227
228
                #elif defined (ACGL_OPENGL_VERSION_32)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_32.hh>
                #elif defined (ACGL_OPENGL_VERSION_33)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_33.hh>
                #elif defined (ACGL_OPENGL_VERSION_40)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_40.hh>
                #elif defined (ACGL_OPENGL_VERSION_41)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_41.hh>
                #elif defined (ACGL_OPENGL_VERSION_42)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_42.hh>
229
230
231
232
                #elif defined (ACGL_OPENGL_VERSION_43)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_43.hh>
                #elif defined (ACGL_OPENGL_VERSION_44)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_44.hh>
233
234
                #endif
            #endif // ACGL_OPENGL_PROFILE_CORE
235
236
            // prevent other GL headers from getting included and redefine GL:
            #define __gl3_h_
237
        #endif // ACGL_USE_GLEW
Robert Menzel's avatar
Robert Menzel committed
238
239
    #else
        #define ACGL_USE_GLEW
240
        #define ACGL_EXTENSION_LOADER_GLEW
241
    #endif // __GLEW__
242
#endif // ACGL_OPENGL_ES
243

244
#endif // ACGL_OPENGL_GL_HH