GL.hh 10.3 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
 * ACGL_OPENGL_ES                : if defined: assume OpenGL ES (2.0 or 3.0)
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 * 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
39
40
 */

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

// 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
49
#   include <TargetConditionals.h>
Robert Menzel's avatar
Robert Menzel committed
50
51
52
#endif

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

Robert Menzel's avatar
Robert Menzel committed
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//manually enforced ES:
#ifdef ACGL_PLATFORM_MOBILE
//  ...but mobile:
//  maybe maemo or android: first one to program for these plattforms should add
//  the correct includes here!
#   define ACGL_OPENGL_ES
#endif

// 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
#  else 
#       define ACGL_OPENGLES_VERSION_20
#       define ACGL_OPENGLES_VERSION 20
#  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
    #else
	#if defined (ACGL_OPENGL_INCLUDE_LATEST_GL)
	    #define ACGL_OPENGL_VERSION_43
	    #define ACGL_OPENGL_VERSION 43
	    #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

117
118
119
120
121
122

#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

123
124
125
126
127
128
129
130
131
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//  Include the right headers with the OpenGL functions and defines:
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef ACGL_OPENGL_ES
132
133
134
135
  // 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
136
    #if (PLATFORM_IOS)
137
        //iOS:
Robert Menzel's avatar
Robert Menzel committed
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
        #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
157
    #else
158
159
160
161
        #error "UNKNOWN mobile plattform! Don't know what to include!"
    #endif
#else // ACGL_OPENGL_ES
    // desktop:
162
163
164
165
166
167
168
169
170
    #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
171
        #endif
172
173
174
175
176
177
        #ifdef ACGL_USE_GLEW
            // if GLEW_STATIC is defined, GLEW gets linked statically. GLEW itself needs this define
            // but for us its the sign that a local version of GLEW gets used, so we find it on
            // GL/glew.h on every system.
            #ifdef GLEW_STATIC
                #include "GL/glew.h"
178
            #else
179
180
181
182
183
184
                #if defined(__APPLE__) || defined(MACOSX)
                    #include <OpenGL/glew.h>
                #else
                    #include <GL/glew.h>
                #endif
            #endif // !GLEW_LOCAL_PATH
185
        #else
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
            // use the internal loader:
            #define ACGL_EXTENSION_LOADER_GLLOADGEN
            // prevent other GL headers from getting included and redefine GL:
            #define __gl3_h_

            //
            // 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
                #if defined (ACGL_OPENGL_INCLUDE_LATEST_GL) || defined (ACGL_OPENGL_VERSION_43)
                    #include <ACGL/OpenGL/glloaders/gl_core_43.hh>
                #elif defined (ACGL_OPENGL_VERSION_32)
                    #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>
                #endif
            #else
                // compatibility profile:
                #if defined (ACGL_OPENGL_INCLUDE_LATEST_GL) || defined (ACGL_OPENGL_VERSION_43)
                    #include <ACGL/OpenGL/glloaders/gl_compatibility_43.hh>
                #elif defined (ACGL_OPENGL_VERSION_21)
                    #include <ACGL/OpenGL/glloaders/gl_21.hh>
                #elif defined (ACGL_OPENGL_VERSION_30)
                    #include <ACGL/OpenGL/glloaders/gl_30.hh>
                #elif defined (ACGL_OPENGL_VERSION_31)
                    #include <ACGL/OpenGL/glloaders/gl_31.hh>
                #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>
                #endif
            #endif // ACGL_OPENGL_PROFILE_CORE
        #endif // ACGL_USE_GLEW
Robert Menzel's avatar
Robert Menzel committed
232
233
    #else
        #define ACGL_USE_GLEW
234
    #endif // __GLEW__
235
#endif // ACGL_OPENGL_ES
236

237
#endif // ACGL_OPENGL_GL_HH