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