Stellarium 0.14.3
StelOpenGL.hpp
1 /*
2  * Stellarium
3  * Copyright (C) 2014 Fabien Chereau
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18  */
19 
20 #ifndef _STELOPENGL_HPP_
21 #define _STELOPENGL_HPP_
22 
23 #define GL_GLEXT_PROTOTYPES
24 #include <qopengl.h>
25 
26 #include <QOpenGLFunctions>
27 
28 // On windows without ANGLE support, we should not directly call some
29 // of the OpenGL functions, instead we have to use QOpenGLFunctions.
30 //
31 // Here we replace the functions with a macro that will invoke the proper
32 // calls.
33 #if defined(Q_OS_WIN) && !defined(Q_NO_OPENGL)
34 # define GLFUNC_(x) QOpenGLContext::currentContext()->functions()->x
35 #else
36 # define GLFUNC_(x) x
37 #endif
38 
39 #define glActiveTexture(...) GLFUNC_(glActiveTexture(__VA_ARGS__))
40 #define glAttachShader(...) GLFUNC_(glAttachShader(__VA_ARGS__))
41 #define glBindAttribLocation(...) GLFUNC_(glBindAttribLocation(__VA_ARGS__))
42 #define glBindBuffer(...) GLFUNC_(glBindBuffer(__VA_ARGS__))
43 #define glBindFramebuffer(...) GLFUNC_(glBindFramebuffer(__VA_ARGS__))
44 #define glBindRenderbuffer(...) GLFUNC_(glBindRenderbuffer(__VA_ARGS__))
45 #define glBlendColor(...) GLFUNC_(glBlendColor(__VA_ARGS__))
46 #define glBlendEquation(...) GLFUNC_(glBlendEquation(__VA_ARGS__))
47 #define glBlendEquationSeparate(...) GLFUNC_(glBlendEquationSeparate(__VA_ARGS__))
48 #define glBlendFuncSeparate(...) GLFUNC_(glBlendFuncSeparate(__VA_ARGS__))
49 #define glBufferData(...) GLFUNC_(glBufferData(__VA_ARGS__))
50 #define glBufferSubData(...) GLFUNC_(glBufferSubData(__VA_ARGS__))
51 #define glCheckFramebufferStatus(...) GLFUNC_(glCheckFramebufferStatus(__VA_ARGS__))
52 #define glClearDepthf(...) GLFUNC_(glClearDepthf(__VA_ARGS__))
53 #define glCompileShader(...) GLFUNC_(glCompileShader(__VA_ARGS__))
54 #define glCompressedTexImage2D(...) GLFUNC_(glCompressedTexImage2D(__VA_ARGS__))
55 #define glCompressedTexSubImage2D(...) GLFUNC_(glCompressedTexSubImage2D(__VA_ARGS__))
56 #define glCreateProgram(...) GLFUNC_(glCreateProgram(__VA_ARGS__))
57 #define glCreateShader(...) GLFUNC_(glCreateShader(__VA_ARGS__))
58 #define glDeleteBuffers(...) GLFUNC_(glDeleteBuffers(__VA_ARGS__))
59 #define glDeleteFramebuffers(...) GLFUNC_(glDeleteFramebuffers(__VA_ARGS__))
60 #define glDeleteProgram(...) GLFUNC_(glDeleteProgram(__VA_ARGS__))
61 #define glDeleteRenderbuffers(...) GLFUNC_(glDeleteRenderbuffers(__VA_ARGS__))
62 #define glDeleteShader(...) GLFUNC_(glDeleteShader(__VA_ARGS__))
63 #define glDepthRangef(...) GLFUNC_(glDepthRangef(__VA_ARGS__))
64 #define glDetachShader(...) GLFUNC_(glDetachShader(__VA_ARGS__))
65 #define glDisableVertexAttribArray(...) GLFUNC_(glDisableVertexAttribArray(__VA_ARGS__))
66 #define glEnableVertexAttribArray(...) GLFUNC_(glEnableVertexAttribArray(__VA_ARGS__))
67 #define glFramebufferRenderbuffer(...) GLFUNC_(glFramebufferRenderbuffer(__VA_ARGS__))
68 #define glFramebufferTexture2D(...) GLFUNC_(glFramebufferTexture2D(__VA_ARGS__))
69 #define glGenBuffers(...) GLFUNC_(glGenBuffers(__VA_ARGS__))
70 #define glGenerateMipmap(...) GLFUNC_(glGenerateMipmap(__VA_ARGS__))
71 #define glGenFramebuffers(...) GLFUNC_(glGenFramebuffers(__VA_ARGS__))
72 #define glGenRenderbuffers(...) GLFUNC_(glGenRenderbuffers(__VA_ARGS__))
73 #define glGetActiveAttrib(...) GLFUNC_(glGetActiveAttrib(__VA_ARGS__))
74 #define glGetActiveUniform(...) GLFUNC_(glGetActiveUniform(__VA_ARGS__))
75 #define glGetAttachedShaders(...) GLFUNC_(glGetAttachedShaders(__VA_ARGS__))
76 #define glGetAttribLocation(...) GLFUNC_(glGetAttribLocation(__VA_ARGS__))
77 #define glGetBufferParameteriv(...) GLFUNC_(glGetBufferParameteriv(__VA_ARGS__))
78 #define glGetFramebufferAttachmentParameteriv(...) GLFUNC_(glGetFramebufferAttachmentParameteriv(__VA_ARGS__))
79 #define glGetProgramiv(...) GLFUNC_(glGetProgramiv(__VA_ARGS__))
80 #define glGetProgramInfoLog(...) GLFUNC_(glGetProgramInfoLog(__VA_ARGS__))
81 #define glGetRenderbufferParameteriv(...) GLFUNC_(glGetRenderbufferParameteriv(__VA_ARGS__))
82 #define glGetShaderiv(...) GLFUNC_(glGetShaderiv(__VA_ARGS__))
83 #define glGetShaderInfoLog(...) GLFUNC_(glGetShaderInfoLog(__VA_ARGS__))
84 #define glGetShaderPrecisionFormat(...) GLFUNC_(glGetShaderPrecisionFormat(__VA_ARGS__))
85 #define glGetShaderSource(...) GLFUNC_(glGetShaderSource(__VA_ARGS__))
86 #define glGetUniformfv(...) GLFUNC_(glGetUniformfv(__VA_ARGS__))
87 #define glGetUniformiv(...) GLFUNC_(glGetUniformiv(__VA_ARGS__))
88 #define glGetUniformLocation(...) GLFUNC_(glGetUniformLocation(__VA_ARGS__))
89 #define glGetVertexAttribfv(...) GLFUNC_(glGetVertexAttribfv(__VA_ARGS__))
90 #define glGetVertexAttribiv(...) GLFUNC_(glGetVertexAttribiv(__VA_ARGS__))
91 #define glGetVertexAttribPointerv(...) GLFUNC_(glGetVertexAttribPointerv(__VA_ARGS__))
92 #define glIsBuffer(...) GLFUNC_(glIsBuffer(__VA_ARGS__))
93 #define glIsFramebuffer(...) GLFUNC_(glIsFramebuffer(__VA_ARGS__))
94 #define glIsProgram(...) GLFUNC_(glIsProgram(__VA_ARGS__))
95 #define glIsRenderbuffer(...) GLFUNC_(glIsRenderbuffer(__VA_ARGS__))
96 #define glIsShader(...) GLFUNC_(glIsShader(__VA_ARGS__))
97 #define glLinkProgram(...) GLFUNC_(glLinkProgram(__VA_ARGS__))
98 #define glProgramParameteri(...) GLFUNC_(glProgramParameteri(__VA_ARGS__)) // GZ TRIAL
99 #define glProgramParameteriEXT(...) GLFUNC_(glProgramParameteriEXT(__VA_ARGS__)) // GZ TRIAL
100 #define glReleaseShaderCompiler(...) GLFUNC_(glReleaseShaderCompiler(__VA_ARGS__))
101 #define glRenderbufferStorage(...) GLFUNC_(glRenderbufferStorage(__VA_ARGS__))
102 #define glSampleCoverage(...) GLFUNC_(glSampleCoverage(__VA_ARGS__))
103 #define glShaderBinary(...) GLFUNC_(glShaderBinary(__VA_ARGS__))
104 #define glShaderSource(...) GLFUNC_(glShaderSource(__VA_ARGS__))
105 #define glStencilFuncSeparate(...) GLFUNC_(glStencilFuncSeparate(__VA_ARGS__))
106 #define glStencilMaskSeparate(...) GLFUNC_(glStencilMaskSeparate(__VA_ARGS__))
107 #define glStencilOpSeparate(...) GLFUNC_(glStencilOpSeparate(__VA_ARGS__))
108 #define glUniform1f(...) GLFUNC_(glUniform1f(__VA_ARGS__))
109 #define glUniform1fv(...) GLFUNC_(glUniform1fv(__VA_ARGS__))
110 #define glUniform1i(...) GLFUNC_(glUniform1i(__VA_ARGS__))
111 #define glUniform1iv(...) GLFUNC_(glUniform1iv(__VA_ARGS__))
112 #define glUniform2f(...) GLFUNC_(glUniform2f(__VA_ARGS__))
113 #define glUniform2fv(...) GLFUNC_(glUniform2fv(__VA_ARGS__))
114 #define glUniform2i(...) GLFUNC_(glUniform2i(__VA_ARGS__))
115 #define glUniform2iv(...) GLFUNC_(glUniform2iv(__VA_ARGS__))
116 #define glUniform3f(...) GLFUNC_(glUniform3f(__VA_ARGS__))
117 #define glUniform3fv(...) GLFUNC_(glUniform3fv(__VA_ARGS__))
118 #define glUniform3i(...) GLFUNC_(glUniform3i(__VA_ARGS__))
119 #define glUniform3iv(...) GLFUNC_(glUniform3iv(__VA_ARGS__))
120 #define glUniform4f(...) GLFUNC_(glUniform4f(__VA_ARGS__))
121 #define glUniform4fv(...) GLFUNC_(glUniform4fv(__VA_ARGS__))
122 #define glUniform4i(...) GLFUNC_(glUniform4i(__VA_ARGS__))
123 #define glUniform4iv(...) GLFUNC_(glUniform4iv(__VA_ARGS__))
124 #define glUniformMatrix2fv(...) GLFUNC_(glUniformMatrix2fv(__VA_ARGS__))
125 #define glUniformMatrix3fv(...) GLFUNC_(glUniformMatrix3fv(__VA_ARGS__))
126 #define glUniformMatrix4fv(...) GLFUNC_(glUniformMatrix4fv(__VA_ARGS__))
127 #define glUseProgram(...) GLFUNC_(glUseProgram(__VA_ARGS__))
128 #define glValidateProgram(...) GLFUNC_(glValidateProgram(__VA_ARGS__))
129 #define glVertexAttrib1f(...) GLFUNC_(glVertexAttrib1f(__VA_ARGS__))
130 #define glVertexAttrib1fv(...) GLFUNC_(glVertexAttrib1fv(__VA_ARGS__))
131 #define glVertexAttrib2f(...) GLFUNC_(glVertexAttrib2f(__VA_ARGS__))
132 #define glVertexAttrib2fv(...) GLFUNC_(glVertexAttrib2fv(__VA_ARGS__))
133 #define glVertexAttrib3f(...) GLFUNC_(glVertexAttrib3f(__VA_ARGS__))
134 #define glVertexAttrib3fv(...) GLFUNC_(glVertexAttrib3fv(__VA_ARGS__))
135 #define glVertexAttrib4f(...) GLFUNC_(glVertexAttrib4f(__VA_ARGS__))
136 #define glVertexAttrib4fv(...) GLFUNC_(glVertexAttrib4fv(__VA_ARGS__))
137 #define glVertexAttribPointer(...) GLFUNC_(glVertexAttribPointer(__VA_ARGS__))
138 
139 #if QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)
140 #define glGetString(...) GLFUNC_(glGetString(__VA_ARGS__))
141 #endif
142 
143 #if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
144 #define glBindTexture(...) GLFUNC_(glBindTexture(__VA_ARGS__))
145 #define glBlendFunc(...) GLFUNC_(glBlendFunc(__VA_ARGS__))
146 #define glClear(...) GLFUNC_(glClear(__VA_ARGS__))
147 #define glClearColor(...) GLFUNC_(glClearColor(__VA_ARGS__))
148 #define glCullFace(...) GLFUNC_(glCullFace(__VA_ARGS__))
149 #define glDeleteTextures(...) GLFUNC_(glDeleteTextures(__VA_ARGS__))
150 #define glDepthMask(...) GLFUNC_(glDepthMask(__VA_ARGS__))
151 #define glDisable(...) GLFUNC_(glDisable(__VA_ARGS__))
152 #define glDrawArrays(...) GLFUNC_(glDrawArrays(__VA_ARGS__))
153 #define glDrawElements(...) GLFUNC_(glDrawElements(__VA_ARGS__))
154 #define glEnable(...) GLFUNC_(glEnable(__VA_ARGS__))
155 #define glGenTextures(...) GLFUNC_(glGenTextures(__VA_ARGS__))
156 #define glGetError(...) GLFUNC_(glGetError(__VA_ARGS__))
157 #define glGetIntegerv(...) GLFUNC_(glGetIntegerv(__VA_ARGS__))
158 #define glFrontFace(...) GLFUNC_(glFrontFace(__VA_ARGS__))
159 #define glIsEnabled(...) GLFUNC_(glIsEnabled(__VA_ARGS__))
160 #define glIsTexture(...) GLFUNC_(glIsTexture(__VA_ARGS__))
161 #define glLineWidth(...) GLFUNC_(glLineWidth(__VA_ARGS__))
162 #define glPixelStorei(...) GLFUNC_(glPixelStorei(__VA_ARGS__))
163 #define glPolygonOffset(...) GLFUNC_(glPolygonOffset(__VA_ARGS__))
164 #define glStencilMask(...) GLFUNC_(glStencilMask(__VA_ARGS__))
165 #define glTexImage2D(...) GLFUNC_(glTexImage2D(__VA_ARGS__))
166 #define glTexParameterf(...) GLFUNC_(glTexParameterf(__VA_ARGS__))
167 #define glTexParameterfv(...) GLFUNC_(glTexParameterfv(__VA_ARGS__))
168 #define glTexParameteri(...) GLFUNC_(glTexParameteri(__VA_ARGS__))
169 #define glTexParameteriv(...) GLFUNC_(glTexParameteriv(__VA_ARGS__))
170 #define glViewport(...) GLFUNC_(glViewport(__VA_ARGS__))
171 #endif
172 
173 #ifndef NDEBUG
174 # define GL(line) do { \
175  line;\
176  if (checkGLErrors(__FILE__, __LINE__))\
177  exit(-1);\
178  } while(0)
179 #else
180 # define GL(line) line
181 #endif
182 
183 // In ANGLE and other OpenGL ES systems, GL_LINE_SMOOTH is undefined.
184 // We can define it here to not break compilation, but must test for real OpenGL context before calling.
185 # ifndef GL_LINE_SMOOTH
186 # define GL_LINE_SMOOTH 0x0B20
187 # endif
188 
189 const char* getGLErrorText(int code);
190 int checkGLErrors(const char *file, int line);
191 
192 // To build on arm platforms we need to re-introduce the Qt 5.4 removed
193 // typedefs and defines of GLdouble/GL_DOUBLE, which are not present in GLES
194 #if defined(QT_OPENGL_ES_2)
195 # ifndef GL_DOUBLE
196 # define GL_DOUBLE GL_FLOAT
197 # endif
198 # ifndef GLdouble
199 typedef GLfloat GLdouble;
200 # endif
201 #endif
202 
203 #endif // _STELOPENGL_HPP_