1 /************************************************************************************ 2 3 AstroMenace 4 Hardcore 3D space scroll-shooter with spaceship upgrade possibilities. 5 Copyright (c) 2006-2019 Mikhail Kurinnoi, Viewizard 6 7 8 AstroMenace is free software: you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation, either version 3 of the License, or 11 (at your option) any later version. 12 13 AstroMenace is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with AstroMenace. If not, see <https://www.gnu.org/licenses/>. 20 21 22 Website: https://viewizard.com/ 23 Project: https://github.com/viewizard/astromenace 24 E-mail: viewizard@viewizard.com 25 26 *************************************************************************************/ 27 28 #include "../base.h" 29 #include "opengl.h" 30 31 namespace viewizard { 32 33 // OpenGL 1.3 (only what we need or would need in future) 34 PFNGLACTIVETEXTUREPROC pfn_glActiveTexture{nullptr}; 35 PFNGLCLIENTACTIVETEXTUREPROC pfn_glClientActiveTexture{nullptr}; 36 37 // OpenGL 1.5 (only what we need or would need in future) 38 PFNGLBINDBUFFERPROC pfn_glBindBuffer{nullptr}; 39 PFNGLDELETEBUFFERSPROC pfn_glDeleteBuffers{nullptr}; 40 PFNGLGENBUFFERSPROC pfn_glGenBuffers{nullptr}; 41 PFNGLISBUFFERPROC pfn_glIsBuffer{nullptr}; 42 PFNGLBUFFERDATAPROC pfn_glBufferData{nullptr}; 43 44 // OpenGL 2.0 (only what we need or would need in future) 45 PFNGLATTACHSHADERPROC pfn_glAttachShader{nullptr}; 46 PFNGLBINDATTRIBLOCATIONPROC pfn_glBindAttribLocation{nullptr}; 47 PFNGLCOMPILESHADERPROC pfn_glCompileShader{nullptr}; 48 PFNGLCREATEPROGRAMPROC pfn_glCreateProgram{nullptr}; 49 PFNGLCREATESHADERPROC pfn_glCreateShader{nullptr}; 50 PFNGLDELETEPROGRAMPROC pfn_glDeleteProgram{nullptr}; 51 PFNGLDELETESHADERPROC pfn_glDeleteShader{nullptr}; 52 PFNGLDETACHSHADERPROC pfn_glDetachShader{nullptr}; 53 PFNGLGETACTIVEATTRIBPROC pfn_glGetActiveAttrib{nullptr}; 54 PFNGLGETACTIVEUNIFORMPROC pfn_glGetActiveUniform{nullptr}; 55 PFNGLGETATTACHEDSHADERSPROC pfn_glGetAttachedShaders{nullptr}; 56 PFNGLGETATTRIBLOCATIONPROC pfn_glGetAttribLocation{nullptr}; 57 PFNGLGETPROGRAMIVPROC pfn_glGetProgramiv{nullptr}; 58 PFNGLGETPROGRAMINFOLOGPROC pfn_glGetProgramInfoLog{nullptr}; 59 PFNGLGETSHADERIVPROC pfn_glGetShaderiv{nullptr}; 60 PFNGLGETSHADERINFOLOGPROC pfn_glGetShaderInfoLog{nullptr}; 61 PFNGLGETSHADERSOURCEPROC pfn_glGetShaderSource{nullptr}; 62 PFNGLGETUNIFORMLOCATIONPROC pfn_glGetUniformLocation{nullptr}; 63 PFNGLGETUNIFORMFVPROC pfn_glGetUniformfv{nullptr}; 64 PFNGLGETUNIFORMIVPROC pfn_glGetUniformiv{nullptr}; 65 PFNGLISPROGRAMPROC pfn_glIsProgram{nullptr}; 66 PFNGLISSHADERPROC pfn_glIsShader{nullptr}; 67 PFNGLLINKPROGRAMPROC pfn_glLinkProgram{nullptr}; 68 PFNGLSHADERSOURCEPROC pfn_glShaderSource{nullptr}; 69 PFNGLUSEPROGRAMPROC pfn_glUseProgram{nullptr}; 70 PFNGLUNIFORM1FPROC pfn_glUniform1f{nullptr}; 71 PFNGLUNIFORM2FPROC pfn_glUniform2f{nullptr}; 72 PFNGLUNIFORM3FPROC pfn_glUniform3f{nullptr}; 73 PFNGLUNIFORM4FPROC pfn_glUniform4f{nullptr}; 74 PFNGLUNIFORM1IPROC pfn_glUniform1i{nullptr}; 75 PFNGLUNIFORM2IPROC pfn_glUniform2i{nullptr}; 76 PFNGLUNIFORM3IPROC pfn_glUniform3i{nullptr}; 77 PFNGLUNIFORM4IPROC pfn_glUniform4i{nullptr}; 78 PFNGLUNIFORM1FVPROC pfn_glUniform1fv{nullptr}; 79 PFNGLUNIFORM2FVPROC pfn_glUniform2fv{nullptr}; 80 PFNGLUNIFORM3FVPROC pfn_glUniform3fv{nullptr}; 81 PFNGLUNIFORM4FVPROC pfn_glUniform4fv{nullptr}; 82 PFNGLUNIFORM1IVPROC pfn_glUniform1iv{nullptr}; 83 PFNGLUNIFORM2IVPROC pfn_glUniform2iv{nullptr}; 84 PFNGLUNIFORM3IVPROC pfn_glUniform3iv{nullptr}; 85 PFNGLUNIFORM4IVPROC pfn_glUniform4iv{nullptr}; 86 PFNGLVALIDATEPROGRAMPROC pfn_glValidateProgram{nullptr}; 87 88 // OpenGL 2.1 (only what we need or would need in future) 89 PFNGLUNIFORMMATRIX2X3FVPROC pfn_glUniformMatrix2x3fv{nullptr}; 90 PFNGLUNIFORMMATRIX3X2FVPROC pfn_glUniformMatrix3x2fv{nullptr}; 91 PFNGLUNIFORMMATRIX2X4FVPROC pfn_glUniformMatrix2x4fv{nullptr}; 92 PFNGLUNIFORMMATRIX4X2FVPROC pfn_glUniformMatrix4x2fv{nullptr}; 93 PFNGLUNIFORMMATRIX3X4FVPROC pfn_glUniformMatrix3x4fv{nullptr}; 94 PFNGLUNIFORMMATRIX4X3FVPROC pfn_glUniformMatrix4x3fv{nullptr}; 95 96 // OpenGL 3.0 (only what we need or would need in future) 97 PFNGLBINDRENDERBUFFERPROC pfn_glBindRenderbuffer{nullptr}; 98 PFNGLDELETERENDERBUFFERSPROC pfn_glDeleteRenderbuffers{nullptr}; 99 PFNGLGENRENDERBUFFERSPROC pfn_glGenRenderbuffers{nullptr}; 100 PFNGLISFRAMEBUFFERPROC pfn_glIsFramebuffer{nullptr}; 101 PFNGLBINDFRAMEBUFFERPROC pfn_glBindFramebuffer{nullptr}; 102 PFNGLDELETEFRAMEBUFFERSPROC pfn_glDeleteFramebuffers{nullptr}; 103 PFNGLGENFRAMEBUFFERSPROC pfn_glGenFramebuffers{nullptr}; 104 PFNGLCHECKFRAMEBUFFERSTATUSPROC pfn_glCheckFramebufferStatus{nullptr}; 105 PFNGLFRAMEBUFFERTEXTURE2DPROC pfn_glFramebufferTexture2D{nullptr}; 106 PFNGLFRAMEBUFFERRENDERBUFFERPROC pfn_glFramebufferRenderbuffer{nullptr}; 107 PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC pfn_glGetFramebufferAttachmentParameteriv{nullptr}; 108 PFNGLGENERATEMIPMAPPROC pfn_glGenerateMipmap{nullptr}; 109 PFNGLBLITFRAMEBUFFERPROC pfn_glBlitFramebuffer{nullptr}; 110 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC pfn_glRenderbufferStorageMultisample{nullptr}; 111 PFNGLBINDVERTEXARRAYPROC pfn_glBindVertexArray{nullptr}; 112 PFNGLDELETEVERTEXARRAYSPROC pfn_glDeleteVertexArrays{nullptr}; 113 PFNGLGENVERTEXARRAYSPROC pfn_glGenVertexArrays{nullptr}; 114 PFNGLISVERTEXARRAYPROC pfn_glIsVertexArray{nullptr}; 115 116 // OpenGL 4.2 (only what we need or would need in future) 117 PFNGLTEXSTORAGE2DPROC pfn_glTexStorage2D{nullptr}; 118 119 // GL_NV_framebuffer_multisample_coverage 120 PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC pfn_glRenderbufferStorageMultisampleCoverageNV{nullptr}; 121 122 123 /* 124 * OpenGL 1.3 initialization (only what we need or would need in future). 125 */ Initialize_OpenGL_1_3()126bool Initialize_OpenGL_1_3() 127 { 128 pfn_glActiveTexture = (PFNGLACTIVETEXTUREPROC) SDL_GL_GetProcAddress("glActiveTexture"); 129 pfn_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) SDL_GL_GetProcAddress("glClientActiveTexture"); 130 131 if (!pfn_glActiveTexture || 132 !pfn_glClientActiveTexture) { 133 pfn_glActiveTexture = nullptr; 134 pfn_glClientActiveTexture = nullptr; 135 136 return false; 137 } 138 139 return true; 140 } 141 142 /* 143 * OpenGL 1.5 initialization (only what we need or would need in future). 144 */ Initialize_OpenGL_1_5()145bool Initialize_OpenGL_1_5() 146 { 147 // get pointers to the GL functions 148 pfn_glBindBuffer = (PFNGLBINDBUFFERPROC) SDL_GL_GetProcAddress("glBindBuffer"); 149 pfn_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) SDL_GL_GetProcAddress("glDeleteBuffers"); 150 pfn_glGenBuffers = (PFNGLGENBUFFERSPROC) SDL_GL_GetProcAddress("glGenBuffers"); 151 pfn_glIsBuffer = (PFNGLISBUFFERPROC) SDL_GL_GetProcAddress("glIsBuffer"); 152 pfn_glBufferData = (PFNGLBUFFERDATAPROC) SDL_GL_GetProcAddress("glBufferData"); 153 154 if (!pfn_glBindBuffer || 155 !pfn_glDeleteBuffers || 156 !pfn_glGenBuffers || 157 !pfn_glIsBuffer || 158 !pfn_glBufferData) { 159 pfn_glBindBuffer = nullptr; 160 pfn_glDeleteBuffers = nullptr; 161 pfn_glGenBuffers = nullptr; 162 pfn_glIsBuffer = nullptr; 163 pfn_glBufferData = nullptr; 164 165 return false; 166 } 167 168 return true; 169 } 170 171 /* 172 * OpenGL 2.0 initialization (only what we need or would need in future). 173 */ Initialize_OpenGL_2_0()174bool Initialize_OpenGL_2_0() 175 { 176 pfn_glAttachShader = (PFNGLATTACHSHADERPROC) SDL_GL_GetProcAddress("glAttachShader"); 177 pfn_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) SDL_GL_GetProcAddress("glBindAttribLocation"); 178 pfn_glCompileShader = (PFNGLCOMPILESHADERPROC) SDL_GL_GetProcAddress("glCompileShader"); 179 pfn_glCreateProgram = (PFNGLCREATEPROGRAMPROC) SDL_GL_GetProcAddress("glCreateProgram"); 180 pfn_glCreateShader = (PFNGLCREATESHADERPROC) SDL_GL_GetProcAddress("glCreateShader"); 181 pfn_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) SDL_GL_GetProcAddress("glDeleteProgram"); 182 pfn_glDeleteShader = (PFNGLDELETESHADERPROC) SDL_GL_GetProcAddress("glDeleteShader"); 183 pfn_glDetachShader = (PFNGLDETACHSHADERPROC) SDL_GL_GetProcAddress("glDetachShader"); 184 pfn_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) SDL_GL_GetProcAddress("glGetActiveAttrib"); 185 pfn_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) SDL_GL_GetProcAddress("glGetActiveUniform"); 186 pfn_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) SDL_GL_GetProcAddress("glGetAttachedShaders"); 187 pfn_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) SDL_GL_GetProcAddress("glGetAttribLocation"); 188 pfn_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) SDL_GL_GetProcAddress("glGetProgramiv"); 189 pfn_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) SDL_GL_GetProcAddress("glGetProgramInfoLog"); 190 pfn_glGetShaderiv = (PFNGLGETSHADERIVPROC) SDL_GL_GetProcAddress("glGetShaderiv"); 191 pfn_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) SDL_GL_GetProcAddress("glGetShaderInfoLog"); 192 pfn_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) SDL_GL_GetProcAddress("glGetShaderSource"); 193 pfn_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) SDL_GL_GetProcAddress("glGetUniformLocation"); 194 pfn_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) SDL_GL_GetProcAddress("glGetUniformfv"); 195 pfn_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) SDL_GL_GetProcAddress("glGetUniformiv"); 196 pfn_glIsProgram = (PFNGLISPROGRAMPROC) SDL_GL_GetProcAddress("glIsProgram"); 197 pfn_glIsShader = (PFNGLISSHADERPROC) SDL_GL_GetProcAddress("glIsShader"); 198 pfn_glLinkProgram = (PFNGLLINKPROGRAMPROC) SDL_GL_GetProcAddress("glLinkProgram"); 199 pfn_glShaderSource = (PFNGLSHADERSOURCEPROC) SDL_GL_GetProcAddress("glShaderSource"); 200 pfn_glUseProgram = (PFNGLUSEPROGRAMPROC) SDL_GL_GetProcAddress("glUseProgram"); 201 pfn_glUniform1f = (PFNGLUNIFORM1FPROC) SDL_GL_GetProcAddress("glUniform1f"); 202 pfn_glUniform2f = (PFNGLUNIFORM2FPROC) SDL_GL_GetProcAddress("glUniform2f"); 203 pfn_glUniform3f = (PFNGLUNIFORM3FPROC) SDL_GL_GetProcAddress("glUniform3f"); 204 pfn_glUniform4f = (PFNGLUNIFORM4FPROC) SDL_GL_GetProcAddress("glUniform4f"); 205 pfn_glUniform1i = (PFNGLUNIFORM1IPROC) SDL_GL_GetProcAddress("glUniform1i"); 206 pfn_glUniform2i = (PFNGLUNIFORM2IPROC) SDL_GL_GetProcAddress("glUniform2i"); 207 pfn_glUniform3i = (PFNGLUNIFORM3IPROC) SDL_GL_GetProcAddress("glUniform3i"); 208 pfn_glUniform4i = (PFNGLUNIFORM4IPROC) SDL_GL_GetProcAddress("glUniform4i"); 209 pfn_glUniform1fv = (PFNGLUNIFORM1FVPROC) SDL_GL_GetProcAddress("glUniform1fv"); 210 pfn_glUniform2fv = (PFNGLUNIFORM2FVPROC) SDL_GL_GetProcAddress("glUniform2fv"); 211 pfn_glUniform3fv = (PFNGLUNIFORM3FVPROC) SDL_GL_GetProcAddress("glUniform3fv"); 212 pfn_glUniform4fv = (PFNGLUNIFORM4FVPROC) SDL_GL_GetProcAddress("glUniform4fv"); 213 pfn_glUniform1iv = (PFNGLUNIFORM1IVPROC) SDL_GL_GetProcAddress("glUniform1iv"); 214 pfn_glUniform2iv = (PFNGLUNIFORM2IVPROC) SDL_GL_GetProcAddress("glUniform2iv"); 215 pfn_glUniform3iv = (PFNGLUNIFORM3IVPROC) SDL_GL_GetProcAddress("glUniform3iv"); 216 pfn_glUniform4iv = (PFNGLUNIFORM4IVPROC) SDL_GL_GetProcAddress("glUniform4iv"); 217 pfn_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) SDL_GL_GetProcAddress("glValidateProgram"); 218 219 if (!pfn_glAttachShader || 220 !pfn_glBindAttribLocation || 221 !pfn_glCompileShader || 222 !pfn_glCreateProgram || 223 !pfn_glCreateShader || 224 !pfn_glDeleteProgram || 225 !pfn_glDeleteShader || 226 !pfn_glDetachShader || 227 !pfn_glGetActiveAttrib || 228 !pfn_glGetActiveUniform || 229 !pfn_glGetAttachedShaders || 230 !pfn_glGetAttribLocation || 231 !pfn_glGetProgramiv || 232 !pfn_glGetProgramInfoLog || 233 !pfn_glGetShaderiv || 234 !pfn_glGetShaderInfoLog || 235 !pfn_glGetShaderSource || 236 !pfn_glGetUniformLocation || 237 !pfn_glGetUniformfv || 238 !pfn_glGetUniformiv || 239 !pfn_glIsProgram || 240 !pfn_glIsShader || 241 !pfn_glLinkProgram || 242 !pfn_glShaderSource || 243 !pfn_glUseProgram || 244 !pfn_glUniform1f || 245 !pfn_glUniform2f || 246 !pfn_glUniform3f || 247 !pfn_glUniform4f || 248 !pfn_glUniform1i || 249 !pfn_glUniform2i || 250 !pfn_glUniform3i || 251 !pfn_glUniform4i || 252 !pfn_glUniform1fv || 253 !pfn_glUniform2fv || 254 !pfn_glUniform3fv || 255 !pfn_glUniform4fv || 256 !pfn_glUniform1iv || 257 !pfn_glUniform2iv || 258 !pfn_glUniform3iv || 259 !pfn_glUniform4iv || 260 !pfn_glValidateProgram) { 261 pfn_glAttachShader = nullptr; 262 pfn_glBindAttribLocation = nullptr; 263 pfn_glCompileShader = nullptr; 264 pfn_glCreateProgram = nullptr; 265 pfn_glCreateShader = nullptr; 266 pfn_glDeleteProgram = nullptr; 267 pfn_glDeleteShader = nullptr; 268 pfn_glDetachShader = nullptr; 269 pfn_glGetActiveAttrib = nullptr; 270 pfn_glGetActiveUniform = nullptr; 271 pfn_glGetAttachedShaders = nullptr; 272 pfn_glGetAttribLocation = nullptr; 273 pfn_glGetProgramiv = nullptr; 274 pfn_glGetProgramInfoLog = nullptr; 275 pfn_glGetShaderiv = nullptr; 276 pfn_glGetShaderInfoLog = nullptr; 277 pfn_glGetShaderSource = nullptr; 278 pfn_glGetUniformLocation = nullptr; 279 pfn_glGetUniformfv = nullptr; 280 pfn_glGetUniformiv = nullptr; 281 pfn_glIsProgram = nullptr; 282 pfn_glIsShader = nullptr; 283 pfn_glLinkProgram = nullptr; 284 pfn_glShaderSource = nullptr; 285 pfn_glUseProgram = nullptr; 286 pfn_glUniform1f = nullptr; 287 pfn_glUniform2f = nullptr; 288 pfn_glUniform3f = nullptr; 289 pfn_glUniform4f = nullptr; 290 pfn_glUniform1i = nullptr; 291 pfn_glUniform2i = nullptr; 292 pfn_glUniform3i = nullptr; 293 pfn_glUniform4i = nullptr; 294 pfn_glUniform1fv = nullptr; 295 pfn_glUniform2fv = nullptr; 296 pfn_glUniform3fv = nullptr; 297 pfn_glUniform4fv = nullptr; 298 pfn_glUniform1iv = nullptr; 299 pfn_glUniform2iv = nullptr; 300 pfn_glUniform3iv = nullptr; 301 pfn_glUniform4iv = nullptr; 302 pfn_glValidateProgram = nullptr; 303 304 return false; 305 } 306 307 return true; 308 } 309 310 /* 311 * OpenGL 2.1 initialization (only what we need or would need in future). 312 */ Initialize_OpenGL_2_1()313bool Initialize_OpenGL_2_1() 314 { 315 pfn_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) SDL_GL_GetProcAddress("glUniformMatrix2x3fv"); 316 pfn_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) SDL_GL_GetProcAddress("glUniformMatrix3x2fv"); 317 pfn_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) SDL_GL_GetProcAddress("glUniformMatrix2x4fv"); 318 pfn_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) SDL_GL_GetProcAddress("glUniformMatrix4x2fv"); 319 pfn_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) SDL_GL_GetProcAddress("glUniformMatrix3x4fv"); 320 pfn_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) SDL_GL_GetProcAddress("glUniformMatrix4x3fv"); 321 322 if (!pfn_glUniformMatrix2x3fv || 323 !pfn_glUniformMatrix3x2fv || 324 !pfn_glUniformMatrix2x4fv || 325 !pfn_glUniformMatrix4x2fv || 326 !pfn_glUniformMatrix3x4fv || 327 !pfn_glUniformMatrix4x3fv) { 328 pfn_glUniformMatrix2x3fv = nullptr; 329 pfn_glUniformMatrix3x2fv = nullptr; 330 pfn_glUniformMatrix2x4fv = nullptr; 331 pfn_glUniformMatrix4x2fv = nullptr; 332 pfn_glUniformMatrix3x4fv = nullptr; 333 pfn_glUniformMatrix4x3fv = nullptr; 334 335 return false; 336 } 337 338 return true; 339 } 340 341 /* 342 * OpenGL 3.0 initialization (only what we need or would need in future). 343 */ Initialize_OpenGL_3_0()344bool Initialize_OpenGL_3_0() 345 { 346 pfn_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) SDL_GL_GetProcAddress("glBindRenderbuffer"); 347 pfn_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) SDL_GL_GetProcAddress("glDeleteRenderbuffers"); 348 pfn_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) SDL_GL_GetProcAddress("glGenRenderbuffers"); 349 pfn_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) SDL_GL_GetProcAddress("glIsFramebuffer"); 350 pfn_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) SDL_GL_GetProcAddress("glBindFramebuffer"); 351 pfn_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) SDL_GL_GetProcAddress("glDeleteFramebuffers"); 352 pfn_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) SDL_GL_GetProcAddress("glGenFramebuffers"); 353 pfn_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) SDL_GL_GetProcAddress("glCheckFramebufferStatus"); 354 pfn_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) SDL_GL_GetProcAddress("glFramebufferTexture2D"); 355 pfn_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) SDL_GL_GetProcAddress("glFramebufferRenderbuffer"); 356 pfn_glGetFramebufferAttachmentParameteriv = 357 (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameteriv"); 358 pfn_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) SDL_GL_GetProcAddress("glGenerateMipmap"); 359 pfn_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) SDL_GL_GetProcAddress("glBlitFramebuffer"); 360 pfn_glRenderbufferStorageMultisample = 361 (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) SDL_GL_GetProcAddress("glRenderbufferStorageMultisample"); 362 pfn_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) SDL_GL_GetProcAddress("glBindVertexArray"); 363 pfn_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glDeleteVertexArrays"); 364 pfn_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glGenVertexArrays"); 365 pfn_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) SDL_GL_GetProcAddress("glIsVertexArray"); 366 367 if (!pfn_glBindRenderbuffer || 368 !pfn_glDeleteRenderbuffers || 369 !pfn_glGenRenderbuffers || 370 !pfn_glIsFramebuffer || 371 !pfn_glBindFramebuffer || 372 !pfn_glDeleteFramebuffers || 373 !pfn_glGenFramebuffers || 374 !pfn_glCheckFramebufferStatus || 375 !pfn_glFramebufferTexture2D || 376 !pfn_glFramebufferRenderbuffer || 377 !pfn_glGetFramebufferAttachmentParameteriv || 378 !pfn_glGenerateMipmap || 379 !pfn_glBlitFramebuffer || 380 !pfn_glRenderbufferStorageMultisample || 381 !pfn_glBindVertexArray || 382 !pfn_glDeleteVertexArrays || 383 !pfn_glGenVertexArrays || 384 !pfn_glIsVertexArray) { 385 pfn_glBindRenderbuffer = nullptr; 386 pfn_glDeleteRenderbuffers = nullptr; 387 pfn_glGenRenderbuffers = nullptr; 388 pfn_glIsFramebuffer = nullptr; 389 pfn_glBindFramebuffer = nullptr; 390 pfn_glDeleteFramebuffers = nullptr; 391 pfn_glGenFramebuffers = nullptr; 392 pfn_glCheckFramebufferStatus = nullptr; 393 pfn_glFramebufferTexture2D = nullptr; 394 pfn_glFramebufferRenderbuffer = nullptr; 395 pfn_glGetFramebufferAttachmentParameteriv = nullptr; 396 pfn_glGenerateMipmap = nullptr; 397 pfn_glBlitFramebuffer = nullptr; 398 pfn_glRenderbufferStorageMultisample = nullptr; 399 pfn_glBindVertexArray = nullptr; 400 pfn_glDeleteVertexArrays = nullptr; 401 pfn_glGenVertexArrays = nullptr; 402 pfn_glIsVertexArray = nullptr; 403 404 return false; 405 } 406 407 return true; 408 } 409 410 /* 411 * OpenGL 4.2 initialization (only what we need or would need in future). 412 */ Initialize_OpenGL_4_2()413bool Initialize_OpenGL_4_2() 414 { 415 pfn_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) SDL_GL_GetProcAddress("glTexStorage2D"); 416 417 return pfn_glTexStorage2D; 418 } 419 420 /* 421 * GL_NV_framebuffer_multisample_coverage initialization. 422 */ Initialize_GL_NV_framebuffer_multisample_coverage()423bool Initialize_GL_NV_framebuffer_multisample_coverage() 424 { 425 pfn_glRenderbufferStorageMultisampleCoverageNV = 426 (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) 427 SDL_GL_GetProcAddress("glRenderbufferStorageMultisampleCoverageNV"); 428 429 return pfn_glRenderbufferStorageMultisampleCoverageNV; 430 } 431 432 } // viewizard namespace 433