]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/qgl.cpp
[q3map2] Unwind script stack in case of script loading error.
[xonotic/netradiant.git] / radiant / qgl.cpp
1 /*
2    Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3    For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22
23 #include "qgl.h"
24 #include "globaldefs.h"
25
26 #include "debugging/debugging.h"
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31
32 #if GDEF_OS_WINDOWS
33                                                                                                                         #define WINGDIAPI __declspec( dllimport )
34 #define APIENTRY __stdcall
35 #endif
36
37 #if GDEF_OS_MACOS && !defined( XWINDOWS )
38 #include <OpenGL/gl.h>
39 #else
40
41 #include <GL/gl.h>
42
43 #endif
44
45 #if GDEF_OS_WINDOWS
46                                                                                                                         #undef WINGDIAPI
47 #undef APIENTRY
48 #endif
49
50 #include "igl.h"
51
52
53 #if GDEF_OS_WINDOWS
54
55                                                                                                                         #include <wtypes.h>
56
57 PROC ( WINAPI * qwglGetProcAddress )( LPCSTR );
58
59 #elif defined ( XWINDOWS )
60
61 #include <GL/glx.h>
62 #include <dlfcn.h>
63
64 Bool ( *qglXQueryExtension )(Display *dpy, int *errorb, int *event);
65
66 void *( *qglXGetProcAddressARB )(const GLubyte *procName);
67
68 typedef void *( *glXGetProcAddressARBProc )(const GLubyte *procName);
69
70 #elif GDEF_OS_MACOS
71                                                                                                                         #include <mach-o/dyld.h>
72 #include <stdlib.h>
73 #include <string.h>
74 #else
75 #error "unsupported platform"
76 #endif
77
78
79 void QGL_Shutdown(OpenGLBinding &table)
80 {
81     globalOutputStream() << "Shutting down OpenGL module...";
82
83 #if GDEF_OS_WINDOWS
84     qwglGetProcAddress           = 0;
85 #elif defined( XWINDOWS )
86     qglXQueryExtension = glXQueryExtension;
87     qglXGetProcAddressARB = 0;
88 #elif GDEF_OS_MACOS
89                                                                                                                             #else
90 #error "unsupported platform"
91 #endif
92
93     globalOutputStream() << "Done.\n";
94 }
95
96
97 typedef struct glu_error_struct {
98     GLenum errnum;
99     const char *errstr;
100 } GLU_ERROR_STRUCT;
101
102 GLU_ERROR_STRUCT glu_errlist[] = {
103         {GL_NO_ERROR,          "GL_NO_ERROR - no error"},
104         {GL_INVALID_ENUM,      "GL_INVALID_ENUM - An unacceptable value is specified for an enumerated argument."},
105         {GL_INVALID_VALUE,     "GL_INVALID_VALUE - A numeric argument is out of range."},
106         {GL_INVALID_OPERATION, "GL_INVALID_OPERATION - The specified operation is not allowed in the current state."},
107         {GL_STACK_OVERFLOW,    "GL_STACK_OVERFLOW - Function would cause a stack overflow."},
108         {GL_STACK_UNDERFLOW,   "GL_STACK_UNDERFLOW - Function would cause a stack underflow."},
109         {GL_OUT_OF_MEMORY,     "GL_OUT_OF_MEMORY - There is not enough memory left to execute the function."},
110         {0,                    0}
111 };
112
113 const GLubyte *qgluErrorString(GLenum errCode)
114 {
115     int search = 0;
116     for (search = 0; glu_errlist[search].errstr; search++) {
117         if (errCode == glu_errlist[search].errnum) {
118             return (const GLubyte *) glu_errlist[search].errstr;
119         }
120     } //end for
121     return (const GLubyte *) "Unknown error";
122 }
123
124
125 void glInvalidFunction()
126 {
127     ERROR_MESSAGE("calling an invalid OpenGL function");
128 }
129
130 #define EXTENSIONS_ENABLED 1
131
132 bool QGL_ExtensionSupported(const char *extension)
133 {
134 #if EXTENSIONS_ENABLED
135     const GLubyte *extensions = 0;
136     const GLubyte *start;
137     GLubyte *where, *terminator;
138
139     // Extension names should not have spaces.
140     where = (GLubyte *) strchr(extension, ' ');
141     if (where || *extension == '\0') {
142         return false;
143     }
144
145     extensions = GlobalOpenGL().m_glGetString(GL_EXTENSIONS);
146 #if !GDEF_OS_MACOS
147     if (!extensions) {
148         return false;
149     }
150 #endif
151
152     // It takes a bit of care to be fool-proof about parsing the
153     // OpenGL extensions string. Don't be fooled by sub-strings, etc.
154     for (start = extensions;;) {
155         where = (GLubyte *) strstr((const char *) start, extension);
156         if (!where) {
157             break;
158         }
159
160         terminator = where + strlen(extension);
161         if (where == start || *(where - 1) == ' ') {
162             if (*terminator == ' ' || *terminator == '\0') {
163                 return true;
164             }
165         }
166
167         start = terminator;
168     }
169 #endif
170
171     return false;
172 }
173
174 typedef int ( QGL_DLLEXPORT *QGLFunctionPointer )();
175
176 QGLFunctionPointer QGL_getExtensionFunc(const char *symbol)
177 {
178 #if defined( XWINDOWS )
179     //ASSERT_NOTNULL(qglXGetProcAddressARB);
180     if (qglXGetProcAddressARB == 0) {
181         return reinterpret_cast<QGLFunctionPointer>( glInvalidFunction );
182     } else {
183         return (QGLFunctionPointer) qglXGetProcAddressARB(reinterpret_cast<const GLubyte *>( symbol ));
184     }
185 #elif GDEF_OS_MACOS
186                                                                                                                             // Prepend a '_' for the Unix C symbol mangling convention
187         char *symbolName = (char *) malloc(strlen(symbol) + 2);
188         strcpy(symbolName + 1, symbol);
189         symbolName[0] = '_';
190         NSSymbol nssymbol = NULL;
191         if (NSIsSymbolNameDefined(symbolName)) nssymbol = NSLookupAndBindSymbol(symbolName);
192         free(symbolName);
193     return nssymbol ? reinterpret_cast<QGLFunctionPointer>(NSAddressOfSymbol(nssymbol)) : reinterpret_cast<QGLFunctionPointer>(glInvalidFunction);
194 #elif GDEF_OS_WINDOWS
195         ASSERT_NOTNULL( qwglGetProcAddress );
196         return (QGLFunctionPointer) qwglGetProcAddress( symbol );
197 #else
198 #error "unsupported platform"
199 #endif
200 }
201
202
203 template<typename Func>
204 bool QGL_constructExtensionFunc(Func &func, const char *symbol)
205 {
206     func = reinterpret_cast<Func>( QGL_getExtensionFunc(symbol));
207     return func != 0;
208 }
209
210 template<typename Func>
211 void QGL_invalidateExtensionFunc(Func &func)
212 {
213     func = reinterpret_cast<Func>( glInvalidFunction );
214 }
215
216 void QGL_clear(OpenGLBinding &table)
217 {
218     QGL_invalidateExtensionFunc(table.m_glAccum);
219     QGL_invalidateExtensionFunc(table.m_glAlphaFunc);
220     QGL_invalidateExtensionFunc(table.m_glAreTexturesResident);
221     QGL_invalidateExtensionFunc(table.m_glArrayElement);
222     QGL_invalidateExtensionFunc(table.m_glBegin);
223     QGL_invalidateExtensionFunc(table.m_glBindTexture);
224     QGL_invalidateExtensionFunc(table.m_glBitmap);
225     QGL_invalidateExtensionFunc(table.m_glBlendFunc);
226     QGL_invalidateExtensionFunc(table.m_glCallList);
227     QGL_invalidateExtensionFunc(table.m_glCallLists);
228     QGL_invalidateExtensionFunc(table.m_glClear);
229     QGL_invalidateExtensionFunc(table.m_glClearAccum);
230     QGL_invalidateExtensionFunc(table.m_glClearColor);
231     QGL_invalidateExtensionFunc(table.m_glClearDepth);
232     QGL_invalidateExtensionFunc(table.m_glClearIndex);
233     QGL_invalidateExtensionFunc(table.m_glClearStencil);
234     QGL_invalidateExtensionFunc(table.m_glClipPlane);
235     QGL_invalidateExtensionFunc(table.m_glColor3b);
236     QGL_invalidateExtensionFunc(table.m_glColor3bv);
237     QGL_invalidateExtensionFunc(table.m_glColor3d);
238     QGL_invalidateExtensionFunc(table.m_glColor3dv);
239     QGL_invalidateExtensionFunc(table.m_glColor3f);
240     QGL_invalidateExtensionFunc(table.m_glColor3fv);
241     QGL_invalidateExtensionFunc(table.m_glColor3i);
242     QGL_invalidateExtensionFunc(table.m_glColor3iv);
243     QGL_invalidateExtensionFunc(table.m_glColor3s);
244     QGL_invalidateExtensionFunc(table.m_glColor3sv);
245     QGL_invalidateExtensionFunc(table.m_glColor3ub);
246     QGL_invalidateExtensionFunc(table.m_glColor3ubv);
247     QGL_invalidateExtensionFunc(table.m_glColor3ui);
248     QGL_invalidateExtensionFunc(table.m_glColor3uiv);
249     QGL_invalidateExtensionFunc(table.m_glColor3us);
250     QGL_invalidateExtensionFunc(table.m_glColor3usv);
251     QGL_invalidateExtensionFunc(table.m_glColor4b);
252     QGL_invalidateExtensionFunc(table.m_glColor4bv);
253     QGL_invalidateExtensionFunc(table.m_glColor4d);
254     QGL_invalidateExtensionFunc(table.m_glColor4dv);
255     QGL_invalidateExtensionFunc(table.m_glColor4f);
256     QGL_invalidateExtensionFunc(table.m_glColor4fv);
257     QGL_invalidateExtensionFunc(table.m_glColor4i);
258     QGL_invalidateExtensionFunc(table.m_glColor4iv);
259     QGL_invalidateExtensionFunc(table.m_glColor4s);
260     QGL_invalidateExtensionFunc(table.m_glColor4sv);
261     QGL_invalidateExtensionFunc(table.m_glColor4ub);
262     QGL_invalidateExtensionFunc(table.m_glColor4ubv);
263     QGL_invalidateExtensionFunc(table.m_glColor4ui);
264     QGL_invalidateExtensionFunc(table.m_glColor4uiv);
265     QGL_invalidateExtensionFunc(table.m_glColor4us);
266     QGL_invalidateExtensionFunc(table.m_glColor4usv);
267     QGL_invalidateExtensionFunc(table.m_glColorMask);
268     QGL_invalidateExtensionFunc(table.m_glColorMaterial);
269     QGL_invalidateExtensionFunc(table.m_glColorPointer);
270     QGL_invalidateExtensionFunc(table.m_glCopyPixels);
271     QGL_invalidateExtensionFunc(table.m_glCopyTexImage1D);
272     QGL_invalidateExtensionFunc(table.m_glCopyTexImage2D);
273     QGL_invalidateExtensionFunc(table.m_glCopyTexSubImage1D);
274     QGL_invalidateExtensionFunc(table.m_glCopyTexSubImage2D);
275     QGL_invalidateExtensionFunc(table.m_glCullFace);
276     QGL_invalidateExtensionFunc(table.m_glDeleteLists);
277     QGL_invalidateExtensionFunc(table.m_glDeleteTextures);
278     QGL_invalidateExtensionFunc(table.m_glDepthFunc);
279     QGL_invalidateExtensionFunc(table.m_glDepthMask);
280     QGL_invalidateExtensionFunc(table.m_glDepthRange);
281     QGL_invalidateExtensionFunc(table.m_glDisable);
282     QGL_invalidateExtensionFunc(table.m_glDisableClientState);
283     QGL_invalidateExtensionFunc(table.m_glDrawArrays);
284     QGL_invalidateExtensionFunc(table.m_glDrawBuffer);
285     QGL_invalidateExtensionFunc(table.m_glDrawElements);
286     QGL_invalidateExtensionFunc(table.m_glDrawPixels);
287     QGL_invalidateExtensionFunc(table.m_glEdgeFlag);
288     QGL_invalidateExtensionFunc(table.m_glEdgeFlagPointer);
289     QGL_invalidateExtensionFunc(table.m_glEdgeFlagv);
290     QGL_invalidateExtensionFunc(table.m_glEnable);
291     QGL_invalidateExtensionFunc(table.m_glEnableClientState);
292     QGL_invalidateExtensionFunc(table.m_glEnd);
293     QGL_invalidateExtensionFunc(table.m_glEndList);
294     QGL_invalidateExtensionFunc(table.m_glEvalCoord1d);
295     QGL_invalidateExtensionFunc(table.m_glEvalCoord1dv);
296     QGL_invalidateExtensionFunc(table.m_glEvalCoord1f);
297     QGL_invalidateExtensionFunc(table.m_glEvalCoord1fv);
298     QGL_invalidateExtensionFunc(table.m_glEvalCoord2d);
299     QGL_invalidateExtensionFunc(table.m_glEvalCoord2dv);
300     QGL_invalidateExtensionFunc(table.m_glEvalCoord2f);
301     QGL_invalidateExtensionFunc(table.m_glEvalCoord2fv);
302     QGL_invalidateExtensionFunc(table.m_glEvalMesh1);
303     QGL_invalidateExtensionFunc(table.m_glEvalMesh2);
304     QGL_invalidateExtensionFunc(table.m_glEvalPoint1);
305     QGL_invalidateExtensionFunc(table.m_glEvalPoint2);
306     QGL_invalidateExtensionFunc(table.m_glFeedbackBuffer);
307     QGL_invalidateExtensionFunc(table.m_glFinish);
308     QGL_invalidateExtensionFunc(table.m_glFlush);
309     QGL_invalidateExtensionFunc(table.m_glFogf);
310     QGL_invalidateExtensionFunc(table.m_glFogfv);
311     QGL_invalidateExtensionFunc(table.m_glFogi);
312     QGL_invalidateExtensionFunc(table.m_glFogiv);
313     QGL_invalidateExtensionFunc(table.m_glFrontFace);
314     QGL_invalidateExtensionFunc(table.m_glFrustum);
315     QGL_invalidateExtensionFunc(table.m_glGenLists);
316     QGL_invalidateExtensionFunc(table.m_glGenTextures);
317     QGL_invalidateExtensionFunc(table.m_glGetBooleanv);
318     QGL_invalidateExtensionFunc(table.m_glGetClipPlane);
319     QGL_invalidateExtensionFunc(table.m_glGetDoublev);
320     QGL_invalidateExtensionFunc(table.m_glGetError);
321     QGL_invalidateExtensionFunc(table.m_glGetFloatv);
322     QGL_invalidateExtensionFunc(table.m_glGetIntegerv);
323     QGL_invalidateExtensionFunc(table.m_glGetLightfv);
324     QGL_invalidateExtensionFunc(table.m_glGetLightiv);
325     QGL_invalidateExtensionFunc(table.m_glGetMapdv);
326     QGL_invalidateExtensionFunc(table.m_glGetMapfv);
327     QGL_invalidateExtensionFunc(table.m_glGetMapiv);
328     QGL_invalidateExtensionFunc(table.m_glGetMaterialfv);
329     QGL_invalidateExtensionFunc(table.m_glGetMaterialiv);
330     QGL_invalidateExtensionFunc(table.m_glGetPixelMapfv);
331     QGL_invalidateExtensionFunc(table.m_glGetPixelMapuiv);
332     QGL_invalidateExtensionFunc(table.m_glGetPixelMapusv);
333     QGL_invalidateExtensionFunc(table.m_glGetPointerv);
334     QGL_invalidateExtensionFunc(table.m_glGetPolygonStipple);
335     table.m_glGetString = glGetString;
336     QGL_invalidateExtensionFunc(table.m_glGetTexEnvfv);
337     QGL_invalidateExtensionFunc(table.m_glGetTexEnviv);
338     QGL_invalidateExtensionFunc(table.m_glGetTexGendv);
339     QGL_invalidateExtensionFunc(table.m_glGetTexGenfv);
340     QGL_invalidateExtensionFunc(table.m_glGetTexGeniv);
341     QGL_invalidateExtensionFunc(table.m_glGetTexImage);
342     QGL_invalidateExtensionFunc(table.m_glGetTexLevelParameterfv);
343     QGL_invalidateExtensionFunc(table.m_glGetTexLevelParameteriv);
344     QGL_invalidateExtensionFunc(table.m_glGetTexParameterfv);
345     QGL_invalidateExtensionFunc(table.m_glGetTexParameteriv);
346     QGL_invalidateExtensionFunc(table.m_glHint);
347     QGL_invalidateExtensionFunc(table.m_glIndexMask);
348     QGL_invalidateExtensionFunc(table.m_glIndexPointer);
349     QGL_invalidateExtensionFunc(table.m_glIndexd);
350     QGL_invalidateExtensionFunc(table.m_glIndexdv);
351     QGL_invalidateExtensionFunc(table.m_glIndexf);
352     QGL_invalidateExtensionFunc(table.m_glIndexfv);
353     QGL_invalidateExtensionFunc(table.m_glIndexi);
354     QGL_invalidateExtensionFunc(table.m_glIndexiv);
355     QGL_invalidateExtensionFunc(table.m_glIndexs);
356     QGL_invalidateExtensionFunc(table.m_glIndexsv);
357     QGL_invalidateExtensionFunc(table.m_glIndexub);
358     QGL_invalidateExtensionFunc(table.m_glIndexubv);
359     QGL_invalidateExtensionFunc(table.m_glInitNames);
360     QGL_invalidateExtensionFunc(table.m_glInterleavedArrays);
361     QGL_invalidateExtensionFunc(table.m_glIsEnabled);
362     QGL_invalidateExtensionFunc(table.m_glIsList);
363     QGL_invalidateExtensionFunc(table.m_glIsTexture);
364     QGL_invalidateExtensionFunc(table.m_glLightModelf);
365     QGL_invalidateExtensionFunc(table.m_glLightModelfv);
366     QGL_invalidateExtensionFunc(table.m_glLightModeli);
367     QGL_invalidateExtensionFunc(table.m_glLightModeliv);
368     QGL_invalidateExtensionFunc(table.m_glLightf);
369     QGL_invalidateExtensionFunc(table.m_glLightfv);
370     QGL_invalidateExtensionFunc(table.m_glLighti);
371     QGL_invalidateExtensionFunc(table.m_glLightiv);
372     QGL_invalidateExtensionFunc(table.m_glLineStipple);
373     QGL_invalidateExtensionFunc(table.m_glLineWidth);
374     QGL_invalidateExtensionFunc(table.m_glListBase);
375     QGL_invalidateExtensionFunc(table.m_glLoadIdentity);
376     QGL_invalidateExtensionFunc(table.m_glLoadMatrixd);
377     QGL_invalidateExtensionFunc(table.m_glLoadMatrixf);
378     QGL_invalidateExtensionFunc(table.m_glLoadName);
379     QGL_invalidateExtensionFunc(table.m_glLogicOp);
380     QGL_invalidateExtensionFunc(table.m_glMap1d);
381     QGL_invalidateExtensionFunc(table.m_glMap1f);
382     QGL_invalidateExtensionFunc(table.m_glMap2d);
383     QGL_invalidateExtensionFunc(table.m_glMap2f);
384     QGL_invalidateExtensionFunc(table.m_glMapGrid1d);
385     QGL_invalidateExtensionFunc(table.m_glMapGrid1f);
386     QGL_invalidateExtensionFunc(table.m_glMapGrid2d);
387     QGL_invalidateExtensionFunc(table.m_glMapGrid2f);
388     QGL_invalidateExtensionFunc(table.m_glMaterialf);
389     QGL_invalidateExtensionFunc(table.m_glMaterialfv);
390     QGL_invalidateExtensionFunc(table.m_glMateriali);
391     QGL_invalidateExtensionFunc(table.m_glMaterialiv);
392     QGL_invalidateExtensionFunc(table.m_glMatrixMode);
393     QGL_invalidateExtensionFunc(table.m_glMultMatrixd);
394     QGL_invalidateExtensionFunc(table.m_glMultMatrixf);
395     QGL_invalidateExtensionFunc(table.m_glNewList);
396     QGL_invalidateExtensionFunc(table.m_glNormal3b);
397     QGL_invalidateExtensionFunc(table.m_glNormal3bv);
398     QGL_invalidateExtensionFunc(table.m_glNormal3d);
399     QGL_invalidateExtensionFunc(table.m_glNormal3dv);
400     QGL_invalidateExtensionFunc(table.m_glNormal3f);
401     QGL_invalidateExtensionFunc(table.m_glNormal3fv);
402     QGL_invalidateExtensionFunc(table.m_glNormal3i);
403     QGL_invalidateExtensionFunc(table.m_glNormal3iv);
404     QGL_invalidateExtensionFunc(table.m_glNormal3s);
405     QGL_invalidateExtensionFunc(table.m_glNormal3sv);
406     QGL_invalidateExtensionFunc(table.m_glNormalPointer);
407     QGL_invalidateExtensionFunc(table.m_glOrtho);
408     QGL_invalidateExtensionFunc(table.m_glPassThrough);
409     QGL_invalidateExtensionFunc(table.m_glPixelMapfv);
410     QGL_invalidateExtensionFunc(table.m_glPixelMapuiv);
411     QGL_invalidateExtensionFunc(table.m_glPixelMapusv);
412     QGL_invalidateExtensionFunc(table.m_glPixelStoref);
413     QGL_invalidateExtensionFunc(table.m_glPixelStorei);
414     QGL_invalidateExtensionFunc(table.m_glPixelTransferf);
415     QGL_invalidateExtensionFunc(table.m_glPixelTransferi);
416     QGL_invalidateExtensionFunc(table.m_glPixelZoom);
417     QGL_invalidateExtensionFunc(table.m_glPointSize);
418     QGL_invalidateExtensionFunc(table.m_glPolygonMode);
419     QGL_invalidateExtensionFunc(table.m_glPolygonOffset);
420     QGL_invalidateExtensionFunc(table.m_glPolygonStipple);
421     QGL_invalidateExtensionFunc(table.m_glPopAttrib);
422     QGL_invalidateExtensionFunc(table.m_glPopClientAttrib);
423     QGL_invalidateExtensionFunc(table.m_glPopMatrix);
424     QGL_invalidateExtensionFunc(table.m_glPopName);
425     QGL_invalidateExtensionFunc(table.m_glPrioritizeTextures);
426     QGL_invalidateExtensionFunc(table.m_glPushAttrib);
427     QGL_invalidateExtensionFunc(table.m_glPushClientAttrib);
428     QGL_invalidateExtensionFunc(table.m_glPushMatrix);
429     QGL_invalidateExtensionFunc(table.m_glPushName);
430     QGL_invalidateExtensionFunc(table.m_glRasterPos2d);
431     QGL_invalidateExtensionFunc(table.m_glRasterPos2dv);
432     QGL_invalidateExtensionFunc(table.m_glRasterPos2f);
433     QGL_invalidateExtensionFunc(table.m_glRasterPos2fv);
434     QGL_invalidateExtensionFunc(table.m_glRasterPos2i);
435     QGL_invalidateExtensionFunc(table.m_glRasterPos2iv);
436     QGL_invalidateExtensionFunc(table.m_glRasterPos2s);
437     QGL_invalidateExtensionFunc(table.m_glRasterPos2sv);
438     QGL_invalidateExtensionFunc(table.m_glRasterPos3d);
439     QGL_invalidateExtensionFunc(table.m_glRasterPos3dv);
440     QGL_invalidateExtensionFunc(table.m_glRasterPos3f);
441     QGL_invalidateExtensionFunc(table.m_glRasterPos3fv);
442     QGL_invalidateExtensionFunc(table.m_glRasterPos3i);
443     QGL_invalidateExtensionFunc(table.m_glRasterPos3iv);
444     QGL_invalidateExtensionFunc(table.m_glRasterPos3s);
445     QGL_invalidateExtensionFunc(table.m_glRasterPos3sv);
446     QGL_invalidateExtensionFunc(table.m_glRasterPos4d);
447     QGL_invalidateExtensionFunc(table.m_glRasterPos4dv);
448     QGL_invalidateExtensionFunc(table.m_glRasterPos4f);
449     QGL_invalidateExtensionFunc(table.m_glRasterPos4fv);
450     QGL_invalidateExtensionFunc(table.m_glRasterPos4i);
451     QGL_invalidateExtensionFunc(table.m_glRasterPos4iv);
452     QGL_invalidateExtensionFunc(table.m_glRasterPos4s);
453     QGL_invalidateExtensionFunc(table.m_glRasterPos4sv);
454     QGL_invalidateExtensionFunc(table.m_glReadBuffer);
455     QGL_invalidateExtensionFunc(table.m_glReadPixels);
456     QGL_invalidateExtensionFunc(table.m_glRectd);
457     QGL_invalidateExtensionFunc(table.m_glRectdv);
458     QGL_invalidateExtensionFunc(table.m_glRectf);
459     QGL_invalidateExtensionFunc(table.m_glRectfv);
460     QGL_invalidateExtensionFunc(table.m_glRecti);
461     QGL_invalidateExtensionFunc(table.m_glRectiv);
462     QGL_invalidateExtensionFunc(table.m_glRects);
463     QGL_invalidateExtensionFunc(table.m_glRectsv);
464     QGL_invalidateExtensionFunc(table.m_glRenderMode);
465     QGL_invalidateExtensionFunc(table.m_glRotated);
466     QGL_invalidateExtensionFunc(table.m_glRotatef);
467     QGL_invalidateExtensionFunc(table.m_glScaled);
468     QGL_invalidateExtensionFunc(table.m_glScalef);
469     QGL_invalidateExtensionFunc(table.m_glScissor);
470     QGL_invalidateExtensionFunc(table.m_glSelectBuffer);
471     QGL_invalidateExtensionFunc(table.m_glShadeModel);
472     QGL_invalidateExtensionFunc(table.m_glStencilFunc);
473     QGL_invalidateExtensionFunc(table.m_glStencilMask);
474     QGL_invalidateExtensionFunc(table.m_glStencilOp);
475     QGL_invalidateExtensionFunc(table.m_glTexCoord1d);
476     QGL_invalidateExtensionFunc(table.m_glTexCoord1dv);
477     QGL_invalidateExtensionFunc(table.m_glTexCoord1f);
478     QGL_invalidateExtensionFunc(table.m_glTexCoord1fv);
479     QGL_invalidateExtensionFunc(table.m_glTexCoord1i);
480     QGL_invalidateExtensionFunc(table.m_glTexCoord1iv);
481     QGL_invalidateExtensionFunc(table.m_glTexCoord1s);
482     QGL_invalidateExtensionFunc(table.m_glTexCoord1sv);
483     QGL_invalidateExtensionFunc(table.m_glTexCoord2d);
484     QGL_invalidateExtensionFunc(table.m_glTexCoord2dv);
485     QGL_invalidateExtensionFunc(table.m_glTexCoord2f);
486     QGL_invalidateExtensionFunc(table.m_glTexCoord2fv);
487     QGL_invalidateExtensionFunc(table.m_glTexCoord2i);
488     QGL_invalidateExtensionFunc(table.m_glTexCoord2iv);
489     QGL_invalidateExtensionFunc(table.m_glTexCoord2s);
490     QGL_invalidateExtensionFunc(table.m_glTexCoord2sv);
491     QGL_invalidateExtensionFunc(table.m_glTexCoord3d);
492     QGL_invalidateExtensionFunc(table.m_glTexCoord3dv);
493     QGL_invalidateExtensionFunc(table.m_glTexCoord3f);
494     QGL_invalidateExtensionFunc(table.m_glTexCoord3fv);
495     QGL_invalidateExtensionFunc(table.m_glTexCoord3i);
496     QGL_invalidateExtensionFunc(table.m_glTexCoord3iv);
497     QGL_invalidateExtensionFunc(table.m_glTexCoord3s);
498     QGL_invalidateExtensionFunc(table.m_glTexCoord3sv);
499     QGL_invalidateExtensionFunc(table.m_glTexCoord4d);
500     QGL_invalidateExtensionFunc(table.m_glTexCoord4dv);
501     QGL_invalidateExtensionFunc(table.m_glTexCoord4f);
502     QGL_invalidateExtensionFunc(table.m_glTexCoord4fv);
503     QGL_invalidateExtensionFunc(table.m_glTexCoord4i);
504     QGL_invalidateExtensionFunc(table.m_glTexCoord4iv);
505     QGL_invalidateExtensionFunc(table.m_glTexCoord4s);
506     QGL_invalidateExtensionFunc(table.m_glTexCoord4sv);
507     QGL_invalidateExtensionFunc(table.m_glTexCoordPointer);
508     QGL_invalidateExtensionFunc(table.m_glTexEnvf);
509     QGL_invalidateExtensionFunc(table.m_glTexEnvfv);
510     QGL_invalidateExtensionFunc(table.m_glTexEnvi);
511     QGL_invalidateExtensionFunc(table.m_glTexEnviv);
512     QGL_invalidateExtensionFunc(table.m_glTexGend);
513     QGL_invalidateExtensionFunc(table.m_glTexGendv);
514     QGL_invalidateExtensionFunc(table.m_glTexGenf);
515     QGL_invalidateExtensionFunc(table.m_glTexGenfv);
516     QGL_invalidateExtensionFunc(table.m_glTexGeni);
517     QGL_invalidateExtensionFunc(table.m_glTexGeniv);
518     QGL_invalidateExtensionFunc(table.m_glTexImage1D);
519     QGL_invalidateExtensionFunc(table.m_glTexImage2D);
520     QGL_invalidateExtensionFunc(table.m_glTexParameterf);
521     QGL_invalidateExtensionFunc(table.m_glTexParameterfv);
522     QGL_invalidateExtensionFunc(table.m_glTexParameteri);
523     QGL_invalidateExtensionFunc(table.m_glTexParameteriv);
524     QGL_invalidateExtensionFunc(table.m_glTexSubImage1D);
525     QGL_invalidateExtensionFunc(table.m_glTexSubImage2D);
526     QGL_invalidateExtensionFunc(table.m_glTranslated);
527     QGL_invalidateExtensionFunc(table.m_glTranslatef);
528     QGL_invalidateExtensionFunc(table.m_glVertex2d);
529     QGL_invalidateExtensionFunc(table.m_glVertex2dv);
530     QGL_invalidateExtensionFunc(table.m_glVertex2f);
531     QGL_invalidateExtensionFunc(table.m_glVertex2fv);
532     QGL_invalidateExtensionFunc(table.m_glVertex2i);
533     QGL_invalidateExtensionFunc(table.m_glVertex2iv);
534     QGL_invalidateExtensionFunc(table.m_glVertex2s);
535     QGL_invalidateExtensionFunc(table.m_glVertex2sv);
536     QGL_invalidateExtensionFunc(table.m_glVertex3d);
537     QGL_invalidateExtensionFunc(table.m_glVertex3dv);
538     QGL_invalidateExtensionFunc(table.m_glVertex3f);
539     QGL_invalidateExtensionFunc(table.m_glVertex3fv);
540     QGL_invalidateExtensionFunc(table.m_glVertex3i);
541     QGL_invalidateExtensionFunc(table.m_glVertex3iv);
542     QGL_invalidateExtensionFunc(table.m_glVertex3s);
543     QGL_invalidateExtensionFunc(table.m_glVertex3sv);
544     QGL_invalidateExtensionFunc(table.m_glVertex4d);
545     QGL_invalidateExtensionFunc(table.m_glVertex4dv);
546     QGL_invalidateExtensionFunc(table.m_glVertex4f);
547     QGL_invalidateExtensionFunc(table.m_glVertex4fv);
548     QGL_invalidateExtensionFunc(table.m_glVertex4i);
549     QGL_invalidateExtensionFunc(table.m_glVertex4iv);
550     QGL_invalidateExtensionFunc(table.m_glVertex4s);
551     QGL_invalidateExtensionFunc(table.m_glVertex4sv);
552     QGL_invalidateExtensionFunc(table.m_glVertexPointer);
553     QGL_invalidateExtensionFunc(table.m_glViewport);
554 }
555
556 int QGL_Init(OpenGLBinding &table)
557 {
558     QGL_clear(table);
559
560 #if GDEF_OS_WINDOWS
561     qwglGetProcAddress           = wglGetProcAddress;
562 #elif defined( XWINDOWS )
563     qglXGetProcAddressARB = (glXGetProcAddressARBProc) dlsym(RTLD_DEFAULT, "glXGetProcAddressARB");
564     if ((qglXQueryExtension == 0) || (qglXQueryExtension(XOpenDisplay(nullptr), 0, 0) != True)) {
565         return 0;
566     }
567 #elif GDEF_OS_MACOS
568                                                                                                                             #else
569 #error "unsupported platform"
570 #endif
571
572     return 1;
573 }
574
575 int g_qglMajorVersion = 0;
576 int g_qglMinorVersion = 0;
577
578 // requires a valid gl context
579 void QGL_InitVersion()
580 {
581 #if EXTENSIONS_ENABLED
582     const std::size_t versionSize = 256;
583     char version[versionSize];
584     strncpy(version, reinterpret_cast<const char *>( GlobalOpenGL().m_glGetString(GL_VERSION)), versionSize - 1);
585     version[versionSize - 1] = '\0';
586     char *firstDot = strchr(version, '.');
587     ASSERT_NOTNULL(firstDot);
588     *firstDot = '\0';
589     g_qglMajorVersion = atoi(version);
590     char *secondDot = strchr(firstDot + 1, '.');
591     if (secondDot != 0) {
592         *secondDot = '\0';
593     }
594     g_qglMinorVersion = atoi(firstDot + 1);
595 #else
596                                                                                                                             g_qglMajorVersion = 1;
597         g_qglMinorVersion = 1;
598 #endif
599 }
600
601
602 inline void extension_not_implemented(const char *extension)
603 {
604     globalErrorStream() << "WARNING: OpenGL driver reports support for " << extension << " but does not implement it\n";
605 }
606
607 float g_maxTextureAnisotropy;
608
609 float QGL_maxTextureAnisotropy()
610 {
611     return g_maxTextureAnisotropy;
612 }
613
614 void QGL_sharedContextCreated(OpenGLBinding &table)
615 {
616     QGL_InitVersion();
617
618     table.major_version = g_qglMajorVersion;
619     table.minor_version = g_qglMinorVersion;
620
621     table.m_glAccum = glAccum;
622     table.m_glAlphaFunc = glAlphaFunc;
623     table.m_glAreTexturesResident = glAreTexturesResident;
624     table.m_glArrayElement = glArrayElement;
625     table.m_glBegin = glBegin;
626     table.m_glBindTexture = glBindTexture;
627     table.m_glBitmap = glBitmap;
628     table.m_glBlendFunc = glBlendFunc;
629     table.m_glCallList = glCallList;
630     table.m_glCallLists = glCallLists;
631     table.m_glClear = glClear;
632     table.m_glClearAccum = glClearAccum;
633     table.m_glClearColor = glClearColor;
634     table.m_glClearDepth = glClearDepth;
635     table.m_glClearIndex = glClearIndex;
636     table.m_glClearStencil = glClearStencil;
637     table.m_glClipPlane = glClipPlane;
638     table.m_glColor3b = glColor3b;
639     table.m_glColor3bv = glColor3bv;
640     table.m_glColor3d = glColor3d;
641     table.m_glColor3dv = glColor3dv;
642     table.m_glColor3f = glColor3f;
643     table.m_glColor3fv = glColor3fv;
644     table.m_glColor3i = glColor3i;
645     table.m_glColor3iv = glColor3iv;
646     table.m_glColor3s = glColor3s;
647     table.m_glColor3sv = glColor3sv;
648     table.m_glColor3ub = glColor3ub;
649     table.m_glColor3ubv = glColor3ubv;
650     table.m_glColor3ui = glColor3ui;
651     table.m_glColor3uiv = glColor3uiv;
652     table.m_glColor3us = glColor3us;
653     table.m_glColor3usv = glColor3usv;
654     table.m_glColor4b = glColor4b;
655     table.m_glColor4bv = glColor4bv;
656     table.m_glColor4d = glColor4d;
657     table.m_glColor4dv = glColor4dv;
658     table.m_glColor4f = glColor4f;
659     table.m_glColor4fv = glColor4fv;
660     table.m_glColor4i = glColor4i;
661     table.m_glColor4iv = glColor4iv;
662     table.m_glColor4s = glColor4s;
663     table.m_glColor4sv = glColor4sv;
664     table.m_glColor4ub = glColor4ub;
665     table.m_glColor4ubv = glColor4ubv;
666     table.m_glColor4ui = glColor4ui;
667     table.m_glColor4uiv = glColor4uiv;
668     table.m_glColor4us = glColor4us;
669     table.m_glColor4usv = glColor4usv;
670     table.m_glColorMask = glColorMask;
671     table.m_glColorMaterial = glColorMaterial;
672     table.m_glColorPointer = glColorPointer;
673     table.m_glCopyPixels = glCopyPixels;
674     table.m_glCopyTexImage1D = glCopyTexImage1D;
675     table.m_glCopyTexImage2D = glCopyTexImage2D;
676     table.m_glCopyTexSubImage1D = glCopyTexSubImage1D;
677     table.m_glCopyTexSubImage2D = glCopyTexSubImage2D;
678     table.m_glCullFace = glCullFace;
679     table.m_glDeleteLists = glDeleteLists;
680     table.m_glDeleteTextures = glDeleteTextures;
681     table.m_glDepthFunc = glDepthFunc;
682     table.m_glDepthMask = glDepthMask;
683     table.m_glDepthRange = glDepthRange;
684     table.m_glDisable = glDisable;
685     table.m_glDisableClientState = glDisableClientState;
686     table.m_glDrawArrays = glDrawArrays;
687     table.m_glDrawBuffer = glDrawBuffer;
688     table.m_glDrawElements = glDrawElements;
689     table.m_glDrawPixels = glDrawPixels;
690     table.m_glEdgeFlag = glEdgeFlag;
691     table.m_glEdgeFlagPointer = glEdgeFlagPointer;
692     table.m_glEdgeFlagv = glEdgeFlagv;
693     table.m_glEnable = glEnable;
694     table.m_glEnableClientState = glEnableClientState;
695     table.m_glEnd = glEnd;
696     table.m_glEndList = glEndList;
697     table.m_glEvalCoord1d = glEvalCoord1d;
698     table.m_glEvalCoord1dv = glEvalCoord1dv;
699     table.m_glEvalCoord1f = glEvalCoord1f;
700     table.m_glEvalCoord1fv = glEvalCoord1fv;
701     table.m_glEvalCoord2d = glEvalCoord2d;
702     table.m_glEvalCoord2dv = glEvalCoord2dv;
703     table.m_glEvalCoord2f = glEvalCoord2f;
704     table.m_glEvalCoord2fv = glEvalCoord2fv;
705     table.m_glEvalMesh1 = glEvalMesh1;
706     table.m_glEvalMesh2 = glEvalMesh2;
707     table.m_glEvalPoint1 = glEvalPoint1;
708     table.m_glEvalPoint2 = glEvalPoint2;
709     table.m_glFeedbackBuffer = glFeedbackBuffer;
710     table.m_glFinish = glFinish;
711     table.m_glFlush = glFlush;
712     table.m_glFogf = glFogf;
713     table.m_glFogfv = glFogfv;
714     table.m_glFogi = glFogi;
715     table.m_glFogiv = glFogiv;
716     table.m_glFrontFace = glFrontFace;
717     table.m_glFrustum = glFrustum;
718     table.m_glGenLists = glGenLists;
719     table.m_glGenTextures = glGenTextures;
720     table.m_glGetBooleanv = glGetBooleanv;
721     table.m_glGetClipPlane = glGetClipPlane;
722     table.m_glGetDoublev = glGetDoublev;
723     table.m_glGetError = glGetError;
724     table.m_glGetFloatv = glGetFloatv;
725     table.m_glGetIntegerv = glGetIntegerv;
726     table.m_glGetLightfv = glGetLightfv;
727     table.m_glGetLightiv = glGetLightiv;
728     table.m_glGetMapdv = glGetMapdv;
729     table.m_glGetMapfv = glGetMapfv;
730     table.m_glGetMapiv = glGetMapiv;
731     table.m_glGetMaterialfv = glGetMaterialfv;
732     table.m_glGetMaterialiv = glGetMaterialiv;
733     table.m_glGetPixelMapfv = glGetPixelMapfv;
734     table.m_glGetPixelMapuiv = glGetPixelMapuiv;
735     table.m_glGetPixelMapusv = glGetPixelMapusv;
736     table.m_glGetPointerv = glGetPointerv;
737     table.m_glGetPolygonStipple = glGetPolygonStipple;
738     table.m_glGetString = glGetString;
739     table.m_glGetTexEnvfv = glGetTexEnvfv;
740     table.m_glGetTexEnviv = glGetTexEnviv;
741     table.m_glGetTexGendv = glGetTexGendv;
742     table.m_glGetTexGenfv = glGetTexGenfv;
743     table.m_glGetTexGeniv = glGetTexGeniv;
744     table.m_glGetTexImage = glGetTexImage;
745     table.m_glGetTexLevelParameterfv = glGetTexLevelParameterfv;
746     table.m_glGetTexLevelParameteriv = glGetTexLevelParameteriv;
747     table.m_glGetTexParameterfv = glGetTexParameterfv;
748     table.m_glGetTexParameteriv = glGetTexParameteriv;
749     table.m_glHint = glHint;
750     table.m_glIndexMask = glIndexMask;
751     table.m_glIndexPointer = glIndexPointer;
752     table.m_glIndexd = glIndexd;
753     table.m_glIndexdv = glIndexdv;
754     table.m_glIndexf = glIndexf;
755     table.m_glIndexfv = glIndexfv;
756     table.m_glIndexi = glIndexi;
757     table.m_glIndexiv = glIndexiv;
758     table.m_glIndexs = glIndexs;
759     table.m_glIndexsv = glIndexsv;
760     table.m_glIndexub = glIndexub;
761     table.m_glIndexubv = glIndexubv;
762     table.m_glInitNames = glInitNames;
763     table.m_glInterleavedArrays = glInterleavedArrays;
764     table.m_glIsEnabled = glIsEnabled;
765     table.m_glIsList = glIsList;
766     table.m_glIsTexture = glIsTexture;
767     table.m_glLightModelf = glLightModelf;
768     table.m_glLightModelfv = glLightModelfv;
769     table.m_glLightModeli = glLightModeli;
770     table.m_glLightModeliv = glLightModeliv;
771     table.m_glLightf = glLightf;
772     table.m_glLightfv = glLightfv;
773     table.m_glLighti = glLighti;
774     table.m_glLightiv = glLightiv;
775     table.m_glLineStipple = glLineStipple;
776     table.m_glLineWidth = glLineWidth;
777     table.m_glListBase = glListBase;
778     table.m_glLoadIdentity = glLoadIdentity;
779     table.m_glLoadMatrixd = glLoadMatrixd;
780     table.m_glLoadMatrixf = glLoadMatrixf;
781     table.m_glLoadName = glLoadName;
782     table.m_glLogicOp = glLogicOp;
783     table.m_glMap1d = glMap1d;
784     table.m_glMap1f = glMap1f;
785     table.m_glMap2d = glMap2d;
786     table.m_glMap2f = glMap2f;
787     table.m_glMapGrid1d = glMapGrid1d;
788     table.m_glMapGrid1f = glMapGrid1f;
789     table.m_glMapGrid2d = glMapGrid2d;
790     table.m_glMapGrid2f = glMapGrid2f;
791     table.m_glMaterialf = glMaterialf;
792     table.m_glMaterialfv = glMaterialfv;
793     table.m_glMateriali = glMateriali;
794     table.m_glMaterialiv = glMaterialiv;
795     table.m_glMatrixMode = glMatrixMode;
796     table.m_glMultMatrixd = glMultMatrixd;
797     table.m_glMultMatrixf = glMultMatrixf;
798     table.m_glNewList = glNewList;
799     table.m_glNormal3b = glNormal3b;
800     table.m_glNormal3bv = glNormal3bv;
801     table.m_glNormal3d = glNormal3d;
802     table.m_glNormal3dv = glNormal3dv;
803     table.m_glNormal3f = glNormal3f;
804     table.m_glNormal3fv = glNormal3fv;
805     table.m_glNormal3i = glNormal3i;
806     table.m_glNormal3iv = glNormal3iv;
807     table.m_glNormal3s = glNormal3s;
808     table.m_glNormal3sv = glNormal3sv;
809     table.m_glNormalPointer = glNormalPointer;
810     table.m_glOrtho = glOrtho;
811     table.m_glPassThrough = glPassThrough;
812     table.m_glPixelMapfv = glPixelMapfv;
813     table.m_glPixelMapuiv = glPixelMapuiv;
814     table.m_glPixelMapusv = glPixelMapusv;
815     table.m_glPixelStoref = glPixelStoref;
816     table.m_glPixelStorei = glPixelStorei;
817     table.m_glPixelTransferf = glPixelTransferf;
818     table.m_glPixelTransferi = glPixelTransferi;
819     table.m_glPixelZoom = glPixelZoom;
820     table.m_glPointSize = glPointSize;
821     table.m_glPolygonMode = glPolygonMode;
822     table.m_glPolygonOffset = glPolygonOffset;
823     table.m_glPolygonStipple = glPolygonStipple;
824     table.m_glPopAttrib = glPopAttrib;
825     table.m_glPopClientAttrib = glPopClientAttrib;
826     table.m_glPopMatrix = glPopMatrix;
827     table.m_glPopName = glPopName;
828     table.m_glPrioritizeTextures = glPrioritizeTextures;
829     table.m_glPushAttrib = glPushAttrib;
830     table.m_glPushClientAttrib = glPushClientAttrib;
831     table.m_glPushMatrix = glPushMatrix;
832     table.m_glPushName = glPushName;
833     table.m_glRasterPos2d = glRasterPos2d;
834     table.m_glRasterPos2dv = glRasterPos2dv;
835     table.m_glRasterPos2f = glRasterPos2f;
836     table.m_glRasterPos2fv = glRasterPos2fv;
837     table.m_glRasterPos2i = glRasterPos2i;
838     table.m_glRasterPos2iv = glRasterPos2iv;
839     table.m_glRasterPos2s = glRasterPos2s;
840     table.m_glRasterPos2sv = glRasterPos2sv;
841     table.m_glRasterPos3d = glRasterPos3d;
842     table.m_glRasterPos3dv = glRasterPos3dv;
843     table.m_glRasterPos3f = glRasterPos3f;
844     table.m_glRasterPos3fv = glRasterPos3fv;
845     table.m_glRasterPos3i = glRasterPos3i;
846     table.m_glRasterPos3iv = glRasterPos3iv;
847     table.m_glRasterPos3s = glRasterPos3s;
848     table.m_glRasterPos3sv = glRasterPos3sv;
849     table.m_glRasterPos4d = glRasterPos4d;
850     table.m_glRasterPos4dv = glRasterPos4dv;
851     table.m_glRasterPos4f = glRasterPos4f;
852     table.m_glRasterPos4fv = glRasterPos4fv;
853     table.m_glRasterPos4i = glRasterPos4i;
854     table.m_glRasterPos4iv = glRasterPos4iv;
855     table.m_glRasterPos4s = glRasterPos4s;
856     table.m_glRasterPos4sv = glRasterPos4sv;
857     table.m_glReadBuffer = glReadBuffer;
858     table.m_glReadPixels = glReadPixels;
859     table.m_glRectd = glRectd;
860     table.m_glRectdv = glRectdv;
861     table.m_glRectf = glRectf;
862     table.m_glRectfv = glRectfv;
863     table.m_glRecti = glRecti;
864     table.m_glRectiv = glRectiv;
865     table.m_glRects = glRects;
866     table.m_glRectsv = glRectsv;
867     table.m_glRenderMode = glRenderMode;
868     table.m_glRotated = glRotated;
869     table.m_glRotatef = glRotatef;
870     table.m_glScaled = glScaled;
871     table.m_glScalef = glScalef;
872     table.m_glScissor = glScissor;
873     table.m_glSelectBuffer = glSelectBuffer;
874     table.m_glShadeModel = glShadeModel;
875     table.m_glStencilFunc = glStencilFunc;
876     table.m_glStencilMask = glStencilMask;
877     table.m_glStencilOp = glStencilOp;
878     table.m_glTexCoord1d = glTexCoord1d;
879     table.m_glTexCoord1dv = glTexCoord1dv;
880     table.m_glTexCoord1f = glTexCoord1f;
881     table.m_glTexCoord1fv = glTexCoord1fv;
882     table.m_glTexCoord1i = glTexCoord1i;
883     table.m_glTexCoord1iv = glTexCoord1iv;
884     table.m_glTexCoord1s = glTexCoord1s;
885     table.m_glTexCoord1sv = glTexCoord1sv;
886     table.m_glTexCoord2d = glTexCoord2d;
887     table.m_glTexCoord2dv = glTexCoord2dv;
888     table.m_glTexCoord2f = glTexCoord2f;
889     table.m_glTexCoord2fv = glTexCoord2fv;
890     table.m_glTexCoord2i = glTexCoord2i;
891     table.m_glTexCoord2iv = glTexCoord2iv;
892     table.m_glTexCoord2s = glTexCoord2s;
893     table.m_glTexCoord2sv = glTexCoord2sv;
894     table.m_glTexCoord3d = glTexCoord3d;
895     table.m_glTexCoord3dv = glTexCoord3dv;
896     table.m_glTexCoord3f = glTexCoord3f;
897     table.m_glTexCoord3fv = glTexCoord3fv;
898     table.m_glTexCoord3i = glTexCoord3i;
899     table.m_glTexCoord3iv = glTexCoord3iv;
900     table.m_glTexCoord3s = glTexCoord3s;
901     table.m_glTexCoord3sv = glTexCoord3sv;
902     table.m_glTexCoord4d = glTexCoord4d;
903     table.m_glTexCoord4dv = glTexCoord4dv;
904     table.m_glTexCoord4f = glTexCoord4f;
905     table.m_glTexCoord4fv = glTexCoord4fv;
906     table.m_glTexCoord4i = glTexCoord4i;
907     table.m_glTexCoord4iv = glTexCoord4iv;
908     table.m_glTexCoord4s = glTexCoord4s;
909     table.m_glTexCoord4sv = glTexCoord4sv;
910     table.m_glTexCoordPointer = glTexCoordPointer;
911     table.m_glTexEnvf = glTexEnvf;
912     table.m_glTexEnvfv = glTexEnvfv;
913     table.m_glTexEnvi = glTexEnvi;
914     table.m_glTexEnviv = glTexEnviv;
915     table.m_glTexGend = glTexGend;
916     table.m_glTexGendv = glTexGendv;
917     table.m_glTexGenf = glTexGenf;
918     table.m_glTexGenfv = glTexGenfv;
919     table.m_glTexGeni = glTexGeni;
920     table.m_glTexGeniv = glTexGeniv;
921     table.m_glTexImage1D = glTexImage1D;
922     table.m_glTexImage2D = glTexImage2D;
923     table.m_glTexParameterf = glTexParameterf;
924     table.m_glTexParameterfv = glTexParameterfv;
925     table.m_glTexParameteri = glTexParameteri;
926     table.m_glTexParameteriv = glTexParameteriv;
927     table.m_glTexSubImage1D = glTexSubImage1D;
928     table.m_glTexSubImage2D = glTexSubImage2D;
929     table.m_glTranslated = glTranslated;
930     table.m_glTranslatef = glTranslatef;
931     table.m_glVertex2d = glVertex2d;
932     table.m_glVertex2dv = glVertex2dv;
933     table.m_glVertex2f = glVertex2f;
934     table.m_glVertex2fv = glVertex2fv;
935     table.m_glVertex2i = glVertex2i;
936     table.m_glVertex2iv = glVertex2iv;
937     table.m_glVertex2s = glVertex2s;
938     table.m_glVertex2sv = glVertex2sv;
939     table.m_glVertex3d = glVertex3d;
940     table.m_glVertex3dv = glVertex3dv;
941     table.m_glVertex3f = glVertex3f;
942     table.m_glVertex3fv = glVertex3fv;
943     table.m_glVertex3i = glVertex3i;
944     table.m_glVertex3iv = glVertex3iv;
945     table.m_glVertex3s = glVertex3s;
946     table.m_glVertex3sv = glVertex3sv;
947     table.m_glVertex4d = glVertex4d;
948     table.m_glVertex4dv = glVertex4dv;
949     table.m_glVertex4f = glVertex4f;
950     table.m_glVertex4fv = glVertex4fv;
951     table.m_glVertex4i = glVertex4i;
952     table.m_glVertex4iv = glVertex4iv;
953     table.m_glVertex4s = glVertex4s;
954     table.m_glVertex4sv = glVertex4sv;
955     table.m_glVertexPointer = glVertexPointer;
956     table.m_glViewport = glViewport;
957
958     if (QGL_ExtensionSupported("GL_ARB_multitexture")) {
959         table.support_ARB_multitexture =
960                 QGL_constructExtensionFunc(table.m_glActiveTextureARB, "glActiveTextureARB")
961                 && QGL_constructExtensionFunc(table.m_glClientActiveTextureARB, "glClientActiveTextureARB")
962                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1dARB, "glMultiTexCoord1dARB")
963                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1dvARB, "glMultiTexCoord1dvARB")
964                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1fARB, "glMultiTexCoord1fARB")
965                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1fvARB, "glMultiTexCoord1fvARB")
966                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1iARB, "glMultiTexCoord1iARB")
967                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1ivARB, "glMultiTexCoord1ivARB")
968                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1sARB, "glMultiTexCoord1sARB")
969                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1svARB, "glMultiTexCoord1svARB")
970                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2dARB, "glMultiTexCoord2dARB")
971                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2dvARB, "glMultiTexCoord2dvARB")
972                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2fARB, "glMultiTexCoord2fARB")
973                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2fvARB, "glMultiTexCoord2fvARB")
974                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2iARB, "glMultiTexCoord2iARB")
975                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2ivARB, "glMultiTexCoord2ivARB")
976                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2sARB, "glMultiTexCoord2sARB")
977                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2svARB, "glMultiTexCoord2svARB")
978                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3dARB, "glMultiTexCoord3dARB")
979                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3dvARB, "glMultiTexCoord3dvARB")
980                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3fARB, "glMultiTexCoord3fARB")
981                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3fvARB, "glMultiTexCoord3fvARB")
982                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3iARB, "glMultiTexCoord3iARB")
983                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3ivARB, "glMultiTexCoord3ivARB")
984                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3sARB, "glMultiTexCoord3sARB")
985                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3svARB, "glMultiTexCoord3svARB")
986                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4dARB, "glMultiTexCoord4dARB")
987                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4dvARB, "glMultiTexCoord4dvARB")
988                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4fARB, "glMultiTexCoord4fARB")
989                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4fvARB, "glMultiTexCoord4fvARB")
990                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4iARB, "glMultiTexCoord4iARB")
991                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4ivARB, "glMultiTexCoord4ivARB")
992                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4sARB, "glMultiTexCoord4sARB")
993                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4svARB, "glMultiTexCoord4svARB");
994
995         if (!table.support_ARB_multitexture) {
996             extension_not_implemented("GL_ARB_multitexture");
997         }
998     } else {
999         table.support_ARB_multitexture = false;
1000     }
1001
1002     if (QGL_ExtensionSupported("GL_ARB_texture_compression")) {
1003         table.support_ARB_texture_compression =
1004                 QGL_constructExtensionFunc(table.m_glCompressedTexImage3DARB, "glCompressedTexImage3DARB")
1005                 && QGL_constructExtensionFunc(table.m_glCompressedTexImage2DARB, "glCompressedTexImage2DARB")
1006                 && QGL_constructExtensionFunc(table.m_glCompressedTexImage1DARB, "glCompressedTexImage1DARB")
1007                 && QGL_constructExtensionFunc(table.m_glCompressedTexSubImage3DARB, "glCompressedTexSubImage3DARB")
1008                 && QGL_constructExtensionFunc(table.m_glCompressedTexSubImage2DARB, "glCompressedTexSubImage2DARB")
1009                 && QGL_constructExtensionFunc(table.m_glCompressedTexSubImage1DARB, "glCompressedTexSubImage1DARB")
1010                 && QGL_constructExtensionFunc(table.m_glGetCompressedTexImageARB, "glGetCompressedTexImageARB");
1011
1012         if (!table.support_ARB_texture_compression) {
1013             extension_not_implemented("GL_ARB_texture_compression");
1014         }
1015     } else {
1016         table.support_ARB_texture_compression = false;
1017     }
1018
1019     table.support_EXT_texture_compression_s3tc = QGL_ExtensionSupported("GL_EXT_texture_compression_s3tc");
1020
1021     // GL 1.2
1022     if (table.major_version > 1 || table.minor_version >= 2) {
1023         table.support_GL_1_2 =
1024                 QGL_constructExtensionFunc(table.m_glCopyTexSubImage3D, "glCopyTexSubImage3D")
1025                 && QGL_constructExtensionFunc(table.m_glDrawRangeElements, "glDrawRangeElements")
1026                 && QGL_constructExtensionFunc(table.m_glTexImage3D, "glTexImage3D")
1027                 && QGL_constructExtensionFunc(table.m_glTexSubImage3D, "glTexSubImage3D");
1028
1029         if (!table.support_GL_1_2) {
1030             extension_not_implemented("GL_VERSION_1_2");
1031         }
1032     } else {
1033         table.support_GL_1_2 = false;
1034     }
1035
1036     // GL 1.3
1037     if (table.major_version > 1 || table.minor_version >= 3) {
1038         table.support_GL_1_3 =
1039                 QGL_constructExtensionFunc(table.m_glActiveTexture, "glActiveTexture")
1040                 && QGL_constructExtensionFunc(table.m_glClientActiveTexture, "glClientActiveTexture")
1041                 && QGL_constructExtensionFunc(table.m_glCompressedTexImage1D, "glCompressedTexImage1D")
1042                 && QGL_constructExtensionFunc(table.m_glCompressedTexImage2D, "glCompressedTexImage2D")
1043                 && QGL_constructExtensionFunc(table.m_glCompressedTexImage3D, "glCompressedTexImage3D")
1044                 && QGL_constructExtensionFunc(table.m_glCompressedTexSubImage1D, "glCompressedTexSubImage1D")
1045                 && QGL_constructExtensionFunc(table.m_glCompressedTexSubImage2D, "glCompressedTexSubImage2D")
1046                 && QGL_constructExtensionFunc(table.m_glCompressedTexSubImage3D, "glCompressedTexSubImage3D")
1047                 && QGL_constructExtensionFunc(table.m_glGetCompressedTexImage, "glGetCompressedTexImage")
1048                 && QGL_constructExtensionFunc(table.m_glLoadTransposeMatrixd, "glLoadTransposeMatrixd")
1049                 && QGL_constructExtensionFunc(table.m_glLoadTransposeMatrixf, "glLoadTransposeMatrixf")
1050                 && QGL_constructExtensionFunc(table.m_glMultTransposeMatrixd, "glMultTransposeMatrixd")
1051                 && QGL_constructExtensionFunc(table.m_glMultTransposeMatrixf, "glMultTransposeMatrixf")
1052                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1d, "glMultiTexCoord1d")
1053                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1dv, "glMultiTexCoord1dv")
1054                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1f, "glMultiTexCoord1f")
1055                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1fv, "glMultiTexCoord1fv")
1056                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1i, "glMultiTexCoord1i")
1057                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1iv, "glMultiTexCoord1iv")
1058                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1s, "glMultiTexCoord1s")
1059                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord1sv, "glMultiTexCoord1sv")
1060                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2d, "glMultiTexCoord2d")
1061                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2dv, "glMultiTexCoord2dv")
1062                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2f, "glMultiTexCoord2f")
1063                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2fv, "glMultiTexCoord2fv")
1064                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2i, "glMultiTexCoord2i")
1065                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2iv, "glMultiTexCoord2iv")
1066                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2s, "glMultiTexCoord2s")
1067                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord2sv, "glMultiTexCoord2sv")
1068                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3d, "glMultiTexCoord3d")
1069                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3dv, "glMultiTexCoord3dv")
1070                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3f, "glMultiTexCoord3f")
1071                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3fv, "glMultiTexCoord3fv")
1072                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3i, "glMultiTexCoord3i")
1073                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3iv, "glMultiTexCoord3iv")
1074                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3s, "glMultiTexCoord3s")
1075                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord3sv, "glMultiTexCoord3sv")
1076                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4d, "glMultiTexCoord4d")
1077                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4dv, "glMultiTexCoord4dv")
1078                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4f, "glMultiTexCoord4f")
1079                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4fv, "glMultiTexCoord4fv")
1080                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4i, "glMultiTexCoord4i")
1081                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4iv, "glMultiTexCoord4iv")
1082                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4s, "glMultiTexCoord4s")
1083                 && QGL_constructExtensionFunc(table.m_glMultiTexCoord4sv, "glMultiTexCoord4sv")
1084                 && QGL_constructExtensionFunc(table.m_glSampleCoverage, "glSampleCoverage");
1085
1086         if (!table.support_GL_1_3) {
1087             extension_not_implemented("GL_VERSION_1_3");
1088         }
1089     } else {
1090         table.support_GL_1_3 = false;
1091     }
1092
1093     // GL 1.4
1094     if (table.major_version > 1 || table.minor_version >= 4) {
1095         table.support_GL_1_4 =
1096                 QGL_constructExtensionFunc(table.m_glBlendColor, "glBlendColor")
1097                 && QGL_constructExtensionFunc(table.m_glBlendEquation, "glBlendEquation")
1098                 && QGL_constructExtensionFunc(table.m_glBlendFuncSeparate, "glBlendFuncSeparate")
1099                 && QGL_constructExtensionFunc(table.m_glFogCoordPointer, "glFogCoordPointer")
1100                 && QGL_constructExtensionFunc(table.m_glFogCoordd, "glFogCoordd")
1101                 && QGL_constructExtensionFunc(table.m_glFogCoorddv, "glFogCoorddv")
1102                 && QGL_constructExtensionFunc(table.m_glFogCoordf, "glFogCoordf")
1103                 && QGL_constructExtensionFunc(table.m_glFogCoordfv, "glFogCoordfv")
1104                 && QGL_constructExtensionFunc(table.m_glMultiDrawArrays, "glMultiDrawArrays")
1105                 && QGL_constructExtensionFunc(table.m_glMultiDrawElements, "glMultiDrawElements")
1106                 && QGL_constructExtensionFunc(table.m_glPointParameterf, "glPointParameterf")
1107                 && QGL_constructExtensionFunc(table.m_glPointParameterfv, "glPointParameterfv")
1108                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3b, "glSecondaryColor3b")
1109                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3bv, "glSecondaryColor3bv")
1110                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3d, "glSecondaryColor3d")
1111                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3dv, "glSecondaryColor3dv")
1112                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3f, "glSecondaryColor3f")
1113                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3fv, "glSecondaryColor3fv")
1114                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3i, "glSecondaryColor3i")
1115                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3iv, "glSecondaryColor3iv")
1116                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3s, "glSecondaryColor3s")
1117                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3sv, "glSecondaryColor3sv")
1118                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3ub, "glSecondaryColor3ub")
1119                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3ubv, "glSecondaryColor3ubv")
1120                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3ui, "glSecondaryColor3ui")
1121                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3uiv, "glSecondaryColor3uiv")
1122                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3us, "glSecondaryColor3us")
1123                 && QGL_constructExtensionFunc(table.m_glSecondaryColor3usv, "glSecondaryColor3usv")
1124                 && QGL_constructExtensionFunc(table.m_glSecondaryColorPointer, "glSecondaryColorPointer")
1125                 && QGL_constructExtensionFunc(table.m_glWindowPos2d, "glWindowPos2d")
1126                 && QGL_constructExtensionFunc(table.m_glWindowPos2dv, "glWindowPos2dv")
1127                 && QGL_constructExtensionFunc(table.m_glWindowPos2f, "glWindowPos2f")
1128                 && QGL_constructExtensionFunc(table.m_glWindowPos2fv, "glWindowPos2fv")
1129                 && QGL_constructExtensionFunc(table.m_glWindowPos2i, "glWindowPos2i")
1130                 && QGL_constructExtensionFunc(table.m_glWindowPos2iv, "glWindowPos2iv")
1131                 && QGL_constructExtensionFunc(table.m_glWindowPos2s, "glWindowPos2s")
1132                 && QGL_constructExtensionFunc(table.m_glWindowPos2sv, "glWindowPos2sv")
1133                 && QGL_constructExtensionFunc(table.m_glWindowPos3d, "glWindowPos3d")
1134                 && QGL_constructExtensionFunc(table.m_glWindowPos3dv, "glWindowPos3dv")
1135                 && QGL_constructExtensionFunc(table.m_glWindowPos3f, "glWindowPos3f")
1136                 && QGL_constructExtensionFunc(table.m_glWindowPos3fv, "glWindowPos3fv")
1137                 && QGL_constructExtensionFunc(table.m_glWindowPos3i, "glWindowPos3i")
1138                 && QGL_constructExtensionFunc(table.m_glWindowPos3iv, "glWindowPos3iv")
1139                 && QGL_constructExtensionFunc(table.m_glWindowPos3s, "glWindowPos3s")
1140                 && QGL_constructExtensionFunc(table.m_glWindowPos3sv, "glWindowPos3sv");
1141
1142         if (!table.support_GL_1_4) {
1143             extension_not_implemented("GL_VERSION_1_4");
1144         }
1145     } else {
1146         table.support_GL_1_4 = false;
1147     }
1148
1149     // GL 1.5
1150     if (table.major_version > 1 || table.minor_version >= 5) {
1151         table.support_GL_1_5 =
1152                 QGL_constructExtensionFunc(table.m_glBeginQuery, "glBeginQuery")
1153                 && QGL_constructExtensionFunc(table.m_glBindBuffer, "glBindBuffer")
1154                 && QGL_constructExtensionFunc(table.m_glBufferData, "glBufferData")
1155                 && QGL_constructExtensionFunc(table.m_glBufferSubData, "glBufferSubData")
1156                 && QGL_constructExtensionFunc(table.m_glDeleteBuffers, "glDeleteBuffers")
1157                 && QGL_constructExtensionFunc(table.m_glDeleteQueries, "glDeleteQueries")
1158                 && QGL_constructExtensionFunc(table.m_glEndQuery, "glEndQuery")
1159                 && QGL_constructExtensionFunc(table.m_glGenBuffers, "glGenBuffers")
1160                 && QGL_constructExtensionFunc(table.m_glGenQueries, "glGenQueries")
1161                 && QGL_constructExtensionFunc(table.m_glGetBufferParameteriv, "glGetBufferParameteriv")
1162                 && QGL_constructExtensionFunc(table.m_glGetBufferPointerv, "glGetBufferPointerv")
1163                 && QGL_constructExtensionFunc(table.m_glGetBufferSubData, "glGetBufferSubData")
1164                 && QGL_constructExtensionFunc(table.m_glGetQueryObjectiv, "glGetQueryObjectiv")
1165                 && QGL_constructExtensionFunc(table.m_glGetQueryObjectuiv, "glGetQueryObjectuiv")
1166                 && QGL_constructExtensionFunc(table.m_glGetQueryiv, "glGetQueryiv")
1167                 && QGL_constructExtensionFunc(table.m_glIsBuffer, "glIsBuffer")
1168                 && QGL_constructExtensionFunc(table.m_glIsQuery, "glIsQuery")
1169                 && QGL_constructExtensionFunc(table.m_glMapBuffer, "glMapBuffer")
1170                 && QGL_constructExtensionFunc(table.m_glUnmapBuffer, "glUnmapBuffer");
1171
1172         if (!table.support_GL_1_5) {
1173             extension_not_implemented("GL_VERSION_1_5");
1174         }
1175     } else {
1176         table.support_GL_1_5 = false;
1177     }
1178
1179
1180     if (QGL_ExtensionSupported("GL_ARB_vertex_program")) {
1181         table.support_ARB_vertex_program =
1182                 QGL_constructExtensionFunc(table.m_glVertexAttrib1sARB, "glVertexAttrib1sARB")
1183                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1fARB, "glVertexAttrib1fARB")
1184                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1dARB, "glVertexAttrib1dARB")
1185                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2sARB, "glVertexAttrib2sARB")
1186                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2fARB, "glVertexAttrib2fARB")
1187                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2dARB, "glVertexAttrib2dARB")
1188                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3sARB, "glVertexAttrib3sARB")
1189                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3fARB, "glVertexAttrib3fARB")
1190                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3dARB, "glVertexAttrib3dARB")
1191                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4sARB, "glVertexAttrib4sARB")
1192                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4fARB, "glVertexAttrib4fARB")
1193                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4dARB, "glVertexAttrib4dARB")
1194                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NubARB, "glVertexAttrib4NubARB")
1195                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1svARB, "glVertexAttrib1svARB")
1196                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1fvARB, "glVertexAttrib1fvARB")
1197                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1dvARB, "glVertexAttrib1dvARB")
1198                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2svARB, "glVertexAttrib2svARB")
1199                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2fvARB, "glVertexAttrib2fvARB")
1200                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2dvARB, "glVertexAttrib2dvARB")
1201                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3svARB, "glVertexAttrib3svARB")
1202                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3fvARB, "glVertexAttrib3fvARB")
1203                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3dvARB, "glVertexAttrib3dvARB")
1204                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4bvARB, "glVertexAttrib4bvARB")
1205                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4svARB, "glVertexAttrib4svARB")
1206                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4ivARB, "glVertexAttrib4ivARB")
1207                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4ubvARB, "glVertexAttrib4ubvARB")
1208                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4usvARB, "glVertexAttrib4usvARB")
1209                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4uivARB, "glVertexAttrib4uivARB")
1210                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4fvARB, "glVertexAttrib4fvARB")
1211                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4dvARB, "glVertexAttrib4dvARB")
1212                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NbvARB, "glVertexAttrib4NbvARB")
1213                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NsvARB, "glVertexAttrib4NsvARB")
1214                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NivARB, "glVertexAttrib4NivARB")
1215                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NubvARB, "glVertexAttrib4NubvARB")
1216                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NusvARB, "glVertexAttrib4NusvARB")
1217                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NuivARB, "glVertexAttrib4NuivARB")
1218                 && QGL_constructExtensionFunc(table.m_glVertexAttribPointerARB, "glVertexAttribPointerARB")
1219                 && QGL_constructExtensionFunc(table.m_glEnableVertexAttribArrayARB, "glEnableVertexAttribArrayARB")
1220                 && QGL_constructExtensionFunc(table.m_glDisableVertexAttribArrayARB, "glDisableVertexAttribArrayARB")
1221                 && QGL_constructExtensionFunc(table.m_glProgramStringARB, "glProgramStringARB")
1222                 && QGL_constructExtensionFunc(table.m_glBindProgramARB, "glBindProgramARB")
1223                 && QGL_constructExtensionFunc(table.m_glDeleteProgramsARB, "glDeleteProgramsARB")
1224                 && QGL_constructExtensionFunc(table.m_glGenProgramsARB, "glGenProgramsARB")
1225                 && QGL_constructExtensionFunc(table.m_glProgramEnvParameter4dARB, "glProgramEnvParameter4dARB")
1226                 && QGL_constructExtensionFunc(table.m_glProgramEnvParameter4dvARB, "glProgramEnvParameter4dvARB")
1227                 && QGL_constructExtensionFunc(table.m_glProgramEnvParameter4fARB, "glProgramEnvParameter4fARB")
1228                 && QGL_constructExtensionFunc(table.m_glProgramEnvParameter4fvARB, "glProgramEnvParameter4fvARB")
1229                 && QGL_constructExtensionFunc(table.m_glProgramLocalParameter4dARB, "glProgramLocalParameter4dARB")
1230                 && QGL_constructExtensionFunc(table.m_glProgramLocalParameter4dvARB, "glProgramLocalParameter4dvARB")
1231                 && QGL_constructExtensionFunc(table.m_glProgramLocalParameter4fARB, "glProgramLocalParameter4fARB")
1232                 && QGL_constructExtensionFunc(table.m_glProgramLocalParameter4fvARB, "glProgramLocalParameter4fvARB")
1233                 && QGL_constructExtensionFunc(table.m_glGetProgramEnvParameterdvARB, "glGetProgramEnvParameterdvARB")
1234                 && QGL_constructExtensionFunc(table.m_glGetProgramEnvParameterfvARB, "glGetProgramEnvParameterfvARB")
1235                 &&
1236                 QGL_constructExtensionFunc(table.m_glGetProgramLocalParameterdvARB, "glGetProgramLocalParameterdvARB")
1237                 &&
1238                 QGL_constructExtensionFunc(table.m_glGetProgramLocalParameterfvARB, "glGetProgramLocalParameterfvARB")
1239                 && QGL_constructExtensionFunc(table.m_glGetProgramivARB, "glGetProgramivARB")
1240                 && QGL_constructExtensionFunc(table.m_glGetProgramStringARB, "glGetProgramStringARB")
1241                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribdvARB, "glGetVertexAttribdvARB")
1242                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribfvARB, "glGetVertexAttribfvARB")
1243                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribivARB, "glGetVertexAttribivARB")
1244                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribPointervARB, "glGetVertexAttribPointervARB")
1245                 && QGL_constructExtensionFunc(table.m_glIsProgramARB, "glIsProgramARB");
1246
1247         if (!table.support_ARB_vertex_program) {
1248             extension_not_implemented("GL_ARB_vertex_program");
1249         }
1250     } else {
1251         table.support_ARB_vertex_program = false;
1252     }
1253
1254
1255     table.support_ARB_fragment_program = QGL_ExtensionSupported("GL_ARB_fragment_program");
1256
1257     if (QGL_ExtensionSupported("GL_ARB_shader_objects")) {
1258         table.support_ARB_shader_objects =
1259                 QGL_constructExtensionFunc(table.m_glDeleteObjectARB, "glDeleteObjectARB")
1260                 && QGL_constructExtensionFunc(table.m_glGetHandleARB, "glGetHandleARB")
1261                 && QGL_constructExtensionFunc(table.m_glDetachObjectARB, "glDetachObjectARB")
1262                 && QGL_constructExtensionFunc(table.m_glCreateShaderObjectARB, "glCreateShaderObjectARB")
1263                 && QGL_constructExtensionFunc(table.m_glShaderSourceARB, "glShaderSourceARB")
1264                 && QGL_constructExtensionFunc(table.m_glCompileShaderARB, "glCompileShaderARB")
1265                 && QGL_constructExtensionFunc(table.m_glCreateProgramObjectARB, "glCreateProgramObjectARB")
1266                 && QGL_constructExtensionFunc(table.m_glAttachObjectARB, "glAttachObjectARB")
1267                 && QGL_constructExtensionFunc(table.m_glLinkProgramARB, "glLinkProgramARB")
1268                 && QGL_constructExtensionFunc(table.m_glUseProgramObjectARB, "glUseProgramObjectARB")
1269                 && QGL_constructExtensionFunc(table.m_glValidateProgramARB, "glValidateProgramARB")
1270                 && QGL_constructExtensionFunc(table.m_glUniform1fARB, "glUniform1fARB")
1271                 && QGL_constructExtensionFunc(table.m_glUniform2fARB, "glUniform2fARB")
1272                 && QGL_constructExtensionFunc(table.m_glUniform3fARB, "glUniform3fARB")
1273                 && QGL_constructExtensionFunc(table.m_glUniform4fARB, "glUniform4fARB")
1274                 && QGL_constructExtensionFunc(table.m_glUniform1iARB, "glUniform1iARB")
1275                 && QGL_constructExtensionFunc(table.m_glUniform2iARB, "glUniform2iARB")
1276                 && QGL_constructExtensionFunc(table.m_glUniform3iARB, "glUniform3iARB")
1277                 && QGL_constructExtensionFunc(table.m_glUniform4iARB, "glUniform4iARB")
1278                 && QGL_constructExtensionFunc(table.m_glUniform1fvARB, "glUniform1fvARB")
1279                 && QGL_constructExtensionFunc(table.m_glUniform2fvARB, "glUniform2fvARB")
1280                 && QGL_constructExtensionFunc(table.m_glUniform3fvARB, "glUniform3fvARB")
1281                 && QGL_constructExtensionFunc(table.m_glUniform4fvARB, "glUniform4fvARB")
1282                 && QGL_constructExtensionFunc(table.m_glUniform1ivARB, "glUniform1ivARB")
1283                 && QGL_constructExtensionFunc(table.m_glUniform2ivARB, "glUniform2ivARB")
1284                 && QGL_constructExtensionFunc(table.m_glUniform3ivARB, "glUniform3ivARB")
1285                 && QGL_constructExtensionFunc(table.m_glUniform4ivARB, "glUniform4ivARB")
1286                 && QGL_constructExtensionFunc(table.m_glUniformMatrix2fvARB, "glUniformMatrix2fvARB")
1287                 && QGL_constructExtensionFunc(table.m_glUniformMatrix3fvARB, "glUniformMatrix3fvARB")
1288                 && QGL_constructExtensionFunc(table.m_glUniformMatrix4fvARB, "glUniformMatrix4fvARB")
1289                 && QGL_constructExtensionFunc(table.m_glGetObjectParameterfvARB, "glGetObjectParameterfvARB")
1290                 && QGL_constructExtensionFunc(table.m_glGetObjectParameterivARB, "glGetObjectParameterivARB")
1291                 && QGL_constructExtensionFunc(table.m_glGetInfoLogARB, "glGetInfoLogARB")
1292                 && QGL_constructExtensionFunc(table.m_glGetAttachedObjectsARB, "glGetAttachedObjectsARB")
1293                 && QGL_constructExtensionFunc(table.m_glGetUniformLocationARB, "glGetUniformLocationARB")
1294                 && QGL_constructExtensionFunc(table.m_glGetActiveUniformARB, "glGetActiveUniformARB")
1295                 && QGL_constructExtensionFunc(table.m_glGetUniformfvARB, "glGetUniformfvARB")
1296                 && QGL_constructExtensionFunc(table.m_glGetUniformivARB, "glGetUniformivARB")
1297                 && QGL_constructExtensionFunc(table.m_glGetShaderSourceARB, "glGetShaderSourceARB");
1298
1299         if (!table.support_ARB_shader_objects) {
1300             extension_not_implemented("GL_ARB_shader_objects");
1301         }
1302     } else {
1303         table.support_ARB_shader_objects = false;
1304     }
1305
1306     if (QGL_ExtensionSupported("GL_ARB_vertex_shader")) {
1307         table.support_ARB_vertex_shader =
1308                 QGL_constructExtensionFunc(table.m_glVertexAttrib1fARB, "glVertexAttrib1fARB")
1309                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1sARB, "glVertexAttrib1sARB")
1310                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1dARB, "glVertexAttrib1dARB")
1311                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2fARB, "glVertexAttrib2fARB")
1312                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2sARB, "glVertexAttrib2sARB")
1313                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2dARB, "glVertexAttrib2dARB")
1314                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3fARB, "glVertexAttrib3fARB")
1315                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3sARB, "glVertexAttrib3sARB")
1316                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3dARB, "glVertexAttrib3dARB")
1317                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4fARB, "glVertexAttrib4fARB")
1318                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4sARB, "glVertexAttrib4sARB")
1319                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4dARB, "glVertexAttrib4dARB")
1320                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NubARB, "glVertexAttrib4NubARB")
1321                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1fvARB, "glVertexAttrib1fvARB")
1322                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1svARB, "glVertexAttrib1svARB")
1323                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1dvARB, "glVertexAttrib1dvARB")
1324                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2fvARB, "glVertexAttrib2fvARB")
1325                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2svARB, "glVertexAttrib2svARB")
1326                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2dvARB, "glVertexAttrib2dvARB")
1327                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3fvARB, "glVertexAttrib3fvARB")
1328                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3svARB, "glVertexAttrib3svARB")
1329                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3dvARB, "glVertexAttrib3dvARB")
1330                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4fvARB, "glVertexAttrib4fvARB")
1331                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4svARB, "glVertexAttrib4svARB")
1332                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4dvARB, "glVertexAttrib4dvARB")
1333                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4ivARB, "glVertexAttrib4ivARB")
1334                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4bvARB, "glVertexAttrib4bvARB")
1335                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4ubvARB, "glVertexAttrib4ubvARB")
1336                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4usvARB, "glVertexAttrib4usvARB")
1337                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4uivARB, "glVertexAttrib4uivARB")
1338                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NbvARB, "glVertexAttrib4NbvARB")
1339                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NsvARB, "glVertexAttrib4NsvARB")
1340                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NivARB, "glVertexAttrib4NivARB")
1341                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NubvARB, "glVertexAttrib4NubvARB")
1342                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NusvARB, "glVertexAttrib4NusvARB")
1343                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4NuivARB, "glVertexAttrib4NuivARB")
1344                 && QGL_constructExtensionFunc(table.m_glVertexAttribPointerARB, "glVertexAttribPointerARB")
1345                 && QGL_constructExtensionFunc(table.m_glEnableVertexAttribArrayARB, "glEnableVertexAttribArrayARB")
1346                 && QGL_constructExtensionFunc(table.m_glDisableVertexAttribArrayARB, "glDisableVertexAttribArrayARB")
1347                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribdvARB, "glGetVertexAttribdvARB")
1348                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribfvARB, "glGetVertexAttribfvARB")
1349                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribivARB, "glGetVertexAttribivARB")
1350                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribPointervARB, "glGetVertexAttribPointervARB")
1351                 && QGL_constructExtensionFunc(table.m_glBindAttribLocationARB, "glBindAttribLocationARB")
1352                 && QGL_constructExtensionFunc(table.m_glGetActiveAttribARB, "glGetActiveAttribARB")
1353                 && QGL_constructExtensionFunc(table.m_glGetAttribLocationARB, "glGetAttribLocationARB");
1354
1355         if (!table.support_ARB_vertex_shader) {
1356             extension_not_implemented("GL_ARB_vertex_shader");
1357         }
1358     } else {
1359         table.support_ARB_vertex_shader = false;
1360     }
1361
1362     if (QGL_ExtensionSupported("GL_NV_vertex_program2")) {
1363         table.support_NV_vertex_program2 =
1364                 QGL_constructExtensionFunc(table.m_glAreProgramsResidentNV, "glAreProgramsResidentNV")
1365                 && QGL_constructExtensionFunc(table.m_glBindProgramNV, "glBindProgramNV")
1366                 && QGL_constructExtensionFunc(table.m_glDeleteProgramsNV, "glDeleteProgramsNV")
1367                 && QGL_constructExtensionFunc(table.m_glExecuteProgramNV, "glExecuteProgramNV")
1368                 && QGL_constructExtensionFunc(table.m_glGenProgramsNV, "glGenProgramsNV")
1369                 && QGL_constructExtensionFunc(table.m_glGetProgramParameterdvNV, "glGetProgramParameterdvNV")
1370                 && QGL_constructExtensionFunc(table.m_glGetProgramParameterfvNV, "glGetProgramParameterfvNV")
1371                 && QGL_constructExtensionFunc(table.m_glGetProgramivNV, "glGetProgramivNV")
1372                 && QGL_constructExtensionFunc(table.m_glGetProgramStringNV, "glGetProgramStringNV")
1373                 && QGL_constructExtensionFunc(table.m_glGetTrackMatrixivNV, "glGetTrackMatrixivNV")
1374                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribdvNV, "glGetVertexAttribdvNV")
1375                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribfvNV, "glGetVertexAttribfvNV")
1376                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribivNV, "glGetVertexAttribivNV")
1377                 && QGL_constructExtensionFunc(table.m_glGetVertexAttribPointervNV, "glGetVertexAttribPointervNV")
1378                 && QGL_constructExtensionFunc(table.m_glIsProgramNV, "glIsProgramNV")
1379                 && QGL_constructExtensionFunc(table.m_glLoadProgramNV, "glLoadProgramNV")
1380                 && QGL_constructExtensionFunc(table.m_glProgramParameter4fNV, "glProgramParameter4fNV")
1381                 && QGL_constructExtensionFunc(table.m_glProgramParameter4fvNV, "glProgramParameter4fvNV")
1382                 && QGL_constructExtensionFunc(table.m_glProgramParameters4fvNV, "glProgramParameters4fvNV")
1383                 && QGL_constructExtensionFunc(table.m_glRequestResidentProgramsNV, "glRequestResidentProgramsNV")
1384                 && QGL_constructExtensionFunc(table.m_glTrackMatrixNV, "glTrackMatrixNV")
1385                 && QGL_constructExtensionFunc(table.m_glVertexAttribPointerNV, "glVertexAttribPointerNV")
1386                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1fNV, "glVertexAttrib1fNV")
1387                 && QGL_constructExtensionFunc(table.m_glVertexAttrib1fvNV, "glVertexAttrib1fvNV")
1388                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2fNV, "glVertexAttrib2fNV")
1389                 && QGL_constructExtensionFunc(table.m_glVertexAttrib2fvNV, "glVertexAttrib2fvNV")
1390                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3fNV, "glVertexAttrib3fNV")
1391                 && QGL_constructExtensionFunc(table.m_glVertexAttrib3fvNV, "glVertexAttrib3fvNV")
1392                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4fNV, "glVertexAttrib4fNV")
1393                 && QGL_constructExtensionFunc(table.m_glVertexAttrib4fvNV, "glVertexAttrib4fvNV")
1394                 && QGL_constructExtensionFunc(table.m_glVertexAttribs1fvNV, "glVertexAttribs1fvNV")
1395                 && QGL_constructExtensionFunc(table.m_glVertexAttribs2fvNV, "glVertexAttribs2fvNV")
1396                 && QGL_constructExtensionFunc(table.m_glVertexAttribs3fvNV, "glVertexAttribs3fvNV")
1397                 && QGL_constructExtensionFunc(table.m_glVertexAttribs4fvNV, "glVertexAttribs4fvNV");
1398
1399         if (!table.support_NV_vertex_program2) {
1400             extension_not_implemented("GL_NV_vertex_program2");
1401         }
1402     } else {
1403         table.support_NV_vertex_program2 = false;
1404         QGL_invalidateExtensionFunc(table.m_glAreProgramsResidentNV);
1405         QGL_invalidateExtensionFunc(table.m_glBindProgramNV);
1406         QGL_invalidateExtensionFunc(table.m_glDeleteProgramsNV);
1407         QGL_invalidateExtensionFunc(table.m_glExecuteProgramNV);
1408         QGL_invalidateExtensionFunc(table.m_glGenProgramsNV);
1409         QGL_invalidateExtensionFunc(table.m_glGetProgramParameterdvNV);
1410         QGL_invalidateExtensionFunc(table.m_glGetProgramParameterfvNV);
1411         QGL_invalidateExtensionFunc(table.m_glGetProgramivNV);
1412         QGL_invalidateExtensionFunc(table.m_glGetProgramStringNV);
1413         QGL_invalidateExtensionFunc(table.m_glGetTrackMatrixivNV);
1414         QGL_invalidateExtensionFunc(table.m_glGetVertexAttribdvNV);
1415         QGL_invalidateExtensionFunc(table.m_glGetVertexAttribfvNV);
1416         QGL_invalidateExtensionFunc(table.m_glGetVertexAttribivNV);
1417         QGL_invalidateExtensionFunc(table.m_glGetVertexAttribPointervNV);
1418         QGL_invalidateExtensionFunc(table.m_glIsProgramNV);
1419         QGL_invalidateExtensionFunc(table.m_glLoadProgramNV);
1420         QGL_invalidateExtensionFunc(table.m_glProgramParameter4fNV);
1421         QGL_invalidateExtensionFunc(table.m_glProgramParameter4fvNV);
1422         QGL_invalidateExtensionFunc(table.m_glProgramParameters4fvNV);
1423         QGL_invalidateExtensionFunc(table.m_glRequestResidentProgramsNV);
1424         QGL_invalidateExtensionFunc(table.m_glTrackMatrixNV);
1425         QGL_invalidateExtensionFunc(table.m_glVertexAttribPointerNV);
1426         QGL_invalidateExtensionFunc(table.m_glVertexAttrib1fNV);
1427         QGL_invalidateExtensionFunc(table.m_glVertexAttrib1fvNV);
1428         QGL_invalidateExtensionFunc(table.m_glVertexAttrib2fNV);
1429         QGL_invalidateExtensionFunc(table.m_glVertexAttrib2fvNV);
1430         QGL_invalidateExtensionFunc(table.m_glVertexAttrib3fNV);
1431         QGL_invalidateExtensionFunc(table.m_glVertexAttrib3fvNV);
1432         QGL_invalidateExtensionFunc(table.m_glVertexAttrib4fNV);
1433         QGL_invalidateExtensionFunc(table.m_glVertexAttrib4fvNV);
1434         QGL_invalidateExtensionFunc(table.m_glVertexAttribs1fvNV);
1435         QGL_invalidateExtensionFunc(table.m_glVertexAttribs2fvNV);
1436         QGL_invalidateExtensionFunc(table.m_glVertexAttribs3fvNV);
1437         QGL_invalidateExtensionFunc(table.m_glVertexAttribs4fvNV);
1438     }
1439
1440     if (QGL_ExtensionSupported("GL_NV_fragment_program")) {
1441         table.support_NV_fragment_program =
1442                 QGL_constructExtensionFunc(table.m_glProgramNamedParameter4fNV, "glProgramNamedParameter4fNV")
1443                 && QGL_constructExtensionFunc(table.m_glProgramNamedParameter4fvNV, "glProgramNamedParameter4fvNV")
1444                 && QGL_constructExtensionFunc(table.m_glGetProgramNamedParameterfvNV, "glGetProgramNamedParameterfvNV");
1445
1446         if (!table.support_NV_fragment_program) {
1447             extension_not_implemented("GL_NV_fragment_program");
1448         }
1449     } else {
1450         table.support_NV_fragment_program = false;
1451     }
1452
1453     table.support_ARB_fragment_shader = QGL_ExtensionSupported("GL_ARB_fragment_shader");
1454     table.support_ARB_shading_language_100 = QGL_ExtensionSupported("GL_ARB_shading_language_100");
1455
1456     if (QGL_ExtensionSupported("GL_EXT_texture_filter_anisotropic")) {
1457         glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &g_maxTextureAnisotropy);
1458         globalOutputStream() << "Anisotropic filtering possible (max " << g_maxTextureAnisotropy << "x)\n";
1459     } else {
1460         globalOutputStream() << "No Anisotropic filtering available\n";
1461         g_maxTextureAnisotropy = 0;
1462     }
1463 }
1464
1465 void QGL_sharedContextDestroyed(OpenGLBinding &table)
1466 {
1467     QGL_clear(table);
1468 }
1469
1470
1471 void QGL_assertNoErrors(const char *file, int line)
1472 {
1473     GLenum error = GlobalOpenGL().m_glGetError();
1474     while (error != GL_NO_ERROR) {
1475         const char *errorString = reinterpret_cast<const char *>( qgluErrorString(error));
1476         if (error == GL_OUT_OF_MEMORY) {
1477             ERROR_MESSAGE("OpenGL out of memory error at " << file << ":" << line << ": " << errorString);
1478         } else {
1479             ERROR_MESSAGE("OpenGL error at " << file << ":" << line << ": " << errorString);
1480         }
1481         error = GlobalOpenGL().m_glGetError();
1482     }
1483 }
1484
1485
1486 class QglAPI {
1487     OpenGLBinding m_qgl;
1488 public:
1489     typedef OpenGLBinding Type;
1490
1491     STRING_CONSTANT(Name, "*");
1492
1493     QglAPI()
1494     {
1495         QGL_Init(m_qgl);
1496
1497         m_qgl.assertNoErrors = &QGL_assertNoErrors;
1498     }
1499
1500     ~QglAPI()
1501     {
1502         QGL_Shutdown(m_qgl);
1503     }
1504
1505     OpenGLBinding *getTable()
1506     {
1507         return &m_qgl;
1508     }
1509 };
1510
1511 #include "modulesystem/singletonmodule.h"
1512 #include "modulesystem/moduleregistry.h"
1513
1514 typedef SingletonModule<QglAPI> QglModule;
1515 typedef Static<QglModule> StaticQglModule;
1516 StaticRegisterModule staticRegisterQgl(StaticQglModule::instance());