1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Contact: https://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the QtGui module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at https://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 3 requirements |
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
24 | ** |
25 | ** GNU General Public License Usage |
26 | ** Alternatively, this file may be used under the terms of the GNU |
27 | ** General Public License version 2.0 or (at your option) the GNU General |
28 | ** Public license version 3 or any later version approved by the KDE Free |
29 | ** Qt Foundation. The licenses are as published by the Free Software |
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
31 | ** included in the packaging of this file. Please review the following |
32 | ** information to ensure the GNU General Public License requirements will |
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
35 | ** |
36 | ** $QT_END_LICENSE$ |
37 | ** |
38 | ****************************************************************************/ |
39 | |
40 | #ifndef QOPENGL_H |
41 | #define QOPENGL_H |
42 | |
43 | #include <QtGui/qtguiglobal.h> |
44 | |
45 | #ifndef QT_NO_OPENGL |
46 | |
47 | // Windows always needs this to ensure that APIENTRY gets defined |
48 | #if defined(Q_OS_WIN) |
49 | # include <QtCore/qt_windows.h> |
50 | #endif |
51 | |
52 | // Note: Apple is a "controlled platform" for OpenGL ABI so we |
53 | // use the system provided headers there. Controlled means that the |
54 | // headers always match the actual driver implementation so there |
55 | // is no possibility of drivers exposing additional functionality |
56 | // from the system headers. Also it means that the vendor can |
57 | // (and does) make different choices about some OpenGL types. For |
58 | // e.g. Apple uses void* for GLhandleARB whereas other platforms |
59 | // use unsigned int. |
60 | // |
61 | // For the "uncontrolled" Windows and Linux platforms we use the |
62 | // official Khronos headers. On these platforms this gives |
63 | // access to additional functionality the drivers may expose but |
64 | // which the system headers do not. |
65 | |
66 | #if QT_CONFIG(opengles2) |
67 | # if defined(Q_OS_IOS) || defined(Q_OS_TVOS) |
68 | # if QT_CONFIG(opengles3) |
69 | # include <OpenGLES/ES3/gl.h> |
70 | # include <OpenGLES/ES3/glext.h> |
71 | # else |
72 | # include <OpenGLES/ES2/gl.h> |
73 | # include <OpenGLES/ES2/glext.h> |
74 | # endif |
75 | |
76 | /* |
77 | OES_EGL_image_external is not included in the Apple provided |
78 | system headers yet, but we define the missing typedef so that |
79 | the qopenglextensions.cpp code will magically work once Apple |
80 | include the extension in their drivers. |
81 | */ |
82 | typedef void* GLeglImageOES; |
83 | |
84 | # elif !defined(Q_OS_DARWIN) // "uncontrolled" ES2 platforms |
85 | |
86 | // In "es2" builds (QT_CONFIG(opengles2)) additional defines indicate GLES 3.0 or |
87 | // higher is available *at build time*. In this case include the corresponding |
88 | // header. These are backwards compatible and it should be safe to include |
89 | // headers on top of each other, meaning that applications can include gl2.h |
90 | // even if gl31.h gets included here. |
91 | |
92 | // NB! The fact that Qt was built against an SDK with GLES 2 only does not mean |
93 | // applications cannot be deployed on a GLES 3 system. Therefore |
94 | // QOpenGLFunctions and friends must do everything dynamically and must not rely |
95 | // on these macros, except in special cases for controlled build/run environments. |
96 | |
97 | // Some Khronos headers use the ext proto guard in the standard headers as well, |
98 | // which is bad. Work it around, but avoid spilling over to the ext header. |
99 | # ifndef GL_GLEXT_PROTOTYPES |
100 | # define GL_GLEXT_PROTOTYPES |
101 | # define QGL_TEMP_GLEXT_PROTO |
102 | # endif |
103 | |
104 | # if QT_CONFIG(opengles32) |
105 | # include <GLES3/gl32.h> |
106 | # elif QT_CONFIG(opengles31) |
107 | # include <GLES3/gl31.h> |
108 | # elif QT_CONFIG(opengles3) |
109 | # include <GLES3/gl3.h> |
110 | # else |
111 | # include <GLES2/gl2.h> |
112 | # endif |
113 | |
114 | # ifdef QGL_TEMP_GLEXT_PROTO |
115 | # undef GL_GLEXT_PROTOTYPES |
116 | # undef QGL_TEMP_GLEXT_PROTO |
117 | # endif |
118 | |
119 | /* |
120 | Some GLES2 implementations (like the one on Harmattan) are missing the |
121 | typedef for GLchar. Work around it here by adding it. The Kkronos headers |
122 | specify GLChar as a typedef to char, so if an implementation already |
123 | provides it, then this doesn't do any harm. |
124 | */ |
125 | typedef char GLchar; |
126 | |
127 | # include <QtGui/qopengles2ext.h> |
128 | # endif |
129 | #else // non-ES2 platforms |
130 | # if defined(Q_OS_MACOS) |
131 | # include <OpenGL/gl.h> |
132 | # define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED |
133 | # include <OpenGL/gl3.h> |
134 | # include <OpenGL/glext.h> |
135 | # else |
136 | # define GL_GLEXT_LEGACY // Prevents GL/gl.h from #including system glext.h |
137 | // Some Khronos headers use the ext proto guard in the standard headers as well, |
138 | // which is bad. Work it around, but avoid spilling over to the ext header. |
139 | # ifndef GL_GLEXT_PROTOTYPES |
140 | # define GL_GLEXT_PROTOTYPES |
141 | # include <GL/gl.h> |
142 | # undef GL_GLEXT_PROTOTYPES |
143 | # else |
144 | # include <GL/gl.h> |
145 | # endif |
146 | # include <QtGui/qopenglext.h> |
147 | # endif |
148 | #endif // !QT_CONFIG(opengles2) |
149 | |
150 | // Desktops can support OpenGL 4. |
151 | #if !QT_CONFIG(opengles2) |
152 | #define QT_OPENGL_3 |
153 | #define QT_OPENGL_3_2 |
154 | #define QT_OPENGL_4 |
155 | # if !defined(Q_OS_MAC) |
156 | # define QT_OPENGL_4_3 |
157 | # endif |
158 | #endif |
159 | |
160 | QT_BEGIN_NAMESPACE |
161 | |
162 | |
163 | // When all else fails we provide sensible fallbacks - this is needed to |
164 | // allow compilation on OS X 10.6 |
165 | #if !QT_CONFIG(opengles2) |
166 | |
167 | // OS X 10.6 doesn't define these which are needed below |
168 | // OS X 10.7 and later defien them in gl3.h |
169 | #ifndef APIENTRY |
170 | #define APIENTRY |
171 | #endif |
172 | #ifndef APIENTRYP |
173 | #define APIENTRYP APIENTRY * |
174 | #endif |
175 | #ifndef GLAPI |
176 | #define GLAPI extern |
177 | #endif |
178 | |
179 | |
180 | // This block is copied from glext.h and defines the types needed by |
181 | // a few extension classes. |
182 | |
183 | #include <stddef.h> |
184 | #ifndef GL_VERSION_2_0 |
185 | /* GL type for program/shader text */ |
186 | typedef char GLchar; |
187 | #endif |
188 | |
189 | #ifndef GL_VERSION_1_5 |
190 | /* GL types for handling large vertex buffer objects */ |
191 | typedef ptrdiff_t GLintptr; |
192 | typedef ptrdiff_t GLsizeiptr; |
193 | #endif |
194 | |
195 | #ifndef GL_ARB_vertex_buffer_object |
196 | /* GL types for handling large vertex buffer objects */ |
197 | typedef ptrdiff_t GLintptrARB; |
198 | typedef ptrdiff_t GLsizeiptrARB; |
199 | #endif |
200 | |
201 | #ifndef GL_ARB_shader_objects |
202 | /* GL types for program/shader text and shader object handles */ |
203 | typedef char GLcharARB; |
204 | # ifdef Q_OS_DARWIN |
205 | typedef void *GLhandleARB; |
206 | # else |
207 | typedef unsigned int GLhandleARB; |
208 | # endif // Q_OS_DARWIN |
209 | #endif |
210 | |
211 | /* GL type for "half" precision (s10e5) float data in host memory */ |
212 | #ifndef GL_ARB_half_float_pixel |
213 | typedef unsigned short GLhalfARB; |
214 | #endif |
215 | |
216 | #ifndef GL_NV_half_float |
217 | typedef unsigned short GLhalfNV; |
218 | #endif |
219 | |
220 | #ifndef GLEXT_64_TYPES_DEFINED |
221 | /* This code block is duplicated in glxext.h, so must be protected */ |
222 | #define GLEXT_64_TYPES_DEFINED |
223 | /* Define int32_t, int64_t, and uint64_t types for UST/MSC */ |
224 | /* (as used in the GL_EXT_timer_query extension). */ |
225 | #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L |
226 | #include <inttypes.h> |
227 | #elif defined(__sun__) || defined(__digital__) |
228 | #include <inttypes.h> |
229 | #if defined(__STDC__) |
230 | #if defined(__arch64__) || defined(_LP64) |
231 | typedef long int int64_t; |
232 | typedef unsigned long int uint64_t; |
233 | #else |
234 | typedef long long int int64_t; |
235 | typedef unsigned long long int uint64_t; |
236 | #endif /* __arch64__ */ |
237 | #endif /* __STDC__ */ |
238 | #elif defined(__UNIXOS2__) || defined(__SOL64__) |
239 | typedef long int int32_t; |
240 | typedef long long int int64_t; |
241 | typedef unsigned long long int uint64_t; |
242 | #elif defined(_WIN32) && (defined(__GNUC__) || defined(_MSC_VER)) |
243 | #include <stdint.h> |
244 | #elif defined(_WIN32) |
245 | typedef __int32 int32_t; |
246 | typedef __int64 int64_t; |
247 | typedef unsigned __int64 uint64_t; |
248 | #else |
249 | /* Fallback if nothing above works */ |
250 | #include <inttypes.h> |
251 | #endif |
252 | #endif |
253 | |
254 | #ifndef GL_EXT_timer_query |
255 | typedef int64_t GLint64EXT; |
256 | typedef uint64_t GLuint64EXT; |
257 | #endif |
258 | |
259 | #ifndef GL_ARB_sync |
260 | typedef int64_t GLint64; |
261 | typedef uint64_t GLuint64; |
262 | typedef struct __GLsync *GLsync; |
263 | #endif |
264 | |
265 | #ifndef GL_ARB_cl_event |
266 | /* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ |
267 | struct _cl_context; |
268 | struct _cl_event; |
269 | #endif |
270 | |
271 | #ifndef GL_ARB_debug_output |
272 | typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const GLvoid *userParam); |
273 | #endif |
274 | |
275 | #ifndef GL_AMD_debug_output |
276 | typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); |
277 | #endif |
278 | |
279 | #ifndef GL_KHR_debug |
280 | typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const GLvoid *userParam); |
281 | #endif |
282 | |
283 | #ifndef GL_NV_vdpau_interop |
284 | typedef GLintptr GLvdpauSurfaceNV; |
285 | #endif |
286 | |
287 | // End of block copied from glext.h |
288 | #endif |
289 | |
290 | |
291 | // Types that aren't defined in all system's gl.h files. |
292 | typedef ptrdiff_t qopengl_GLintptr; |
293 | typedef ptrdiff_t qopengl_GLsizeiptr; |
294 | |
295 | |
296 | #if defined(APIENTRY) && !defined(QOPENGLF_APIENTRY) |
297 | # define QOPENGLF_APIENTRY APIENTRY |
298 | #endif |
299 | |
300 | # ifndef QOPENGLF_APIENTRYP |
301 | # ifdef QOPENGLF_APIENTRY |
302 | # define QOPENGLF_APIENTRYP QOPENGLF_APIENTRY * |
303 | # else |
304 | # define QOPENGLF_APIENTRY |
305 | # define QOPENGLF_APIENTRYP * |
306 | # endif |
307 | # endif |
308 | |
309 | QT_END_NAMESPACE |
310 | |
311 | #endif // QT_NO_OPENGL |
312 | |
313 | #endif // QOPENGL_H |
314 | |