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()126 bool 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()145 bool 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()174 bool 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()313 bool 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()344 bool 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()413 bool 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()423 bool 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