1 /*
2  Copyright (C) 2010-2014 Kristian Duske
3 
4  This file is part of TrenchBroom.
5 
6  TrenchBroom is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  TrenchBroom is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with TrenchBroom. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "GLInit.h"
21 
22 #include "Exceptions.h"
23 #include "Renderer/GL.h"
24 
25 namespace TrenchBroom {
26     // Glew will undefine some of the names declared in GL.h, so we create new names here
27     static Func0<void>& _glewInitialize = glewInitialize;
28 
29     static Func0<GLenum>& _glGetError = glGetError;
30     static Func1<const GLubyte*, GLenum>& _glGetString = glGetString;
31 
32     static Func1<void, GLenum>& _glEnable = glEnable;
33     static Func1<void, GLenum>& _glDisable = glDisable;
34     static Func1<void, GLbitfield>& _glClear = glClear;
35     static Func4<void, GLclampf, GLclampf, GLclampf, GLclampf>& _glClearColor = glClearColor;
36 
37     static Func4<void, GLint, GLint, GLsizei, GLsizei>& _glViewport = glViewport;
38 
39     static Func2<void, GLenum, GLenum>& _glBlendFunc = glBlendFunc;
40     static Func1<void, GLenum>& _glShadeModel = glShadeModel;
41 
42     static Func1<void, GLenum>& _glDepthFunc = glDepthFunc;
43     static Func1<void, GLboolean>& _glDepthMask = glDepthMask;
44     static Func2<void, GLclampd, GLclampd>& _glDepthRange = glDepthRange;
45 
46     static Func1<void, GLfloat>& _glLineWidth = glLineWidth;
47     static Func1<void, GLfloat>& _glPointSize = glPointSize;
48     static Func2<void, GLenum, GLenum>& _glPolygonMode = glPolygonMode;
49     static Func1<void, GLenum>& _glFrontFace = glFrontFace;
50 
51     static Func0<void>& _glLoadIdentity = glLoadIdentity;
52     static Func1<void, const GLdouble*>& _glLoadMatrixd = glLoadMatrixd;
53     static Func1<void, const GLfloat*>& _glLoadMatrixf = glLoadMatrixf;
54     static Func1<void, GLenum>& _glMatrixMode = glMatrixMode;
55 
56     static Func2<void, GLenum, GLint*>& _glGetIntegerv = glGetIntegerv;
57 
58     static Func2<void, GLenum, GLfloat>& _glPixelStoref = glPixelStoref;
59     static Func2<void, GLenum, GLint>& _glPixelStorei = glPixelStorei;
60 
61     static Func2<void, GLsizei, GLuint*>& _glGenTextures = glGenTextures;
62     static Func2<void, GLsizei, const GLuint*>& _glDeleteTextures = glDeleteTextures;
63     static Func2<void, GLenum, GLuint>& _glBindTexture = glBindTexture;
64     static Func3<void, GLenum, GLenum, GLfloat>& _glTexParameterf = glTexParameterf;
65     static Func3<void, GLenum, GLenum, GLint>& _glTexParameteri = glTexParameteri;
66     static Func9<void, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*>& _glTexImage2D = glTexImage2D;
67     static Func1<void, GLenum>& _glActiveTexture = glActiveTexture;
68 
69     static Func2<void, GLsizei, GLuint*>& _glGenBuffers = glGenBuffers;
70     static Func2<void, GLsizei, const GLuint*>& _glDeleteBuffers = glDeleteBuffers;
71     static Func2<void, GLenum, GLuint>& _glBindBuffer = glBindBuffer;
72     static Func4<void, GLenum, GLsizeiptr, const GLvoid*, GLenum>& _glBufferData = glBufferData;
73     static Func4<void, GLenum, GLintptr, GLsizeiptr, const GLvoid*>& _glBufferSubData = glBufferSubData;
74     static Func2<GLvoid*, GLenum, GLenum>& _glMapBuffer = glMapBuffer;
75     static Func1<GLboolean, GLenum>& _glUnmapBuffer = glUnmapBuffer;
76 
77     static Func1<void, GLuint>& _glEnableVertexAttribArray = glEnableVertexAttribArray;
78     static Func1<void, GLuint>& _glDisableVertexAttribArray = glDisableVertexAttribArray;
79     static Func1<void, GLenum>& _glEnableClientState = glEnableClientState;
80     static Func1<void, GLenum>& _glDisableClientState = glDisableClientState;
81     static Func1<void, GLenum>& _glClientActiveTexture = glClientActiveTexture;
82 
83     static Func6<void, GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid*>& _glVertexAttribPointer = glVertexAttribPointer;
84     static Func4<void, GLint, GLenum, GLsizei, const GLvoid*>& _glVertexPointer = glVertexPointer;
85     static Func3<void, GLenum, GLsizei, const GLvoid*>& _glNormalPointer = glNormalPointer;
86     static Func4<void, GLint, GLenum, GLsizei, const GLvoid*>& _glColorPointer = glColorPointer;
87     static Func4<void, GLint, GLenum, GLsizei, const GLvoid*>& _glTexCoordPointer = glTexCoordPointer;
88 
89     static Func3<void, GLenum, GLint, GLsizei>& _glDrawArrays = glDrawArrays;
90     static Func4<void, GLenum, const GLint*, const GLsizei*, GLsizei>& _glMultiDrawArrays = glMultiDrawArrays;
91     static Func4<void, GLenum, GLsizei, GLenum, const GLvoid*>& _glDrawElements = glDrawElements;
92     static Func6<void, GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid*>& _glDrawRangeElements = glDrawRangeElements;
93     static Func5<void, GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei>& _glMultiDrawElements = glMultiDrawElements;
94 
95     static Func1<GLuint, GLenum>& _glCreateShader = glCreateShader;
96     static Func1<void, GLuint>& _glDeleteShader = glDeleteShader;
97     static Func4<void, GLuint, GLsizei, const GLchar**, const GLint*>& _glShaderSource = glShaderSource;
98     static Func1<void, GLuint>& _glCompileShader = glCompileShader;
99     static Func3<void, GLuint, GLenum, GLint*>& _glGetShaderiv = glGetShaderiv;
100     static Func4<void, GLuint, GLsizei, GLsizei*, GLchar*>& _glGetShaderInfoLog = glGetShaderInfoLog;
101     static Func2<void, GLuint, GLuint>& _glAttachShader = glAttachShader;
102     static Func2<void, GLuint, GLuint>& _glDetachShader = glDetachShader;
103 
104     static Func0<GLuint>& _glCreateProgram = glCreateProgram;
105     static Func1<void, GLuint>& _glDeleteProgram = glDeleteProgram;
106     static Func1<void, GLuint>& _glLinkProgram = glLinkProgram;
107     static Func3<void, GLuint, GLenum, GLint*>& _glGetProgramiv = glGetProgramiv;
108     static Func4<void, GLuint, GLsizei, GLsizei*, GLchar*>& _glGetProgramInfoLog = glGetProgramInfoLog;
109     static Func1<void, GLuint>& _glUseProgram = glUseProgram;
110 
111     static Func2<void, GLint, GLfloat>& _glUniform1f = glUniform1f;
112     static Func3<void, GLint, GLfloat, GLfloat>& _glUniform2f = glUniform2f;
113     static Func4<void, GLint, GLfloat, GLfloat, GLfloat>& _glUniform3f = glUniform3f;
114     static Func5<void, GLint, GLfloat, GLfloat, GLfloat, GLfloat>& _glUniform4f = glUniform4f;
115     static Func2<void, GLint, GLint>& _glUniform1i = glUniform1i;
116     static Func3<void, GLint, GLint, GLint>& _glUniform2i = glUniform2i;
117     static Func4<void, GLint, GLint, GLint, GLint>& _glUniform3i = glUniform3i;
118     static Func5<void, GLint, GLint, GLint, GLint, GLint>& _glUniform4i = glUniform4i;
119     static Func2<void, GLint, GLuint>& _glUniform1ui = glUniform1ui;
120     static Func3<void, GLint, GLuint, GLuint>& _glUniform2ui = glUniform2ui;
121     static Func4<void, GLint, GLuint, GLuint, GLuint>& _glUniform3ui = glUniform3ui;
122     static Func5<void, GLint, GLuint, GLuint, GLuint, GLuint>& _glUniform4ui = glUniform4ui;
123 
124     static Func3<void, GLint, GLsizei, const GLfloat*>& _glUniform1fv = glUniform1fv;
125     static Func3<void, GLint, GLsizei, const GLfloat*>& _glUniform2fv = glUniform2fv;
126     static Func3<void, GLint, GLsizei, const GLfloat*>& _glUniform3fv = glUniform3fv;
127     static Func3<void, GLint, GLsizei, const GLfloat*>& _glUniform4fv = glUniform4fv;
128     static Func3<void, GLint, GLsizei, const GLint*>& _glUniform1iv = glUniform1iv;
129     static Func3<void, GLint, GLsizei, const GLint*>& _glUniform2iv = glUniform2iv;
130     static Func3<void, GLint, GLsizei, const GLint*>& _glUniform3iv = glUniform3iv;
131     static Func3<void, GLint, GLsizei, const GLint*>& _glUniform4iv = glUniform4iv;
132     static Func3<void, GLint, GLsizei, const GLuint*>& _glUniform1uiv = glUniform1uiv;
133     static Func3<void, GLint, GLsizei, const GLuint*>& _glUniform2uiv = glUniform2uiv;
134     static Func3<void, GLint, GLsizei, const GLuint*>& _glUniform3uiv = glUniform3uiv;
135     static Func3<void, GLint, GLsizei, const GLuint*>& _glUniform4uiv = glUniform4uiv;
136 
137     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix2fv = glUniformMatrix2fv;
138     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix3fv = glUniformMatrix3fv;
139     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix4fv = glUniformMatrix4fv;
140     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix2x3fv = glUniformMatrix2x3fv;
141     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix3x2fv = glUniformMatrix3x2fv;
142     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix2x4fv = glUniformMatrix2x4fv;
143     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix4x2fv = glUniformMatrix4x2fv;
144     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix3x4fv = glUniformMatrix3x4fv;
145     static Func4<void, GLint, GLsizei, GLboolean, const GLfloat*>& _glUniformMatrix4x3fv = glUniformMatrix4x3fv;
146 
147     static Func2<GLint, GLuint, const GLchar*>& _glGetUniformLocation = glGetUniformLocation;
148 
149 #ifdef __APPLE__
150     static Func2<void, GLenum, GLint>& _glFinishObjectAPPLE = glFinishObjectAPPLE;
151 #endif
152 }
153 
154 #include <GL/glew.h>
155 
156 namespace TrenchBroom {
initRemainingFunctions()157     static void initRemainingFunctions() {
158         _glGetError.bindFunc(&::glGetError);
159         _glGetString.bindFunc(&::glGetString);
160 
161         _glEnable.bindFunc(&::glEnable);
162         _glDisable.bindFunc(&::glDisable);
163         _glClear.bindFunc(&::glClear);
164         _glClearColor.bindFunc(&::glClearColor);
165 
166         _glViewport.bindFunc(&::glViewport);
167 
168         _glBlendFunc.bindFunc(&::glBlendFunc);
169         _glShadeModel.bindFunc(&::glShadeModel);
170 
171         _glDepthFunc.bindFunc(&::glDepthFunc);
172         _glDepthMask.bindFunc(&::glDepthMask);
173         _glDepthRange.bindFunc(&::glDepthRange);
174 
175         _glLineWidth.bindFunc(&::glLineWidth);
176         _glPointSize.bindFunc(&::glPointSize);
177         _glPolygonMode.bindFunc(&::glPolygonMode);
178         _glFrontFace.bindFunc(&::glFrontFace);
179 
180         _glLoadIdentity.bindFunc(&::glLoadIdentity);
181         _glLoadMatrixd.bindFunc(&::glLoadMatrixd);
182         _glLoadMatrixf.bindFunc(&::glLoadMatrixf);
183         _glMatrixMode.bindFunc(&::glMatrixMode);
184 
185         _glGetIntegerv.bindFunc(&::glGetIntegerv);
186 
187         _glPixelStoref.bindFunc(&::glPixelStoref);
188         _glPixelStorei.bindFunc(&::glPixelStorei);
189 
190         _glGenTextures.bindFunc(&::glGenTextures);
191         _glDeleteTextures.bindFunc(&::glDeleteTextures);
192         _glBindTexture.bindFunc(&::glBindTexture);
193         _glTexParameterf.bindFunc(&::glTexParameterf);
194         _glTexParameteri.bindFunc(&::glTexParameteri);
195         _glTexImage2D.bindFunc(&::glTexImage2D);
196         _glActiveTexture.bindFunc(glActiveTexture);
197 
198         _glGenBuffers.bindFunc(glGenBuffers);
199         _glDeleteBuffers.bindFunc(glDeleteBuffers);
200         _glBindBuffer.bindFunc(glBindBuffer);
201         _glBufferData.bindFunc(glBufferData);
202         _glBufferSubData.bindFunc(glBufferSubData);
203         _glMapBuffer.bindFunc(glMapBuffer);
204         _glUnmapBuffer.bindFunc(glUnmapBuffer);
205 
206         _glEnableVertexAttribArray.bindFunc(glEnableVertexAttribArray);
207         _glDisableVertexAttribArray.bindFunc(glDisableVertexAttribArray);
208         _glEnableClientState.bindFunc(&::glEnableClientState);
209         _glDisableClientState.bindFunc(&::glDisableClientState);
210         _glClientActiveTexture.bindFunc(glClientActiveTexture);
211 
212         _glVertexAttribPointer.bindFunc(glVertexAttribPointer);
213         _glVertexPointer.bindFunc(&::glVertexPointer);
214         _glNormalPointer.bindFunc(&::glNormalPointer);
215         _glColorPointer.bindFunc(&::glColorPointer);
216         _glTexCoordPointer.bindFunc(&::glTexCoordPointer);
217 
218         _glDrawArrays.bindFunc(&::glDrawArrays);
219         _glMultiDrawArrays.bindFunc(glMultiDrawArrays);
220         _glDrawElements.bindFunc(&::glDrawElements);
221         _glDrawRangeElements.bindFunc(glDrawRangeElements);
222         _glMultiDrawElements.bindFunc(glMultiDrawElements);
223 
224         _glCreateShader.bindFunc(glCreateShader);
225         _glDeleteShader.bindFunc(glDeleteShader);
226         _glShaderSource.bindFunc(glShaderSource);
227         _glCompileShader.bindFunc(glCompileShader);
228         _glGetShaderiv.bindFunc(glGetShaderiv);
229         _glGetShaderInfoLog.bindFunc(glGetShaderInfoLog);
230         _glAttachShader.bindFunc(glAttachShader);
231         _glDetachShader.bindFunc(glDetachShader);
232 
233         _glCreateProgram.bindFunc(glCreateProgram);
234         _glDeleteProgram.bindFunc(glDeleteProgram);
235         _glLinkProgram.bindFunc(glLinkProgram);
236         _glGetProgramiv.bindFunc(glGetProgramiv);
237         _glGetProgramInfoLog.bindFunc(glGetProgramInfoLog);
238         _glUseProgram.bindFunc(glUseProgram);
239 
240         _glUniform1f.bindFunc(glUniform1f);
241         _glUniform2f.bindFunc(glUniform2f);
242         _glUniform3f.bindFunc(glUniform3f);
243         _glUniform4f.bindFunc(glUniform4f);
244         _glUniform1i.bindFunc(glUniform1i);
245         _glUniform2i.bindFunc(glUniform2i);
246         _glUniform3i.bindFunc(glUniform3i);
247         _glUniform4i.bindFunc(glUniform4i);
248         _glUniform1ui.bindFunc(glUniform1ui);
249         _glUniform2ui.bindFunc(glUniform2ui);
250         _glUniform3ui.bindFunc(glUniform3ui);
251         _glUniform4ui.bindFunc(glUniform4ui);
252 
253         _glUniform1fv.bindFunc(glUniform1fv);
254         _glUniform2fv.bindFunc(glUniform2fv);
255         _glUniform3fv.bindFunc(glUniform3fv);
256         _glUniform4fv.bindFunc(glUniform4fv);
257         _glUniform1iv.bindFunc(glUniform1iv);
258         _glUniform2iv.bindFunc(glUniform2iv);
259         _glUniform3iv.bindFunc(glUniform3iv);
260         _glUniform4iv.bindFunc(glUniform4iv);
261         _glUniform1uiv.bindFunc(glUniform1uiv);
262         _glUniform2uiv.bindFunc(glUniform2uiv);
263         _glUniform3uiv.bindFunc(glUniform3uiv);
264         _glUniform4uiv.bindFunc(glUniform4uiv);
265 
266         _glUniformMatrix2fv.bindFunc(glUniformMatrix2fv);
267         _glUniformMatrix3fv.bindFunc(glUniformMatrix3fv);
268         _glUniformMatrix4fv.bindFunc(glUniformMatrix4fv);
269         _glUniformMatrix2x3fv.bindFunc(glUniformMatrix2x3fv);
270         _glUniformMatrix3x2fv.bindFunc(glUniformMatrix3x2fv);
271         _glUniformMatrix2x4fv.bindFunc(glUniformMatrix2x4fv);
272         _glUniformMatrix4x2fv.bindFunc(glUniformMatrix4x2fv);
273         _glUniformMatrix3x4fv.bindFunc(glUniformMatrix3x4fv);
274         _glUniformMatrix4x3fv.bindFunc(glUniformMatrix4x3fv);
275 
276         _glGetUniformLocation.bindFunc(glGetUniformLocation);
277 
278 #ifdef __APPLE__
279         _glFinishObjectAPPLE.bindFunc(glFinishObjectAPPLE);
280 #endif
281     }
282 
initializeGlew()283     static void initializeGlew() {
284         glewExperimental = GL_TRUE;
285         const GLenum glewState = glewInit();
286         if (glewState != GLEW_OK) {
287             RenderException e;
288             e << "Error initializing glew: " << glewGetErrorString(glewState);
289             throw e;
290         }
291 
292         static bool initialized = false;
293         if (!initialized) {
294             initRemainingFunctions();
295             initialized = true;
296         }
297     }
298 
initGLFunctions()299     void initGLFunctions() {
300       _glewInitialize.bindFunc(&initializeGlew);
301     }
302 }
303