Update spec to build Qt 5.0
[profile/ivi/qtbase.git] / src / gui / opengl / qopenglfunctions.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qopenglfunctions.h"
43 #include "qopenglextensions_p.h"
44 #include "qdebug.h"
45 #include "QtGui/private/qopenglcontext_p.h"
46 #include "QtGui/private/qopengl_p.h"
47
48 QT_BEGIN_NAMESPACE
49
50 /*!
51     \class QOpenGLFunctions
52     \brief The QOpenGLFunctions class provides cross-platform access to the OpenGL/ES 2.0 API.
53     \since 5.0
54     \ingroup painting-3D
55     \inmodule QtGui
56
57     OpenGL/ES 2.0 defines a subset of the OpenGL specification that is
58     common across many desktop and embedded OpenGL implementations.
59     However, it can be difficult to use the functions from that subset
60     because they need to be resolved manually on desktop systems.
61
62     QOpenGLFunctions provides a guaranteed API that is available on all
63     OpenGL systems and takes care of function resolution on systems
64     that need it.  The recommended way to use QOpenGLFunctions is by
65     direct inheritance:
66
67     \code
68     class MyGLWindow : public QWindow, protected QOpenGLFunctions
69     {
70         Q_OBJECT
71     public:
72         MyGLWindow(QScreen *screen = 0);
73
74     protected:
75         void initializeGL();
76         void paintGL();
77
78         QOpenGLContext *m_context;
79     };
80
81     MyGLWindow(QScreen *screen)
82       : QWindow(screen), QOpenGLWidget(parent)
83     {
84         setSurfaceType(OpenGLSurface);
85         create();
86
87         // Create an OpenGL context
88         m_context = new QOpenGLContext;
89         m_context->create();
90
91         // Setup scene and render it
92         initializeGL();
93         paintGL()
94     }
95
96     void MyGLWindow::initializeGL()
97     {
98         m_context->makeCurrent(this);
99         initializeOpenGLFunctions();
100     }
101     \endcode
102
103     The \c{paintGL()} function can then use any of the OpenGL/ES 2.0
104     functions without explicit resolution, such as glActiveTexture()
105     in the following example:
106
107     \code
108     void MyGLWindow::paintGL()
109     {
110         m_context->makeCurrent(this);
111         glActiveTexture(GL_TEXTURE1);
112         glBindTexture(GL_TEXTURE_2D, textureId);
113         ...
114         m_context->swapBuffers(this);
115         m_context->doneCurrent();
116     }
117     \endcode
118
119     QOpenGLFunctions can also be used directly for ad-hoc invocation
120     of OpenGL/ES 2.0 functions on all platforms:
121
122     \code
123     QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
124     glFuncs.glActiveTexture(GL_TEXTURE1);
125     \endcode
126
127     QOpenGLFunctions provides wrappers for all OpenGL/ES 2.0 functions,
128     except those like \c{glDrawArrays()}, \c{glViewport()}, and
129     \c{glBindTexture()} that don't have portability issues.
130
131     The hasOpenGLFeature() and openGLFeatures() functions can be used
132     to determine if the OpenGL implementation has a major OpenGL/ES 2.0
133     feature.  For example, the following checks if non power of two
134     textures are available:
135
136     \code
137     QOpenGLFunctions funcs(QOpenGLContext::currentContext());
138     bool npot = funcs.hasOpenGLFeature(QOpenGLFunctions::NPOTTextures);
139     \endcode
140 */
141
142 /*!
143     \enum QOpenGLFunctions::OpenGLFeature
144     This enum defines OpenGL/ES 2.0 features that may be optional
145     on other platforms.
146
147     \value Multitexture glActiveTexture() function is available.
148     \value Shaders Shader functions are available.
149     \value Buffers Vertex and index buffer functions are available.
150     \value Framebuffers Framebuffer object functions are available.
151     \value BlendColor glBlendColor() is available.
152     \value BlendEquation glBlendEquation() is available.
153     \value BlendEquationSeparate glBlendEquationSeparate() is available.
154     \value BlendFuncSeparate glBlendFuncSeparate() is available.
155     \value BlendSubtract Blend subtract mode is available.
156     \value CompressedTextures Compressed texture functions are available.
157     \value Multisample glSampleCoverage() function is available.
158     \value StencilSeparate Separate stencil functions are available.
159     \value NPOTTextures Non power of two textures are available.
160     \value NPOTTextureRepeat Non power of two textures can use GL_REPEAT as wrap parameter.
161 */
162
163 // Hidden private fields for additional extension data.
164 struct QOpenGLFunctionsPrivateEx : public QOpenGLExtensionsPrivate, public QOpenGLSharedResource
165 {
166     QOpenGLFunctionsPrivateEx(QOpenGLContext *context)
167         : QOpenGLExtensionsPrivate(context)
168         , QOpenGLSharedResource(context->shareGroup())
169         , m_features(-1)
170         , m_extensions(-1)
171     {}
172
173     void invalidateResource()
174     {
175         m_features = -1;
176         m_extensions = -1;
177     }
178
179     void freeResource(QOpenGLContext *)
180     {
181         // no gl resources to free
182     }
183
184     int m_features;
185     int m_extensions;
186 };
187
188 Q_GLOBAL_STATIC(QOpenGLMultiGroupSharedResource, qt_gl_functions_resource)
189
190 static QOpenGLFunctionsPrivateEx *qt_gl_functions(QOpenGLContext *context = 0)
191 {
192     if (!context)
193         context = QOpenGLContext::currentContext();
194     Q_ASSERT(context);
195     QOpenGLFunctionsPrivateEx *funcs =
196         qt_gl_functions_resource()->value<QOpenGLFunctionsPrivateEx>(context);
197     return funcs;
198 }
199
200 /*!
201     Constructs a default function resolver. The resolver cannot
202     be used until initializeOpenGLFunctions() is called to specify
203     the context.
204
205     \sa initializeOpenGLFunctions()
206 */
207 QOpenGLFunctions::QOpenGLFunctions()
208     : d_ptr(0)
209 {
210 }
211
212 /*!
213     Constructs a function resolver for \a context.  If \a context
214     is null, then the resolver will be created for the current QOpenGLContext.
215
216     The context or another context in the group must be current.
217
218     An object constructed in this way can only be used with \a context
219     and other contexts that share with it.  Use initializeOpenGLFunctions()
220     to change the object's context association.
221
222     \sa initializeOpenGLFunctions()
223 */
224 QOpenGLFunctions::QOpenGLFunctions(QOpenGLContext *context)
225     : d_ptr(0)
226 {
227     if (context && QOpenGLContextGroup::currentContextGroup() == context->shareGroup())
228         d_ptr = qt_gl_functions(context);
229     else
230         qWarning() << "QOpenGLFunctions created with non-current context";
231 }
232
233 QOpenGLExtensions::QOpenGLExtensions()
234     : QOpenGLFunctions()
235 {
236 }
237
238 QOpenGLExtensions::QOpenGLExtensions(QOpenGLContext *context)
239     : QOpenGLFunctions(context)
240 {
241 }
242
243 /*!
244     \fn QOpenGLFunctions::~QOpenGLFunctions()
245
246     Destroys this function resolver.
247 */
248
249 static int qt_gl_resolve_features()
250 {
251 #if defined(QT_OPENGL_ES_2)
252     int features = QOpenGLFunctions::Multitexture |
253                    QOpenGLFunctions::Shaders |
254                    QOpenGLFunctions::Buffers |
255                    QOpenGLFunctions::Framebuffers |
256                    QOpenGLFunctions::BlendColor |
257                    QOpenGLFunctions::BlendEquation |
258                    QOpenGLFunctions::BlendEquationSeparate |
259                    QOpenGLFunctions::BlendFuncSeparate |
260                    QOpenGLFunctions::BlendSubtract |
261                    QOpenGLFunctions::CompressedTextures |
262                    QOpenGLFunctions::Multisample |
263                    QOpenGLFunctions::StencilSeparate;
264     QOpenGLExtensionMatcher extensions;
265     if (extensions.match("GL_IMG_texture_npot"))
266         features |= QOpenGLFunctions::NPOTTextures;
267     if (extensions.match("GL_OES_texture_npot"))
268         features |= QOpenGLFunctions::NPOTTextures |
269                     QOpenGLFunctions::NPOTTextureRepeat;
270     return features;
271 #elif defined(QT_OPENGL_ES)
272     int features = QOpenGLFunctions::Multitexture |
273                    QOpenGLFunctions::Buffers |
274                    QOpenGLFunctions::CompressedTextures |
275                    QOpenGLFunctions::Multisample;
276     QOpenGLExtensionMatcher extensions;
277     if (extensions.match("GL_OES_framebuffer_object"))
278         features |= QOpenGLFunctions::Framebuffers;
279     if (extensions.match("GL_OES_blend_equation_separate"))
280         features |= QOpenGLFunctions::BlendEquationSeparate;
281     if (extensions.match("GL_OES_blend_func_separate"))
282         features |= QOpenGLFunctions::BlendFuncSeparate;
283     if (extensions.match("GL_OES_blend_subtract"))
284         features |= QOpenGLFunctions::BlendSubtract;
285     if (extensions.match("GL_OES_texture_npot"))
286         features |= QOpenGLFunctions::NPOTTextures;
287     if (extensions.match("GL_IMG_texture_npot"))
288         features |= QOpenGLFunctions::NPOTTextures;
289     return features;
290 #else
291     int features = 0;
292     //QOpenGLFormat::OpenGLVersionFlags versions = QOpenGLFormat::openGLVersionFlags();
293     QOpenGLExtensionMatcher extensions;
294
295     // Recognize features by extension name.
296     if (extensions.match("GL_ARB_multitexture"))
297         features |= QOpenGLFunctions::Multitexture;
298     if (extensions.match("GL_ARB_shader_objects"))
299         features |= QOpenGLFunctions::Shaders;
300     if (extensions.match("GL_EXT_framebuffer_object") ||
301             extensions.match("GL_ARB_framebuffer_object"))
302         features |= QOpenGLFunctions::Framebuffers;
303     if (extensions.match("GL_EXT_blend_color"))
304         features |= QOpenGLFunctions::BlendColor;
305     if (extensions.match("GL_EXT_blend_equation_separate"))
306         features |= QOpenGLFunctions::BlendEquationSeparate;
307     if (extensions.match("GL_EXT_blend_func_separate"))
308         features |= QOpenGLFunctions::BlendFuncSeparate;
309     if (extensions.match("GL_EXT_blend_subtract"))
310         features |= QOpenGLFunctions::BlendSubtract;
311     if (extensions.match("GL_ARB_texture_compression"))
312         features |= QOpenGLFunctions::CompressedTextures;
313     if (extensions.match("GL_ARB_multisample"))
314         features |= QOpenGLFunctions::Multisample;
315     if (extensions.match("GL_ARB_texture_non_power_of_two"))
316         features |= QOpenGLFunctions::NPOTTextures;
317
318     // assume version 2.0 or higher
319     features |= QOpenGLFunctions::BlendColor |
320                 QOpenGLFunctions::BlendEquation |
321                 QOpenGLFunctions::Multitexture |
322                 QOpenGLFunctions::CompressedTextures |
323                 QOpenGLFunctions::Multisample |
324                 QOpenGLFunctions::BlendFuncSeparate |
325                 QOpenGLFunctions::Buffers |
326                 QOpenGLFunctions::Shaders |
327                 QOpenGLFunctions::StencilSeparate |
328                 QOpenGLFunctions::BlendEquationSeparate |
329                 QOpenGLFunctions::NPOTTextures;
330     return features;
331 #endif
332 }
333
334 static int qt_gl_resolve_extensions()
335 {
336     int extensions = 0;
337     QOpenGLExtensionMatcher extensionMatcher;
338 #if defined(QT_OPENGL_ES)
339     if (extensionMatcher.match("GL_OES_mapbuffer"))
340         extensions |= QOpenGLExtensions::MapBuffer;
341     if (extensionMatcher.match("GL_OES_packed_depth_stencil"))
342         extensions |= QOpenGLExtensions::PackedDepthStencil;
343     if (extensionMatcher.match("GL_OES_element_index_uint"))
344         extensions |= QOpenGLExtensions::ElementIndexUint;
345     if (extensionMatcher.match("GL_OES_depth24"))
346         extensions |= QOpenGLExtensions::Depth24;
347
348     if (extensionMatcher.match("GL_EXT_bgra"))
349         extensions |= QOpenGLExtensions::BGRATextureFormat;
350
351 #else
352     extensions |= QOpenGLExtensions::ElementIndexUint | QOpenGLExtensions::MapBuffer;
353
354     // Recognize features by extension name.
355     if (extensionMatcher.match("GL_ARB_framebuffer_object")) {
356         extensions |= QOpenGLExtensions::FramebufferMultisample |
357                       QOpenGLExtensions::FramebufferBlit |
358                       QOpenGLExtensions::PackedDepthStencil;
359     } else {
360         if (extensionMatcher.match("GL_EXT_framebuffer_multisample"))
361             extensions |= QOpenGLExtensions::FramebufferMultisample;
362         if (extensionMatcher.match("GL_EXT_framebuffer_blit"))
363             extensions |= QOpenGLExtensions::FramebufferBlit;
364         if (extensionMatcher.match("GL_EXT_packed_depth_stencil"))
365             extensions |= QOpenGLExtensions::PackedDepthStencil;
366     }
367 #endif
368     return extensions;
369 }
370
371 /*!
372     Returns the set of features that are present on this system's
373     OpenGL implementation.
374
375     It is assumed that the QOpenGLContext associated with this function
376     resolver is current.
377
378     \sa hasOpenGLFeature()
379 */
380 QOpenGLFunctions::OpenGLFeatures QOpenGLFunctions::openGLFeatures() const
381 {
382     QOpenGLFunctionsPrivateEx *d = static_cast<QOpenGLFunctionsPrivateEx *>(d_ptr);
383     if (!d)
384         return 0;
385     if (d->m_features == -1)
386         d->m_features = qt_gl_resolve_features();
387     return QOpenGLFunctions::OpenGLFeatures(d->m_features);
388 }
389
390 /*!
391     Returns true if \a feature is present on this system's OpenGL
392     implementation; false otherwise.
393
394     It is assumed that the QOpenGLContext associated with this function
395     resolver is current.
396
397     \sa openGLFeatures()
398 */
399 bool QOpenGLFunctions::hasOpenGLFeature(QOpenGLFunctions::OpenGLFeature feature) const
400 {
401     QOpenGLFunctionsPrivateEx *d = static_cast<QOpenGLFunctionsPrivateEx *>(d_ptr);
402     if (!d)
403         return false;
404     if (d->m_features == -1)
405         d->m_features = qt_gl_resolve_features();
406     return (d->m_features & int(feature)) != 0;
407 }
408
409 /*!
410     Returns the set of extensions that are present on this system's
411     OpenGL implementation.
412
413     It is assumed that the QOpenGLContext associated with this extension
414     resolver is current.
415
416     \sa hasOpenGLExtensions()
417 */
418 QOpenGLExtensions::OpenGLExtensions QOpenGLExtensions::openGLExtensions()
419 {
420     QOpenGLFunctionsPrivateEx *d = static_cast<QOpenGLFunctionsPrivateEx *>(d_ptr);
421     if (!d)
422         return 0;
423     if (d->m_extensions == -1)
424         d->m_extensions = qt_gl_resolve_extensions();
425     return QOpenGLExtensions::OpenGLExtensions(d->m_extensions);
426 }
427
428 /*!
429     Returns true if \a extension is present on this system's OpenGL
430     implementation; false otherwise.
431
432     It is assumed that the QOpenGLContext associated with this extension
433     resolver is current.
434
435     \sa openGLFeatures()
436 */
437 bool QOpenGLExtensions::hasOpenGLExtension(QOpenGLExtensions::OpenGLExtension extension) const
438 {
439     QOpenGLFunctionsPrivateEx *d = static_cast<QOpenGLFunctionsPrivateEx *>(d_ptr);
440     if (!d)
441         return false;
442     if (d->m_extensions == -1)
443         d->m_extensions = qt_gl_resolve_extensions();
444     return (d->m_extensions & int(extension)) != 0;
445 }
446
447 /*!
448     \fn void QOpenGLFunctions::initializeGLFunctions()
449     \obsolete
450
451     Use initializeOpenGLFunctions() instead.
452 */
453
454 /*!
455     Initializes OpenGL function resolution for the current context.
456
457     After calling this function, the QOpenGLFunctions object can only be
458     used with the current context and other contexts that share with it.
459     Call initializeOpenGLFunctions() again to change the object's context
460     association.
461 */
462 void QOpenGLFunctions::initializeOpenGLFunctions()
463 {
464     d_ptr = qt_gl_functions();
465 }
466
467 /*!
468     \fn void QOpenGLFunctions::glActiveTexture(GLenum texture)
469
470     Convenience function that calls glActiveTexture(\a texture).
471
472     For more information, see the OpenGL/ES 2.0 documentation for
473     \l{http://www.khronos.org/opengles/sdk/docs/man/glActiveTexture.xml}{glActiveTexture()}.
474 */
475
476 /*!
477     \fn void QOpenGLFunctions::glAttachShader(GLuint program, GLuint shader)
478
479     Convenience function that calls glAttachShader(\a program, \a shader).
480
481     For more information, see the OpenGL/ES 2.0 documentation for
482     \l{http://www.khronos.org/opengles/sdk/docs/man/glAttachShader.xml}{glAttachShader()}.
483
484     This convenience function will do nothing on OpenGL/ES 1.x systems.
485 */
486
487 /*!
488     \fn void QOpenGLFunctions::glBindAttribLocation(GLuint program, GLuint index, const char* name)
489
490     Convenience function that calls glBindAttribLocation(\a program, \a index, \a name).
491
492     For more information, see the OpenGL/ES 2.0 documentation for
493     \l{http://www.khronos.org/opengles/sdk/docs/man/glBindAttribLocation.xml}{glBindAttribLocation()}.
494
495     This convenience function will do nothing on OpenGL/ES 1.x systems.
496 */
497
498 /*!
499     \fn void QOpenGLFunctions::glBindBuffer(GLenum target, GLuint buffer)
500
501     Convenience function that calls glBindBuffer(\a target, \a buffer).
502
503     For more information, see the OpenGL/ES 2.0 documentation for
504     \l{http://www.khronos.org/opengles/sdk/docs/man/glBindBuffer.xml}{glBindBuffer()}.
505 */
506
507 /*!
508     \fn void QOpenGLFunctions::glBindFramebuffer(GLenum target, GLuint framebuffer)
509
510     Convenience function that calls glBindFramebuffer(\a target, \a framebuffer).
511
512     Note that Qt will translate a \a framebuffer argument of 0 to the currently
513     bound QOpenGLContext's defaultFramebufferObject().
514
515     For more information, see the OpenGL/ES 2.0 documentation for
516     \l{http://www.khronos.org/opengles/sdk/docs/man/glBindFramebuffer.xml}{glBindFramebuffer()}.
517 */
518
519 /*!
520     \fn void QOpenGLFunctions::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
521
522     Convenience function that calls glBindRenderbuffer(\a target, \a renderbuffer).
523
524     For more information, see the OpenGL/ES 2.0 documentation for
525     \l{http://www.khronos.org/opengles/sdk/docs/man/glBindRenderbuffer.xml}{glBindRenderbuffer()}.
526 */
527
528 /*!
529     \fn void QOpenGLFunctions::glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
530
531     Convenience function that calls glBlendColor(\a red, \a green, \a blue, \a alpha).
532
533     For more information, see the OpenGL/ES 2.0 documentation for
534     \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendColor.xml}{glBlendColor()}.
535 */
536
537 /*!
538     \fn void QOpenGLFunctions::glBlendEquation(GLenum mode)
539
540     Convenience function that calls glBlendEquation(\a mode).
541
542     For more information, see the OpenGL/ES 2.0 documentation for
543     \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendEquation.xml}{glBlendEquation()}.
544 */
545
546 /*!
547     \fn void QOpenGLFunctions::glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
548
549     Convenience function that calls glBlendEquationSeparate(\a modeRGB, \a modeAlpha).
550
551     For more information, see the OpenGL/ES 2.0 documentation for
552     \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendEquationSeparate.xml}{glBlendEquationSeparate()}.
553 */
554
555 /*!
556     \fn void QOpenGLFunctions::glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
557
558     Convenience function that calls glBlendFuncSeparate(\a srcRGB, \a dstRGB, \a srcAlpha, \a dstAlpha).
559
560     For more information, see the OpenGL/ES 2.0 documentation for
561     \l{http://www.khronos.org/opengles/sdk/docs/man/glBlendFuncSeparate.xml}{glBlendFuncSeparate()}.
562 */
563
564 /*!
565     \fn void QOpenGLFunctions::glBufferData(GLenum target, qopengl_GLsizeiptr size, const void* data, GLenum usage)
566
567     Convenience function that calls glBufferData(\a target, \a size, \a data, \a usage).
568
569     For more information, see the OpenGL/ES 2.0 documentation for
570     \l{http://www.khronos.org/opengles/sdk/docs/man/glBufferData.xml}{glBufferData()}.
571 */
572
573 /*!
574     \fn void QOpenGLFunctions::glBufferSubData(GLenum target, qopengl_GLintptr offset, qopengl_GLsizeiptr size, const void* data)
575
576     Convenience function that calls glBufferSubData(\a target, \a offset, \a size, \a data).
577
578     For more information, see the OpenGL/ES 2.0 documentation for
579     \l{http://www.khronos.org/opengles/sdk/docs/man/glBufferSubData.xml}{glBufferSubData()}.
580 */
581
582 /*!
583     \fn GLenum QOpenGLFunctions::glCheckFramebufferStatus(GLenum target)
584
585     Convenience function that calls glCheckFramebufferStatus(\a target).
586
587     For more information, see the OpenGL/ES 2.0 documentation for
588     \l{http://www.khronos.org/opengles/sdk/docs/man/glCheckFramebufferStatus.xml}{glCheckFramebufferStatus()}.
589 */
590
591 /*!
592     \fn void QOpenGLFunctions::glClearDepthf(GLclampf depth)
593
594     Convenience function that calls glClearDepth(\a depth) on
595     desktop OpenGL systems and glClearDepthf(\a depth) on
596     embedded OpenGL/ES systems.
597
598     For more information, see the OpenGL/ES 2.0 documentation for
599     \l{http://www.khronos.org/opengles/sdk/docs/man/glClearDepthf.xml}{glClearDepthf()}.
600 */
601
602 /*!
603     \fn void QOpenGLFunctions::glCompileShader(GLuint shader)
604
605     Convenience function that calls glCompileShader(\a shader).
606
607     For more information, see the OpenGL/ES 2.0 documentation for
608     \l{http://www.khronos.org/opengles/sdk/docs/man/glCompileShader.xml}{glCompileShader()}.
609
610     This convenience function will do nothing on OpenGL/ES 1.x systems.
611 */
612
613 /*!
614     \fn void QOpenGLFunctions::glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
615
616     Convenience function that calls glCompressedTexImage2D(\a target, \a level, \a internalformat, \a width, \a height, \a border, \a imageSize, \a data).
617
618     For more information, see the OpenGL/ES 2.0 documentation for
619     \l{http://www.khronos.org/opengles/sdk/docs/man/glCompressedTexImage2D.xml}{glCompressedTexImage2D()}.
620 */
621
622 /*!
623     \fn void QOpenGLFunctions::glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
624
625     Convenience function that calls glCompressedTexSubImage2D(\a target, \a level, \a xoffset, \a yoffset, \a width, \a height, \a format, \a imageSize, \a data).
626
627     For more information, see the OpenGL/ES 2.0 documentation for
628     \l{http://www.khronos.org/opengles/sdk/docs/man/glCompressedTexSubImage2D.xml}{glCompressedTexSubImage2D()}.
629 */
630
631 /*!
632     \fn GLuint QOpenGLFunctions::glCreateProgram()
633
634     Convenience function that calls glCreateProgram().
635
636     For more information, see the OpenGL/ES 2.0 documentation for
637     \l{http://www.khronos.org/opengles/sdk/docs/man/glCreateProgram.xml}{glCreateProgram()}.
638
639     This convenience function will do nothing on OpenGL/ES 1.x systems.
640 */
641
642 /*!
643     \fn GLuint QOpenGLFunctions::glCreateShader(GLenum type)
644
645     Convenience function that calls glCreateShader(\a type).
646
647     For more information, see the OpenGL/ES 2.0 documentation for
648     \l{http://www.khronos.org/opengles/sdk/docs/man/glCreateShader.xml}{glCreateShader()}.
649
650     This convenience function will do nothing on OpenGL/ES 1.x systems.
651 */
652
653 /*!
654     \fn void QOpenGLFunctions::glDeleteBuffers(GLsizei n, const GLuint* buffers)
655
656     Convenience function that calls glDeleteBuffers(\a n, \a buffers).
657
658     For more information, see the OpenGL/ES 2.0 documentation for
659     \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteBuffers.xml}{glDeleteBuffers()}.
660 */
661
662 /*!
663     \fn void QOpenGLFunctions::glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
664
665     Convenience function that calls glDeleteFramebuffers(\a n, \a framebuffers).
666
667     For more information, see the OpenGL/ES 2.0 documentation for
668     \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteFramebuffers.xml}{glDeleteFramebuffers()}.
669 */
670
671 /*!
672     \fn void QOpenGLFunctions::glDeleteProgram(GLuint program)
673
674     Convenience function that calls glDeleteProgram(\a program).
675
676     For more information, see the OpenGL/ES 2.0 documentation for
677     \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteProgram.xml}{glDeleteProgram()}.
678
679     This convenience function will do nothing on OpenGL/ES 1.x systems.
680 */
681
682 /*!
683     \fn void QOpenGLFunctions::glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
684
685     Convenience function that calls glDeleteRenderbuffers(\a n, \a renderbuffers).
686
687     For more information, see the OpenGL/ES 2.0 documentation for
688     \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteRenderbuffers.xml}{glDeleteRenderbuffers()}.
689 */
690
691 /*!
692     \fn void QOpenGLFunctions::glDeleteShader(GLuint shader)
693
694     Convenience function that calls glDeleteShader(\a shader).
695
696     For more information, see the OpenGL/ES 2.0 documentation for
697     \l{http://www.khronos.org/opengles/sdk/docs/man/glDeleteShader.xml}{glDeleteShader()}.
698
699     This convenience function will do nothing on OpenGL/ES 1.x systems.
700 */
701
702 /*!
703     \fn void QOpenGLFunctions::glDepthRangef(GLclampf zNear, GLclampf zFar)
704
705     Convenience function that calls glDepthRange(\a zNear, \a zFar) on
706     desktop OpenGL systems and glDepthRangef(\a zNear, \a zFar) on
707     embedded OpenGL/ES systems.
708
709     For more information, see the OpenGL/ES 2.0 documentation for
710     \l{http://www.khronos.org/opengles/sdk/docs/man/glDepthRangef.xml}{glDepthRangef()}.
711 */
712
713 /*!
714     \fn void QOpenGLFunctions::glDetachShader(GLuint program, GLuint shader)
715
716     Convenience function that calls glDetachShader(\a program, \a shader).
717
718     For more information, see the OpenGL/ES 2.0 documentation for
719     \l{http://www.khronos.org/opengles/sdk/docs/man/glDetachShader.xml}{glDetachShader()}.
720
721     This convenience function will do nothing on OpenGL/ES 1.x systems.
722 */
723
724 /*!
725     \fn void QOpenGLFunctions::glDisableVertexAttribArray(GLuint index)
726
727     Convenience function that calls glDisableVertexAttribArray(\a index).
728
729     For more information, see the OpenGL/ES 2.0 documentation for
730     \l{http://www.khronos.org/opengles/sdk/docs/man/glDisableVertexAttribArray.xml}{glDisableVertexAttribArray()}.
731
732     This convenience function will do nothing on OpenGL/ES 1.x systems.
733 */
734
735 /*!
736     \fn void QOpenGLFunctions::glEnableVertexAttribArray(GLuint index)
737
738     Convenience function that calls glEnableVertexAttribArray(\a index).
739
740     For more information, see the OpenGL/ES 2.0 documentation for
741     \l{http://www.khronos.org/opengles/sdk/docs/man/glEnableVertexAttribArray.xml}{glEnableVertexAttribArray()}.
742
743     This convenience function will do nothing on OpenGL/ES 1.x systems.
744 */
745
746 /*!
747     \fn void QOpenGLFunctions::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
748
749     Convenience function that calls glFramebufferRenderbuffer(\a target, \a attachment, \a renderbuffertarget, \a renderbuffer).
750
751     For more information, see the OpenGL/ES 2.0 documentation for
752     \l{http://www.khronos.org/opengles/sdk/docs/man/glFramebufferRenderbuffer.xml}{glFramebufferRenderbuffer()}.
753 */
754
755 /*!
756     \fn void QOpenGLFunctions::glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
757
758     Convenience function that calls glFramebufferTexture2D(\a target, \a attachment, \a textarget, \a texture, \a level).
759
760     For more information, see the OpenGL/ES 2.0 documentation for
761     \l{http://www.khronos.org/opengles/sdk/docs/man/glFramebufferTexture2D.xml}{glFramebufferTexture2D()}.
762 */
763
764 /*!
765     \fn void QOpenGLFunctions::glGenBuffers(GLsizei n, GLuint* buffers)
766
767     Convenience function that calls glGenBuffers(\a n, \a buffers).
768
769     For more information, see the OpenGL/ES 2.0 documentation for
770     \l{http://www.khronos.org/opengles/sdk/docs/man/glGenBuffers.xml}{glGenBuffers()}.
771 */
772
773 /*!
774     \fn void QOpenGLFunctions::glGenerateMipmap(GLenum target)
775
776     Convenience function that calls glGenerateMipmap(\a target).
777
778     For more information, see the OpenGL/ES 2.0 documentation for
779     \l{http://www.khronos.org/opengles/sdk/docs/man/glGenerateMipmap.xml}{glGenerateMipmap()}.
780 */
781
782 /*!
783     \fn void QOpenGLFunctions::glGenFramebuffers(GLsizei n, GLuint* framebuffers)
784
785     Convenience function that calls glGenFramebuffers(\a n, \a framebuffers).
786
787     For more information, see the OpenGL/ES 2.0 documentation for
788     \l{http://www.khronos.org/opengles/sdk/docs/man/glGenFramebuffers.xml}{glGenFramebuffers()}.
789 */
790
791 /*!
792     \fn void QOpenGLFunctions::glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
793
794     Convenience function that calls glGenRenderbuffers(\a n, \a renderbuffers).
795
796     For more information, see the OpenGL/ES 2.0 documentation for
797     \l{http://www.khronos.org/opengles/sdk/docs/man/glGenRenderbuffers.xml}{glGenRenderbuffers()}.
798 */
799
800 /*!
801     \fn void QOpenGLFunctions::glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
802
803     Convenience function that calls glGetActiveAttrib(\a program, \a index, \a bufsize, \a length, \a size, \a type, \a name).
804
805     For more information, see the OpenGL/ES 2.0 documentation for
806     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetActiveAttrib.xml}{glGetActiveAttrib()}.
807
808     This convenience function will do nothing on OpenGL/ES 1.x systems.
809 */
810
811 /*!
812     \fn void QOpenGLFunctions::glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
813
814     Convenience function that calls glGetActiveUniform(\a program, \a index, \a bufsize, \a length, \a size, \a type, \a name).
815
816     For more information, see the OpenGL/ES 2.0 documentation for
817     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetActiveUniform.xml}{glGetActiveUniform()}.
818
819     This convenience function will do nothing on OpenGL/ES 1.x systems.
820 */
821
822 /*!
823     \fn void QOpenGLFunctions::glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
824
825     Convenience function that calls glGetAttachedShaders(\a program, \a maxcount, \a count, \a shaders).
826
827     For more information, see the OpenGL/ES 2.0 documentation for
828     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetAttachedShaders.xml}{glGetAttachedShaders()}.
829
830     This convenience function will do nothing on OpenGL/ES 1.x systems.
831 */
832
833 /*!
834     \fn GLint QOpenGLFunctions::glGetAttribLocation(GLuint program, const char* name)
835
836     Convenience function that calls glGetAttribLocation(\a program, \a name).
837
838     For more information, see the OpenGL/ES 2.0 documentation for
839     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetAttribLocation.xml}{glGetAttribLocation()}.
840
841     This convenience function will do nothing on OpenGL/ES 1.x systems.
842 */
843
844 /*!
845     \fn void QOpenGLFunctions::glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
846
847     Convenience function that calls glGetBufferParameteriv(\a target, \a pname, \a params).
848
849     For more information, see the OpenGL/ES 2.0 documentation for
850     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetBufferParameteriv.xml}{glGetBufferParameteriv()}.
851 */
852
853 /*!
854     \fn void QOpenGLFunctions::glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
855
856     Convenience function that calls glGetFramebufferAttachmentParameteriv(\a target, \a attachment, \a pname, \a params).
857
858     For more information, see the OpenGL/ES 2.0 documentation for
859     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetFramebufferAttachmentParameteriv.xml}{glGetFramebufferAttachmentParameteriv()}.
860 */
861
862 /*!
863     \fn void QOpenGLFunctions::glGetProgramiv(GLuint program, GLenum pname, GLint* params)
864
865     Convenience function that calls glGetProgramiv(\a program, \a pname, \a params).
866
867     For more information, see the OpenGL/ES 2.0 documentation for
868     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetProgramiv.xml}{glGetProgramiv()}.
869
870     This convenience function will do nothing on OpenGL/ES 1.x systems.
871 */
872
873 /*!
874     \fn void QOpenGLFunctions::glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
875
876     Convenience function that calls glGetProgramInfoLog(\a program, \a bufsize, \a length, \a infolog).
877
878     For more information, see the OpenGL/ES 2.0 documentation for
879     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetProgramInfoLog.xml}{glGetProgramInfoLog()}.
880
881     This convenience function will do nothing on OpenGL/ES 1.x systems.
882 */
883
884 /*!
885     \fn void QOpenGLFunctions::glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
886
887     Convenience function that calls glGetRenderbufferParameteriv(\a target, \a pname, \a params).
888
889     For more information, see the OpenGL/ES 2.0 documentation for
890     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetRenderbufferParameteriv.xml}{glGetRenderbufferParameteriv()}.
891 */
892
893 /*!
894     \fn void QOpenGLFunctions::glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
895
896     Convenience function that calls glGetShaderiv(\a shader, \a pname, \a params).
897
898     For more information, see the OpenGL/ES 2.0 documentation for
899     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderiv.xml}{glGetShaderiv()}.
900
901     This convenience function will do nothing on OpenGL/ES 1.x systems.
902 */
903
904 /*!
905     \fn void QOpenGLFunctions::glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
906
907     Convenience function that calls glGetShaderInfoLog(\a shader, \a bufsize, \a length, \a infolog).
908
909     For more information, see the OpenGL/ES 2.0 documentation for
910     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderInfoLog.xml}{glGetShaderInfoLog()}.
911
912     This convenience function will do nothing on OpenGL/ES 1.x systems.
913 */
914
915 /*!
916     \fn void QOpenGLFunctions::glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
917
918     Convenience function that calls glGetShaderPrecisionFormat(\a shadertype, \a precisiontype, \a range, \a precision).
919
920     For more information, see the OpenGL/ES 2.0 documentation for
921     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderPrecisionFormat.xml}{glGetShaderPrecisionFormat()}.
922
923     This convenience function will do nothing on OpenGL/ES 1.x systems.
924 */
925
926 /*!
927     \fn void QOpenGLFunctions::glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
928
929     Convenience function that calls glGetShaderSource(\a shader, \a bufsize, \a length, \a source).
930
931     For more information, see the OpenGL/ES 2.0 documentation for
932     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetShaderSource.xml}{glGetShaderSource()}.
933
934     This convenience function will do nothing on OpenGL/ES 1.x systems.
935 */
936
937 /*!
938     \fn void QOpenGLFunctions::glGetUniformfv(GLuint program, GLint location, GLfloat* params)
939
940     Convenience function that calls glGetUniformfv(\a program, \a location, \a params).
941
942     For more information, see the OpenGL/ES 2.0 documentation for
943     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetUniformfv.xml}{glGetUniformfv()}.
944
945     This convenience function will do nothing on OpenGL/ES 1.x systems.
946 */
947
948 /*!
949     \fn void QOpenGLFunctions::glGetUniformiv(GLuint program, GLint location, GLint* params)
950
951     Convenience function that calls glGetUniformiv(\a program, \a location, \a params).
952
953     For more information, see the OpenGL/ES 2.0 documentation for
954     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetUniformiv.xml}{glGetUniformiv()}.
955
956     This convenience function will do nothing on OpenGL/ES 1.x systems.
957 */
958
959 /*!
960     \fn GLint QOpenGLFunctions::glGetUniformLocation(GLuint program, const char* name)
961
962     Convenience function that calls glGetUniformLocation(\a program, \a name).
963
964     For more information, see the OpenGL/ES 2.0 documentation for
965     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetUniformLocation.xml}{glGetUniformLocation()}.
966
967     This convenience function will do nothing on OpenGL/ES 1.x systems.
968 */
969
970 /*!
971     \fn void QOpenGLFunctions::glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
972
973     Convenience function that calls glGetVertexAttribfv(\a index, \a pname, \a params).
974
975     For more information, see the OpenGL/ES 2.0 documentation for
976     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetVertexAttribfv.xml}{glGetVertexAttribfv()}.
977
978     This convenience function will do nothing on OpenGL/ES 1.x systems.
979 */
980
981 /*!
982     \fn void QOpenGLFunctions::glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
983
984     Convenience function that calls glGetVertexAttribiv(\a index, \a pname, \a params).
985
986     For more information, see the OpenGL/ES 2.0 documentation for
987     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetVertexAttribiv.xml}{glGetVertexAttribiv()}.
988
989     This convenience function will do nothing on OpenGL/ES 1.x systems.
990 */
991
992 /*!
993     \fn void QOpenGLFunctions::glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
994
995     Convenience function that calls glGetVertexAttribPointerv(\a index, \a pname, \a pointer).
996
997     For more information, see the OpenGL/ES 2.0 documentation for
998     \l{http://www.khronos.org/opengles/sdk/docs/man/glGetVertexAttribPointerv.xml}{glGetVertexAttribPointerv()}.
999
1000     This convenience function will do nothing on OpenGL/ES 1.x systems.
1001 */
1002
1003 /*!
1004     \fn GLboolean QOpenGLFunctions::glIsBuffer(GLuint buffer)
1005
1006     Convenience function that calls glIsBuffer(\a buffer).
1007
1008     For more information, see the OpenGL/ES 2.0 documentation for
1009     \l{http://www.khronos.org/opengles/sdk/docs/man/glIsBuffer.xml}{glIsBuffer()}.
1010 */
1011
1012 /*!
1013     \fn GLboolean QOpenGLFunctions::glIsFramebuffer(GLuint framebuffer)
1014
1015     Convenience function that calls glIsFramebuffer(\a framebuffer).
1016
1017     For more information, see the OpenGL/ES 2.0 documentation for
1018     \l{http://www.khronos.org/opengles/sdk/docs/man/glIsFramebuffer.xml}{glIsFramebuffer()}.
1019 */
1020
1021 /*!
1022     \fn GLboolean QOpenGLFunctions::glIsProgram(GLuint program)
1023
1024     Convenience function that calls glIsProgram(\a program).
1025
1026     For more information, see the OpenGL/ES 2.0 documentation for
1027     \l{http://www.khronos.org/opengles/sdk/docs/man/glIsProgram.xml}{glIsProgram()}.
1028
1029     This convenience function will do nothing on OpenGL/ES 1.x systems.
1030 */
1031
1032 /*!
1033     \fn GLboolean QOpenGLFunctions::glIsRenderbuffer(GLuint renderbuffer)
1034
1035     Convenience function that calls glIsRenderbuffer(\a renderbuffer).
1036
1037     For more information, see the OpenGL/ES 2.0 documentation for
1038     \l{http://www.khronos.org/opengles/sdk/docs/man/glIsRenderbuffer.xml}{glIsRenderbuffer()}.
1039 */
1040
1041 /*!
1042     \fn GLboolean QOpenGLFunctions::glIsShader(GLuint shader)
1043
1044     Convenience function that calls glIsShader(\a shader).
1045
1046     For more information, see the OpenGL/ES 2.0 documentation for
1047     \l{http://www.khronos.org/opengles/sdk/docs/man/glIsShader.xml}{glIsShader()}.
1048
1049     This convenience function will do nothing on OpenGL/ES 1.x systems.
1050 */
1051
1052 /*!
1053     \fn void QOpenGLFunctions::glLinkProgram(GLuint program)
1054
1055     Convenience function that calls glLinkProgram(\a program).
1056
1057     For more information, see the OpenGL/ES 2.0 documentation for
1058     \l{http://www.khronos.org/opengles/sdk/docs/man/glLinkProgram.xml}{glLinkProgram()}.
1059
1060     This convenience function will do nothing on OpenGL/ES 1.x systems.
1061 */
1062
1063 /*!
1064     \fn void QOpenGLFunctions::glReleaseShaderCompiler()
1065
1066     Convenience function that calls glReleaseShaderCompiler().
1067
1068     For more information, see the OpenGL/ES 2.0 documentation for
1069     \l{http://www.khronos.org/opengles/sdk/docs/man/glReleaseShaderCompiler.xml}{glReleaseShaderCompiler()}.
1070
1071     This convenience function will do nothing on OpenGL/ES 1.x systems.
1072 */
1073
1074 /*!
1075     \fn void QOpenGLFunctions::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
1076
1077     Convenience function that calls glRenderbufferStorage(\a target, \a internalformat, \a width, \a height).
1078
1079     For more information, see the OpenGL/ES 2.0 documentation for
1080     \l{http://www.khronos.org/opengles/sdk/docs/man/glRenderbufferStorage.xml}{glRenderbufferStorage()}.
1081 */
1082
1083 /*!
1084     \fn void QOpenGLFunctions::glSampleCoverage(GLclampf value, GLboolean invert)
1085
1086     Convenience function that calls glSampleCoverage(\a value, \a invert).
1087
1088     For more information, see the OpenGL/ES 2.0 documentation for
1089     \l{http://www.khronos.org/opengles/sdk/docs/man/glSampleCoverage.xml}{glSampleCoverage()}.
1090 */
1091
1092 /*!
1093     \fn void QOpenGLFunctions::glShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLint length)
1094
1095     Convenience function that calls glShaderBinary(\a n, \a shaders, \a binaryformat, \a binary, \a length).
1096
1097     For more information, see the OpenGL/ES 2.0 documentation for
1098     \l{http://www.khronos.org/opengles/sdk/docs/man/glShaderBinary.xml}{glShaderBinary()}.
1099
1100     This convenience function will do nothing on OpenGL/ES 1.x systems.
1101 */
1102
1103 /*!
1104     \fn void QOpenGLFunctions::glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
1105
1106     Convenience function that calls glShaderSource(\a shader, \a count, \a string, \a length).
1107
1108     For more information, see the OpenGL/ES 2.0 documentation for
1109     \l{http://www.khronos.org/opengles/sdk/docs/man/glShaderSource.xml}{glShaderSource()}.
1110
1111     This convenience function will do nothing on OpenGL/ES 1.x systems.
1112 */
1113
1114 /*!
1115     \fn void QOpenGLFunctions::glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
1116
1117     Convenience function that calls glStencilFuncSeparate(\a face, \a func, \a ref, \a mask).
1118
1119     For more information, see the OpenGL/ES 2.0 documentation for
1120     \l{http://www.khronos.org/opengles/sdk/docs/man/glStencilFuncSeparate.xml}{glStencilFuncSeparate()}.
1121 */
1122
1123 /*!
1124     \fn void QOpenGLFunctions::glStencilMaskSeparate(GLenum face, GLuint mask)
1125
1126     Convenience function that calls glStencilMaskSeparate(\a face, \a mask).
1127
1128     For more information, see the OpenGL/ES 2.0 documentation for
1129     \l{http://www.khronos.org/opengles/sdk/docs/man/glStencilMaskSeparate.xml}{glStencilMaskSeparate()}.
1130 */
1131
1132 /*!
1133     \fn void QOpenGLFunctions::glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
1134
1135     Convenience function that calls glStencilOpSeparate(\a face, \a fail, \a zfail, \a zpass).
1136
1137     For more information, see the OpenGL/ES 2.0 documentation for
1138     \l{http://www.khronos.org/opengles/sdk/docs/man/glStencilOpSeparate.xml}{glStencilOpSeparate()}.
1139 */
1140
1141 /*!
1142     \fn void QOpenGLFunctions::glUniform1f(GLint location, GLfloat x)
1143
1144     Convenience function that calls glUniform1f(\a location, \a x).
1145
1146     For more information, see the OpenGL/ES 2.0 documentation for
1147     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1f.xml}{glUniform1f()}.
1148
1149     This convenience function will do nothing on OpenGL/ES 1.x systems.
1150 */
1151
1152 /*!
1153     \fn void QOpenGLFunctions::glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
1154
1155     Convenience function that calls glUniform1fv(\a location, \a count, \a v).
1156
1157     For more information, see the OpenGL/ES 2.0 documentation for
1158     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1fv.xml}{glUniform1fv()}.
1159
1160     This convenience function will do nothing on OpenGL/ES 1.x systems.
1161 */
1162
1163 /*!
1164     \fn void QOpenGLFunctions::glUniform1i(GLint location, GLint x)
1165
1166     Convenience function that calls glUniform1i(\a location, \a x).
1167
1168     For more information, see the OpenGL/ES 2.0 documentation for
1169     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1i.xml}{glUniform1i()}.
1170
1171     This convenience function will do nothing on OpenGL/ES 1.x systems.
1172 */
1173
1174 /*!
1175     \fn void QOpenGLFunctions::glUniform1iv(GLint location, GLsizei count, const GLint* v)
1176
1177     Convenience function that calls glUniform1iv(\a location, \a count, \a v).
1178
1179     For more information, see the OpenGL/ES 2.0 documentation for
1180     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform1iv.xml}{glUniform1iv()}.
1181
1182     This convenience function will do nothing on OpenGL/ES 1.x systems.
1183 */
1184
1185 /*!
1186     \fn void QOpenGLFunctions::glUniform2f(GLint location, GLfloat x, GLfloat y)
1187
1188     Convenience function that calls glUniform2f(\a location, \a x, \a y).
1189
1190     For more information, see the OpenGL/ES 2.0 documentation for
1191     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2f.xml}{glUniform2f()}.
1192
1193     This convenience function will do nothing on OpenGL/ES 1.x systems.
1194 */
1195
1196 /*!
1197     \fn void QOpenGLFunctions::glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
1198
1199     Convenience function that calls glUniform2fv(\a location, \a count, \a v).
1200
1201     For more information, see the OpenGL/ES 2.0 documentation for
1202     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2fv.xml}{glUniform2fv()}.
1203
1204     This convenience function will do nothing on OpenGL/ES 1.x systems.
1205 */
1206
1207 /*!
1208     \fn void QOpenGLFunctions::glUniform2i(GLint location, GLint x, GLint y)
1209
1210     Convenience function that calls glUniform2i(\a location, \a x, \a y).
1211
1212     For more information, see the OpenGL/ES 2.0 documentation for
1213     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2i.xml}{glUniform2i()}.
1214
1215     This convenience function will do nothing on OpenGL/ES 1.x systems.
1216 */
1217
1218 /*!
1219     \fn void QOpenGLFunctions::glUniform2iv(GLint location, GLsizei count, const GLint* v)
1220
1221     Convenience function that calls glUniform2iv(\a location, \a count, \a v).
1222
1223     For more information, see the OpenGL/ES 2.0 documentation for
1224     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform2iv.xml}{glUniform2iv()}.
1225
1226     This convenience function will do nothing on OpenGL/ES 1.x systems.
1227 */
1228
1229 /*!
1230     \fn void QOpenGLFunctions::glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
1231
1232     Convenience function that calls glUniform3f(\a location, \a x, \a y, \a z).
1233
1234     For more information, see the OpenGL/ES 2.0 documentation for
1235     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3f.xml}{glUniform3f()}.
1236
1237     This convenience function will do nothing on OpenGL/ES 1.x systems.
1238 */
1239
1240 /*!
1241     \fn void QOpenGLFunctions::glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
1242
1243     Convenience function that calls glUniform3fv(\a location, \a count, \a v).
1244
1245     For more information, see the OpenGL/ES 2.0 documentation for
1246     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3fv.xml}{glUniform3fv()}.
1247
1248     This convenience function will do nothing on OpenGL/ES 1.x systems.
1249 */
1250
1251 /*!
1252     \fn void QOpenGLFunctions::glUniform3i(GLint location, GLint x, GLint y, GLint z)
1253
1254     Convenience function that calls glUniform3i(\a location, \a x, \a y, \a z).
1255
1256     For more information, see the OpenGL/ES 2.0 documentation for
1257     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3i.xml}{glUniform3i()}.
1258
1259     This convenience function will do nothing on OpenGL/ES 1.x systems.
1260 */
1261
1262 /*!
1263     \fn void QOpenGLFunctions::glUniform3iv(GLint location, GLsizei count, const GLint* v)
1264
1265     Convenience function that calls glUniform3iv(\a location, \a count, \a v).
1266
1267     For more information, see the OpenGL/ES 2.0 documentation for
1268     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform3iv.xml}{glUniform3iv()}.
1269
1270     This convenience function will do nothing on OpenGL/ES 1.x systems.
1271 */
1272
1273 /*!
1274     \fn void QOpenGLFunctions::glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1275
1276     Convenience function that calls glUniform4f(\a location, \a x, \a y, \a z, \a w).
1277
1278     For more information, see the OpenGL/ES 2.0 documentation for
1279     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4f.xml}{glUniform4f()}.
1280
1281     This convenience function will do nothing on OpenGL/ES 1.x systems.
1282 */
1283
1284 /*!
1285     \fn void QOpenGLFunctions::glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
1286
1287     Convenience function that calls glUniform4fv(\a location, \a count, \a v).
1288
1289     For more information, see the OpenGL/ES 2.0 documentation for
1290     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4fv.xml}{glUniform4fv()}.
1291
1292     This convenience function will do nothing on OpenGL/ES 1.x systems.
1293 */
1294
1295 /*!
1296     \fn void QOpenGLFunctions::glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
1297
1298     Convenience function that calls glUniform4i(\a location, \a x, \a y, \a z, \a w).
1299
1300     For more information, see the OpenGL/ES 2.0 documentation for
1301     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4i.xml}{glUniform4i()}.
1302
1303     This convenience function will do nothing on OpenGL/ES 1.x systems.
1304 */
1305
1306 /*!
1307     \fn void QOpenGLFunctions::glUniform4iv(GLint location, GLsizei count, const GLint* v)
1308
1309     Convenience function that calls glUniform4iv(\a location, \a count, \a v).
1310
1311     For more information, see the OpenGL/ES 2.0 documentation for
1312     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniform4iv.xml}{glUniform4iv()}.
1313
1314     This convenience function will do nothing on OpenGL/ES 1.x systems.
1315 */
1316
1317 /*!
1318     \fn void QOpenGLFunctions::glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1319
1320     Convenience function that calls glUniformMatrix2fv(\a location, \a count, \a transpose, \a value).
1321
1322     For more information, see the OpenGL/ES 2.0 documentation for
1323     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniformMatrix2fv.xml}{glUniformMatrix2fv()}.
1324
1325     This convenience function will do nothing on OpenGL/ES 1.x systems.
1326 */
1327
1328 /*!
1329     \fn void QOpenGLFunctions::glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1330
1331     Convenience function that calls glUniformMatrix3fv(\a location, \a count, \a transpose, \a value).
1332
1333     For more information, see the OpenGL/ES 2.0 documentation for
1334     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniformMatrix3fv.xml}{glUniformMatrix3fv()}.
1335
1336     This convenience function will do nothing on OpenGL/ES 1.x systems.
1337 */
1338
1339 /*!
1340     \fn void QOpenGLFunctions::glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
1341
1342     Convenience function that calls glUniformMatrix4fv(\a location, \a count, \a transpose, \a value).
1343
1344     For more information, see the OpenGL/ES 2.0 documentation for
1345     \l{http://www.khronos.org/opengles/sdk/docs/man/glUniformMatrix4fv.xml}{glUniformMatrix4fv()}.
1346
1347     This convenience function will do nothing on OpenGL/ES 1.x systems.
1348 */
1349
1350 /*!
1351     \fn void QOpenGLFunctions::glUseProgram(GLuint program)
1352
1353     Convenience function that calls glUseProgram(\a program).
1354
1355     For more information, see the OpenGL/ES 2.0 documentation for
1356     \l{http://www.khronos.org/opengles/sdk/docs/man/glUseProgram.xml}{glUseProgram()}.
1357
1358     This convenience function will do nothing on OpenGL/ES 1.x systems.
1359 */
1360
1361 /*!
1362     \fn void QOpenGLFunctions::glValidateProgram(GLuint program)
1363
1364     Convenience function that calls glValidateProgram(\a program).
1365
1366     For more information, see the OpenGL/ES 2.0 documentation for
1367     \l{http://www.khronos.org/opengles/sdk/docs/man/glValidateProgram.xml}{glValidateProgram()}.
1368
1369     This convenience function will do nothing on OpenGL/ES 1.x systems.
1370 */
1371
1372 /*!
1373     \fn void QOpenGLFunctions::glVertexAttrib1f(GLuint indx, GLfloat x)
1374
1375     Convenience function that calls glVertexAttrib1f(\a indx, \a x).
1376
1377     For more information, see the OpenGL/ES 2.0 documentation for
1378     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib1f.xml}{glVertexAttrib1f()}.
1379
1380     This convenience function will do nothing on OpenGL/ES 1.x systems.
1381 */
1382
1383 /*!
1384     \fn void QOpenGLFunctions::glVertexAttrib1fv(GLuint indx, const GLfloat* values)
1385
1386     Convenience function that calls glVertexAttrib1fv(\a indx, \a values).
1387
1388     For more information, see the OpenGL/ES 2.0 documentation for
1389     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib1fv.xml}{glVertexAttrib1fv()}.
1390
1391     This convenience function will do nothing on OpenGL/ES 1.x systems.
1392 */
1393
1394 /*!
1395     \fn void QOpenGLFunctions::glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
1396
1397     Convenience function that calls glVertexAttrib2f(\a indx, \a x, \a y).
1398
1399     For more information, see the OpenGL/ES 2.0 documentation for
1400     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib2f.xml}{glVertexAttrib2f()}.
1401
1402     This convenience function will do nothing on OpenGL/ES 1.x systems.
1403 */
1404
1405 /*!
1406     \fn void QOpenGLFunctions::glVertexAttrib2fv(GLuint indx, const GLfloat* values)
1407
1408     Convenience function that calls glVertexAttrib2fv(\a indx, \a values).
1409
1410     For more information, see the OpenGL/ES 2.0 documentation for
1411     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib2fv.xml}{glVertexAttrib2fv()}.
1412
1413     This convenience function will do nothing on OpenGL/ES 1.x systems.
1414 */
1415
1416 /*!
1417     \fn void QOpenGLFunctions::glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
1418
1419     Convenience function that calls glVertexAttrib3f(\a indx, \a x, \a y, \a z).
1420
1421     For more information, see the OpenGL/ES 2.0 documentation for
1422     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib3f.xml}{glVertexAttrib3f()}.
1423
1424     This convenience function will do nothing on OpenGL/ES 1.x systems.
1425 */
1426
1427 /*!
1428     \fn void QOpenGLFunctions::glVertexAttrib3fv(GLuint indx, const GLfloat* values)
1429
1430     Convenience function that calls glVertexAttrib3fv(\a indx, \a values).
1431
1432     For more information, see the OpenGL/ES 2.0 documentation for
1433     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib3fv.xml}{glVertexAttrib3fv()}.
1434
1435     This convenience function will do nothing on OpenGL/ES 1.x systems.
1436 */
1437
1438 /*!
1439     \fn void QOpenGLFunctions::glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1440
1441     Convenience function that calls glVertexAttrib4f(\a indx, \a x, \a y, \a z, \a w).
1442
1443     For more information, see the OpenGL/ES 2.0 documentation for
1444     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib4f.xml}{glVertexAttrib4f()}.
1445
1446     This convenience function will do nothing on OpenGL/ES 1.x systems.
1447 */
1448
1449 /*!
1450     \fn void QOpenGLFunctions::glVertexAttrib4fv(GLuint indx, const GLfloat* values)
1451
1452     Convenience function that calls glVertexAttrib4fv(\a indx, \a values).
1453
1454     For more information, see the OpenGL/ES 2.0 documentation for
1455     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttrib4fv.xml}{glVertexAttrib4fv()}.
1456
1457     This convenience function will do nothing on OpenGL/ES 1.x systems.
1458 */
1459
1460 /*!
1461     \fn void QOpenGLFunctions::glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
1462
1463     Convenience function that calls glVertexAttribPointer(\a indx, \a size, \a type, \a normalized, \a stride, \a ptr).
1464
1465     For more information, see the OpenGL/ES 2.0 documentation for
1466     \l{http://www.khronos.org/opengles/sdk/docs/man/glVertexAttribPointer.xml}{glVertexAttribPointer()}.
1467
1468     This convenience function will do nothing on OpenGL/ES 1.x systems.
1469 */
1470
1471 /*!
1472     \fn bool QOpenGLFunctions::isInitialized(const QOpenGLFunctionsPrivate *d)
1473     \internal
1474 */
1475
1476 namespace {
1477
1478 enum ResolvePolicy
1479 {
1480     ResolveOES = 0x1,
1481     ResolveEXT = 0x2
1482 };
1483
1484 template <typename Base, typename FuncType, int Policy, typename ReturnType>
1485 class Resolver
1486 {
1487 public:
1488     Resolver(FuncType Base::*func, FuncType fallback, const char *name, const char *alternateName = 0)
1489         : funcPointerName(func)
1490         , fallbackFuncPointer(fallback)
1491         , funcName(name)
1492         , alternateFuncName(alternateName)
1493     {
1494     }
1495
1496     ReturnType operator()();
1497
1498     template <typename P1>
1499     ReturnType operator()(P1 p1);
1500
1501     template <typename P1, typename P2>
1502     ReturnType operator()(P1 p1, P2 p2);
1503
1504     template <typename P1, typename P2, typename P3>
1505     ReturnType operator()(P1 p1, P2 p2, P3 p3);
1506
1507     template <typename P1, typename P2, typename P3, typename P4>
1508     ReturnType operator()(P1 p1, P2 p2, P3 p3, P4 p4);
1509
1510     template <typename P1, typename P2, typename P3, typename P4, typename P5>
1511     ReturnType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
1512
1513     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
1514     ReturnType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6);
1515
1516     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
1517     ReturnType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7);
1518
1519     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
1520     ReturnType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8);
1521
1522     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9>
1523     ReturnType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9);
1524
1525     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10>
1526     ReturnType operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10);
1527
1528 private:
1529     FuncType Base::*funcPointerName;
1530     FuncType fallbackFuncPointer;
1531     QByteArray funcName;
1532     QByteArray alternateFuncName;
1533 };
1534
1535 template <typename Base, typename FuncType, int Policy>
1536 class Resolver<Base, FuncType, Policy, void>
1537 {
1538 public:
1539     Resolver(FuncType Base::*func, FuncType fallback, const char *name, const char *alternateName = 0)
1540         : funcPointerName(func)
1541         , fallbackFuncPointer(fallback)
1542         , funcName(name)
1543         , alternateFuncName(alternateName)
1544     {
1545     }
1546
1547     void operator()();
1548
1549     template <typename P1>
1550     void operator()(P1 p1);
1551
1552     template <typename P1, typename P2>
1553     void operator()(P1 p1, P2 p2);
1554
1555     template <typename P1, typename P2, typename P3>
1556     void operator()(P1 p1, P2 p2, P3 p3);
1557
1558     template <typename P1, typename P2, typename P3, typename P4>
1559     void operator()(P1 p1, P2 p2, P3 p3, P4 p4);
1560
1561     template <typename P1, typename P2, typename P3, typename P4, typename P5>
1562     void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
1563
1564     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
1565     void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6);
1566
1567     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
1568     void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7);
1569
1570     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
1571     void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8);
1572
1573     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9>
1574     void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9);
1575
1576     template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10>
1577     void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10);
1578
1579 private:
1580     FuncType Base::*funcPointerName;
1581     FuncType fallbackFuncPointer;
1582     QByteArray funcName;
1583     QByteArray alternateFuncName;
1584 };
1585
1586 #define RESOLVER_COMMON \
1587     QOpenGLContext *context = QOpenGLContext::currentContext(); \
1588     Base *funcs = qt_gl_functions(context); \
1589  \
1590     FuncType old = funcs->*funcPointerName; \
1591  \
1592     funcs->*funcPointerName = (FuncType)context->getProcAddress(funcName); \
1593  \
1594     if ((Policy & ResolveOES) && !(funcs->*funcPointerName)) \
1595         funcs->*funcPointerName = (FuncType)context->getProcAddress(funcName + "OES"); \
1596  \
1597     if (!(funcs->*funcPointerName)) \
1598         funcs->*funcPointerName = (FuncType)context->getProcAddress(funcName + "ARB"); \
1599  \
1600     if ((Policy & ResolveEXT) && !(funcs->*funcPointerName)) \
1601         funcs->*funcPointerName = (FuncType)context->getProcAddress(funcName + "EXT"); \
1602  \
1603     if (!alternateFuncName.isEmpty() && !(funcs->*funcPointerName)) { \
1604         funcs->*funcPointerName = (FuncType)context->getProcAddress(alternateFuncName); \
1605  \
1606         if ((Policy & ResolveOES) && !(funcs->*funcPointerName)) \
1607             funcs->*funcPointerName = (FuncType)context->getProcAddress(alternateFuncName + "OES"); \
1608  \
1609         if (!(funcs->*funcPointerName)) \
1610             funcs->*funcPointerName = (FuncType)context->getProcAddress(alternateFuncName + "ARB"); \
1611  \
1612         if ((Policy & ResolveEXT) && !(funcs->*funcPointerName)) \
1613             funcs->*funcPointerName = (FuncType)context->getProcAddress(alternateFuncName + "EXT"); \
1614     }
1615
1616 #define RESOLVER_COMMON_NON_VOID \
1617     RESOLVER_COMMON \
1618  \
1619     if (!(funcs->*funcPointerName)) { \
1620         if (fallbackFuncPointer) { \
1621             funcs->*funcPointerName = fallbackFuncPointer; \
1622         } else { \
1623             funcs->*funcPointerName = old; \
1624             return ReturnType(); \
1625         } \
1626     }
1627
1628 #define RESOLVER_COMMON_VOID \
1629     RESOLVER_COMMON \
1630  \
1631     if (!(funcs->*funcPointerName)) { \
1632         if (fallbackFuncPointer) { \
1633             funcs->*funcPointerName = fallbackFuncPointer; \
1634         } else { \
1635             funcs->*funcPointerName = old; \
1636             return; \
1637         } \
1638     }
1639
1640 template <typename Base, typename FuncType, int Policy, typename ReturnType>
1641 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()()
1642 {
1643     RESOLVER_COMMON_NON_VOID
1644
1645     return (funcs->*funcPointerName)();
1646 }
1647
1648 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1>
1649 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1)
1650 {
1651     RESOLVER_COMMON_NON_VOID
1652
1653     return (funcs->*funcPointerName)(p1);
1654 }
1655
1656 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2>
1657 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2)
1658 {
1659     RESOLVER_COMMON_NON_VOID
1660
1661     return (funcs->*funcPointerName)(p1, p2);
1662 }
1663
1664 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3>
1665 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3)
1666 {
1667     RESOLVER_COMMON_NON_VOID
1668
1669     return (funcs->*funcPointerName)(p1, p2, p3);
1670 }
1671
1672 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3, typename P4>
1673 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3, P4 p4)
1674 {
1675     RESOLVER_COMMON_NON_VOID
1676
1677     return (funcs->*funcPointerName)(p1, p2, p3, p4);
1678 }
1679
1680 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3, typename P4, typename P5>
1681 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
1682 {
1683     RESOLVER_COMMON_NON_VOID
1684
1685     return (funcs->*funcPointerName)(p1, p2, p3, p4, p5);
1686 }
1687
1688 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
1689 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
1690 {
1691     RESOLVER_COMMON_NON_VOID
1692
1693     return (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6);
1694 }
1695
1696 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
1697 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7)
1698 {
1699     RESOLVER_COMMON_NON_VOID
1700
1701     return (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7);
1702 }
1703
1704 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
1705 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8)
1706 {
1707     RESOLVER_COMMON_NON_VOID
1708
1709     return (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7, p8);
1710 }
1711
1712 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9>
1713 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9)
1714 {
1715     RESOLVER_COMMON_NON_VOID
1716
1717     return (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7, p8, p9);
1718 }
1719
1720 template <typename Base, typename FuncType, int Policy, typename ReturnType> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10>
1721 ReturnType Resolver<Base, FuncType, Policy, ReturnType>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10)
1722 {
1723     RESOLVER_COMMON_NON_VOID
1724
1725     return (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
1726 }
1727
1728 template <typename Base, typename FuncType, int Policy>
1729 void Resolver<Base, FuncType, Policy, void>::operator()()
1730 {
1731     RESOLVER_COMMON_VOID
1732
1733     (funcs->*funcPointerName)();
1734 }
1735
1736 template <typename Base, typename FuncType, int Policy> template <typename P1>
1737 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1)
1738 {
1739     RESOLVER_COMMON_VOID
1740
1741     (funcs->*funcPointerName)(p1);
1742 }
1743
1744 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2>
1745 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2)
1746 {
1747     RESOLVER_COMMON_VOID
1748
1749     (funcs->*funcPointerName)(p1, p2);
1750 }
1751
1752 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3>
1753 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3)
1754 {
1755     RESOLVER_COMMON_VOID
1756
1757     (funcs->*funcPointerName)(p1, p2, p3);
1758 }
1759
1760 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3, typename P4>
1761 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3, P4 p4)
1762 {
1763     RESOLVER_COMMON_VOID
1764
1765     (funcs->*funcPointerName)(p1, p2, p3, p4);
1766 }
1767
1768 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3, typename P4, typename P5>
1769 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
1770 {
1771     RESOLVER_COMMON_VOID
1772
1773     (funcs->*funcPointerName)(p1, p2, p3, p4, p5);
1774 }
1775
1776 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
1777 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
1778 {
1779     RESOLVER_COMMON_VOID
1780
1781     (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6);
1782 }
1783
1784 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
1785 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7)
1786 {
1787     RESOLVER_COMMON_VOID
1788
1789     (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7);
1790 }
1791
1792 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
1793 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8)
1794 {
1795     RESOLVER_COMMON_VOID
1796
1797     (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7, p8);
1798 }
1799
1800 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9>
1801 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9)
1802 {
1803     RESOLVER_COMMON_VOID
1804
1805     (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7, p8, p9);
1806 }
1807
1808 template <typename Base, typename FuncType, int Policy> template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10>
1809 void Resolver<Base, FuncType, Policy, void>::operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10)
1810 {
1811     RESOLVER_COMMON_VOID
1812
1813     (funcs->*funcPointerName)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
1814 }
1815
1816 template <typename ReturnType, int Policy, typename Base, typename FuncType>
1817 Resolver<Base, FuncType, Policy, ReturnType> functionResolverWithFallback(FuncType Base::*func, FuncType fallback, const char *name, const char *alternate = 0)
1818 {
1819     return Resolver<Base, FuncType, Policy, ReturnType>(func, fallback, name, alternate);
1820 }
1821
1822 template <typename ReturnType, int Policy, typename Base, typename FuncType>
1823 Resolver<Base, FuncType, Policy, ReturnType> functionResolver(FuncType Base::*func, const char *name, const char *alternate = 0)
1824 {
1825     return Resolver<Base, FuncType, Policy, ReturnType>(func, 0, name, alternate);
1826 }
1827
1828 }
1829
1830 #define RESOLVE_FUNC(RETURN_TYPE, POLICY, NAME) \
1831     return functionResolver<RETURN_TYPE, POLICY>(&QOpenGLExtensionsPrivate::NAME, "gl" #NAME)
1832
1833 #define RESOLVE_FUNC_VOID(POLICY, NAME) \
1834     functionResolver<void, POLICY>(&QOpenGLExtensionsPrivate::NAME, "gl" #NAME)
1835
1836 #define RESOLVE_FUNC_SPECIAL(RETURN_TYPE, POLICY, NAME) \
1837     return functionResolverWithFallback<RETURN_TYPE, POLICY>(&QOpenGLExtensionsPrivate::NAME, qopenglfSpecial##NAME, "gl" #NAME)
1838
1839 #define RESOLVE_FUNC_SPECIAL_VOID(POLICY, NAME) \
1840     functionResolverWithFallback<void, POLICY>(&QOpenGLExtensionsPrivate::NAME, qopenglfSpecial##NAME, "gl" #NAME)
1841
1842 #define RESOLVE_FUNC_WITH_ALTERNATE(RETURN_TYPE, POLICY, NAME, ALTERNATE) \
1843     return functionResolver<RETURN_TYPE, POLICY>(&QOpenGLExtensionsPrivate::NAME, "gl" #NAME, "gl" #ALTERNATE)
1844
1845 #define RESOLVE_FUNC_VOID_WITH_ALTERNATE(POLICY, NAME, ALTERNATE) \
1846     functionResolver<void, POLICY>(&QOpenGLExtensionsPrivate::NAME, "gl" #NAME, "gl" #ALTERNATE)
1847
1848 #ifndef QT_OPENGL_ES_2
1849
1850 static void QOPENGLF_APIENTRY qopenglfResolveActiveTexture(GLenum texture)
1851 {
1852     RESOLVE_FUNC_VOID(0, ActiveTexture)(texture);
1853 }
1854
1855 static void QOPENGLF_APIENTRY qopenglfResolveAttachShader(GLuint program, GLuint shader)
1856 {
1857     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, AttachShader, AttachObject)(program, shader);
1858 }
1859
1860 static void QOPENGLF_APIENTRY qopenglfResolveBindAttribLocation(GLuint program, GLuint index, const char* name)
1861 {
1862     RESOLVE_FUNC_VOID(0, BindAttribLocation)(program, index, name);
1863 }
1864
1865 static void QOPENGLF_APIENTRY qopenglfResolveBindBuffer(GLenum target, GLuint buffer)
1866 {
1867     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BindBuffer)(target, buffer);
1868 }
1869
1870 static void QOPENGLF_APIENTRY qopenglfResolveBindFramebuffer(GLenum target, GLuint framebuffer)
1871 {
1872     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BindFramebuffer)(target, framebuffer);
1873 }
1874
1875 static void QOPENGLF_APIENTRY qopenglfResolveBindRenderbuffer(GLenum target, GLuint renderbuffer)
1876 {
1877     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BindRenderbuffer)(target, renderbuffer);
1878 }
1879
1880 static void QOPENGLF_APIENTRY qopenglfResolveBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1881 {
1882     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BlendColor)(red, green, blue, alpha);
1883 }
1884
1885 static void QOPENGLF_APIENTRY qopenglfResolveBlendEquation(GLenum mode)
1886 {
1887     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BlendEquation)(mode);
1888 }
1889
1890 static void QOPENGLF_APIENTRY qopenglfResolveBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
1891 {
1892     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BlendEquationSeparate)(modeRGB, modeAlpha);
1893 }
1894
1895 static void QOPENGLF_APIENTRY qopenglfResolveBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1896 {
1897     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BlendFuncSeparate)(srcRGB, dstRGB, srcAlpha, dstAlpha);
1898 }
1899
1900 static void QOPENGLF_APIENTRY qopenglfResolveBufferData(GLenum target, qopengl_GLsizeiptr size, const void* data, GLenum usage)
1901 {
1902     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BufferData)(target, size, data, usage);
1903 }
1904
1905 static void QOPENGLF_APIENTRY qopenglfResolveBufferSubData(GLenum target, qopengl_GLintptr offset, qopengl_GLsizeiptr size, const void* data)
1906 {
1907     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, BufferSubData)(target, offset, size, data);
1908 }
1909
1910 static GLenum QOPENGLF_APIENTRY qopenglfResolveCheckFramebufferStatus(GLenum target)
1911 {
1912     RESOLVE_FUNC(GLenum, ResolveOES | ResolveEXT, CheckFramebufferStatus)(target);
1913 }
1914
1915 static void QOPENGLF_APIENTRY qopenglfResolveCompileShader(GLuint shader)
1916 {
1917     RESOLVE_FUNC_VOID(0, CompileShader)(shader);
1918 }
1919
1920 static void QOPENGLF_APIENTRY qopenglfResolveCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
1921 {
1922     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, CompressedTexImage2D)(target, level, internalformat, width, height, border, imageSize, data);
1923 }
1924
1925 static void QOPENGLF_APIENTRY qopenglfResolveCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
1926 {
1927     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, CompressedTexSubImage2D)(target, level, xoffset, yoffset, width, height, format, imageSize, data);
1928 }
1929
1930 static GLuint QOPENGLF_APIENTRY qopenglfResolveCreateProgram()
1931 {
1932     RESOLVE_FUNC_WITH_ALTERNATE(GLuint, 0, CreateProgram, CreateProgramObject)();
1933 }
1934
1935 static GLuint QOPENGLF_APIENTRY qopenglfResolveCreateShader(GLenum type)
1936 {
1937     RESOLVE_FUNC_WITH_ALTERNATE(GLuint, 0, CreateShader, CreateShaderObject)(type);
1938 }
1939
1940 static void QOPENGLF_APIENTRY qopenglfResolveDeleteBuffers(GLsizei n, const GLuint* buffers)
1941 {
1942     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, DeleteBuffers)(n, buffers);
1943 }
1944
1945 static void QOPENGLF_APIENTRY qopenglfResolveDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1946 {
1947     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, DeleteFramebuffers)(n, framebuffers);
1948 }
1949
1950 static void QOPENGLF_APIENTRY qopenglfResolveDeleteProgram(GLuint program)
1951 {
1952     RESOLVE_FUNC_VOID(0, DeleteProgram)(program);
1953 }
1954
1955 static void QOPENGLF_APIENTRY qopenglfResolveDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1956 {
1957     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, DeleteRenderbuffers)(n, renderbuffers);
1958 }
1959
1960 static void QOPENGLF_APIENTRY qopenglfResolveDeleteShader(GLuint shader)
1961 {
1962     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, DeleteShader, DeleteObject)(shader);
1963 }
1964
1965 static void QOPENGLF_APIENTRY qopenglfResolveDetachShader(GLuint program, GLuint shader)
1966 {
1967     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, DetachShader, DetachObject)(program, shader);
1968 }
1969
1970 static void QOPENGLF_APIENTRY qopenglfResolveDisableVertexAttribArray(GLuint index)
1971 {
1972     RESOLVE_FUNC_VOID(0, DisableVertexAttribArray)(index);
1973 }
1974
1975 static void QOPENGLF_APIENTRY qopenglfResolveEnableVertexAttribArray(GLuint index)
1976 {
1977     RESOLVE_FUNC_VOID(0, EnableVertexAttribArray)(index);
1978 }
1979
1980 static void QOPENGLF_APIENTRY qopenglfResolveFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1981 {
1982     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, FramebufferRenderbuffer)(target, attachment, renderbuffertarget, renderbuffer);
1983 }
1984
1985 static void QOPENGLF_APIENTRY qopenglfResolveFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1986 {
1987     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, FramebufferTexture2D)(target, attachment, textarget, texture, level);
1988 }
1989
1990 static void QOPENGLF_APIENTRY qopenglfResolveGenBuffers(GLsizei n, GLuint* buffers)
1991 {
1992     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, GenBuffers)(n, buffers);
1993 }
1994
1995 static void QOPENGLF_APIENTRY qopenglfResolveGenerateMipmap(GLenum target)
1996 {
1997     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, GenerateMipmap)(target);
1998 }
1999
2000 static void QOPENGLF_APIENTRY qopenglfResolveGenFramebuffers(GLsizei n, GLuint* framebuffers)
2001 {
2002     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, GenFramebuffers)(n, framebuffers);
2003 }
2004
2005 static void QOPENGLF_APIENTRY qopenglfResolveGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2006 {
2007     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, GenRenderbuffers)(n, renderbuffers);
2008 }
2009
2010 static void QOPENGLF_APIENTRY qopenglfResolveGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
2011 {
2012     RESOLVE_FUNC_VOID(0, GetActiveAttrib)(program, index, bufsize, length, size, type, name);
2013 }
2014
2015 static void QOPENGLF_APIENTRY qopenglfResolveGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
2016 {
2017     RESOLVE_FUNC_VOID(0, GetActiveUniform)(program, index, bufsize, length, size, type, name);
2018 }
2019
2020 static void QOPENGLF_APIENTRY qopenglfResolveGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2021 {
2022     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, GetAttachedShaders, GetAttachedObjects)(program, maxcount, count, shaders);
2023 }
2024
2025 static GLint QOPENGLF_APIENTRY qopenglfResolveGetAttribLocation(GLuint program, const char* name)
2026 {
2027     RESOLVE_FUNC(GLint, 0, GetAttribLocation)(program, name);
2028 }
2029
2030 static void QOPENGLF_APIENTRY qopenglfResolveGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2031 {
2032     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, GetBufferParameteriv)(target, pname, params);
2033 }
2034
2035 static void QOPENGLF_APIENTRY qopenglfResolveGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2036 {
2037     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, GetFramebufferAttachmentParameteriv)(target, attachment, pname, params);
2038 }
2039
2040 static void QOPENGLF_APIENTRY qopenglfResolveGetProgramiv(GLuint program, GLenum pname, GLint* params)
2041 {
2042     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, GetProgramiv, GetObjectParameteriv)(program, pname, params);
2043 }
2044
2045 static void QOPENGLF_APIENTRY qopenglfResolveGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
2046 {
2047     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, GetProgramInfoLog, GetInfoLog)(program, bufsize, length, infolog);
2048 }
2049
2050 static void QOPENGLF_APIENTRY qopenglfResolveGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2051 {
2052     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, GetRenderbufferParameteriv)(target, pname, params);
2053 }
2054
2055 static void QOPENGLF_APIENTRY qopenglfResolveGetShaderiv(GLuint shader, GLenum pname, GLint* params)
2056 {
2057     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, GetShaderiv, GetObjectParameteriv)(shader, pname, params);
2058 }
2059
2060 static void QOPENGLF_APIENTRY qopenglfResolveGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
2061 {
2062     RESOLVE_FUNC_VOID_WITH_ALTERNATE(0, GetShaderInfoLog, GetInfoLog)(shader, bufsize, length, infolog);
2063 }
2064
2065 static void QOPENGLF_APIENTRY qopenglfSpecialGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2066 {
2067     Q_UNUSED(shadertype);
2068     Q_UNUSED(precisiontype);
2069     range[0] = range[1] = precision[0] = 0;
2070 }
2071
2072 static void QOPENGLF_APIENTRY qopenglfResolveGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2073 {
2074     RESOLVE_FUNC_SPECIAL_VOID(ResolveOES | ResolveEXT, GetShaderPrecisionFormat)(shadertype, precisiontype, range, precision);
2075 }
2076
2077 static void QOPENGLF_APIENTRY qopenglfResolveGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
2078 {
2079     RESOLVE_FUNC_VOID(0, GetShaderSource)(shader, bufsize, length, source);
2080 }
2081
2082 static void QOPENGLF_APIENTRY qopenglfResolveGetUniformfv(GLuint program, GLint location, GLfloat* params)
2083 {
2084     RESOLVE_FUNC_VOID(0, GetUniformfv)(program, location, params);
2085 }
2086
2087 static void QOPENGLF_APIENTRY qopenglfResolveGetUniformiv(GLuint program, GLint location, GLint* params)
2088 {
2089     RESOLVE_FUNC_VOID(0, GetUniformiv)(program, location, params);
2090 }
2091
2092 static GLint QOPENGLF_APIENTRY qopenglfResolveGetUniformLocation(GLuint program, const char* name)
2093 {
2094     RESOLVE_FUNC(GLint, 0, GetUniformLocation)(program, name);
2095 }
2096
2097 static void QOPENGLF_APIENTRY qopenglfResolveGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
2098 {
2099     RESOLVE_FUNC_VOID(0, GetVertexAttribfv)(index, pname, params);
2100 }
2101
2102 static void QOPENGLF_APIENTRY qopenglfResolveGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
2103 {
2104     RESOLVE_FUNC_VOID(0, GetVertexAttribiv)(index, pname, params);
2105 }
2106
2107 static void QOPENGLF_APIENTRY qopenglfResolveGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
2108 {
2109     RESOLVE_FUNC_VOID(0, GetVertexAttribPointerv)(index, pname, pointer);
2110 }
2111
2112 static GLboolean QOPENGLF_APIENTRY qopenglfResolveIsBuffer(GLuint buffer)
2113 {
2114     RESOLVE_FUNC(GLboolean, ResolveOES | ResolveEXT, IsBuffer)(buffer);
2115 }
2116
2117 static GLboolean QOPENGLF_APIENTRY qopenglfResolveIsFramebuffer(GLuint framebuffer)
2118 {
2119     RESOLVE_FUNC(GLboolean, ResolveOES | ResolveEXT, IsFramebuffer)(framebuffer);
2120 }
2121
2122 static GLboolean QOPENGLF_APIENTRY qopenglfSpecialIsProgram(GLuint program)
2123 {
2124     return program != 0;
2125 }
2126
2127 static GLboolean QOPENGLF_APIENTRY qopenglfResolveIsProgram(GLuint program)
2128 {
2129     RESOLVE_FUNC_SPECIAL(GLboolean, 0, IsProgram)(program);
2130 }
2131
2132 static GLboolean QOPENGLF_APIENTRY qopenglfResolveIsRenderbuffer(GLuint renderbuffer)
2133 {
2134     RESOLVE_FUNC(GLboolean, ResolveOES | ResolveEXT, IsRenderbuffer)(renderbuffer);
2135 }
2136
2137 static GLboolean QOPENGLF_APIENTRY qopenglfSpecialIsShader(GLuint shader)
2138 {
2139     return shader != 0;
2140 }
2141
2142 static GLboolean QOPENGLF_APIENTRY qopenglfResolveIsShader(GLuint shader)
2143 {
2144     RESOLVE_FUNC_SPECIAL(GLboolean, 0, IsShader)(shader);
2145 }
2146
2147 static void QOPENGLF_APIENTRY qopenglfResolveLinkProgram(GLuint program)
2148 {
2149     RESOLVE_FUNC_VOID(0, LinkProgram)(program);
2150 }
2151
2152 static void QOPENGLF_APIENTRY qopenglfSpecialReleaseShaderCompiler()
2153 {
2154 }
2155
2156 static void QOPENGLF_APIENTRY qopenglfResolveReleaseShaderCompiler()
2157 {
2158     RESOLVE_FUNC_SPECIAL_VOID(0, ReleaseShaderCompiler)();
2159 }
2160
2161 static void QOPENGLF_APIENTRY qopenglfResolveRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
2162 {
2163     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, RenderbufferStorage)(target, internalformat, width, height);
2164 }
2165
2166 static void QOPENGLF_APIENTRY qopenglfResolveSampleCoverage(GLclampf value, GLboolean invert)
2167 {
2168     RESOLVE_FUNC_VOID(ResolveOES | ResolveEXT, SampleCoverage)(value, invert);
2169 }
2170
2171 static void QOPENGLF_APIENTRY qopenglfResolveShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLint length)
2172 {
2173     RESOLVE_FUNC_VOID(0, ShaderBinary)(n, shaders, binaryformat, binary, length);
2174 }
2175
2176 static void QOPENGLF_APIENTRY qopenglfResolveShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
2177 {
2178     RESOLVE_FUNC_VOID(0, ShaderSource)(shader, count, string, length);
2179 }
2180
2181 static void QOPENGLF_APIENTRY qopenglfResolveStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
2182 {
2183     RESOLVE_FUNC_VOID(ResolveEXT, StencilFuncSeparate)(face, func, ref, mask);
2184 }
2185
2186 static void QOPENGLF_APIENTRY qopenglfResolveStencilMaskSeparate(GLenum face, GLuint mask)
2187 {
2188     RESOLVE_FUNC_VOID(ResolveEXT, StencilMaskSeparate)(face, mask);
2189 }
2190
2191 static void QOPENGLF_APIENTRY qopenglfResolveStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
2192 {
2193     RESOLVE_FUNC_VOID(ResolveEXT, StencilOpSeparate)(face, fail, zfail, zpass);
2194 }
2195
2196 static void QOPENGLF_APIENTRY qopenglfResolveUniform1f(GLint location, GLfloat x)
2197 {
2198     RESOLVE_FUNC_VOID(0, Uniform1f)(location, x);
2199 }
2200
2201 static void QOPENGLF_APIENTRY qopenglfResolveUniform1fv(GLint location, GLsizei count, const GLfloat* v)
2202 {
2203     RESOLVE_FUNC_VOID(0, Uniform1fv)(location, count, v);
2204 }
2205
2206 static void QOPENGLF_APIENTRY qopenglfResolveUniform1i(GLint location, GLint x)
2207 {
2208     RESOLVE_FUNC_VOID(0, Uniform1i)(location, x);
2209 }
2210
2211 static void QOPENGLF_APIENTRY qopenglfResolveUniform1iv(GLint location, GLsizei count, const GLint* v)
2212 {
2213     RESOLVE_FUNC_VOID(0, Uniform1iv)(location, count, v);
2214 }
2215
2216 static void QOPENGLF_APIENTRY qopenglfResolveUniform2f(GLint location, GLfloat x, GLfloat y)
2217 {
2218     RESOLVE_FUNC_VOID(0, Uniform2f)(location, x, y);
2219 }
2220
2221 static void QOPENGLF_APIENTRY qopenglfResolveUniform2fv(GLint location, GLsizei count, const GLfloat* v)
2222 {
2223     RESOLVE_FUNC_VOID(0, Uniform2fv)(location, count, v);
2224 }
2225
2226 static void QOPENGLF_APIENTRY qopenglfResolveUniform2i(GLint location, GLint x, GLint y)
2227 {
2228     RESOLVE_FUNC_VOID(0, Uniform2i)(location, x, y);
2229 }
2230
2231 static void QOPENGLF_APIENTRY qopenglfResolveUniform2iv(GLint location, GLsizei count, const GLint* v)
2232 {
2233     RESOLVE_FUNC_VOID(0, Uniform2iv)(location, count, v);
2234 }
2235
2236 static void QOPENGLF_APIENTRY qopenglfResolveUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
2237 {
2238     RESOLVE_FUNC_VOID(0, Uniform3f)(location, x, y, z);
2239 }
2240
2241 static void QOPENGLF_APIENTRY qopenglfResolveUniform3fv(GLint location, GLsizei count, const GLfloat* v)
2242 {
2243     RESOLVE_FUNC_VOID(0, Uniform3fv)(location, count, v);
2244 }
2245
2246 static void QOPENGLF_APIENTRY qopenglfResolveUniform3i(GLint location, GLint x, GLint y, GLint z)
2247 {
2248     RESOLVE_FUNC_VOID(0, Uniform3i)(location, x, y, z);
2249 }
2250
2251 static void QOPENGLF_APIENTRY qopenglfResolveUniform3iv(GLint location, GLsizei count, const GLint* v)
2252 {
2253     RESOLVE_FUNC_VOID(0, Uniform3iv)(location, count, v);
2254 }
2255
2256 static void QOPENGLF_APIENTRY qopenglfResolveUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
2257 {
2258     RESOLVE_FUNC_VOID(0, Uniform4f)(location, x, y, z, w);
2259 }
2260
2261 static void QOPENGLF_APIENTRY qopenglfResolveUniform4fv(GLint location, GLsizei count, const GLfloat* v)
2262 {
2263     RESOLVE_FUNC_VOID(0, Uniform4fv)(location, count, v);
2264 }
2265
2266 static void QOPENGLF_APIENTRY qopenglfResolveUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
2267 {
2268     RESOLVE_FUNC_VOID(0, Uniform4i)(location, x, y, z, w);
2269 }
2270
2271 static void QOPENGLF_APIENTRY qopenglfResolveUniform4iv(GLint location, GLsizei count, const GLint* v)
2272 {
2273     RESOLVE_FUNC_VOID(0, Uniform4iv)(location, count, v);
2274 }
2275
2276 static void QOPENGLF_APIENTRY qopenglfResolveUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
2277 {
2278     RESOLVE_FUNC_VOID(0, UniformMatrix2fv)(location, count, transpose, value);
2279 }
2280
2281 static void QOPENGLF_APIENTRY qopenglfResolveUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
2282 {
2283     RESOLVE_FUNC_VOID(0, UniformMatrix3fv)(location, count, transpose, value);
2284 }
2285
2286 static void QOPENGLF_APIENTRY qopenglfResolveUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
2287 {
2288     RESOLVE_FUNC_VOID(0, UniformMatrix4fv)(location, count, transpose, value);
2289 }
2290
2291 static void QOPENGLF_APIENTRY qopenglfResolveUseProgram(GLuint program)
2292 {
2293     RESOLVE_FUNC_VOID(0, UseProgram)(program);
2294 }
2295
2296 static void QOPENGLF_APIENTRY qopenglfResolveValidateProgram(GLuint program)
2297 {
2298     RESOLVE_FUNC_VOID(0, ValidateProgram)(program);
2299 }
2300
2301 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib1f(GLuint indx, GLfloat x)
2302 {
2303     RESOLVE_FUNC_VOID(0, VertexAttrib1f)(indx, x);
2304 }
2305
2306 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib1fv(GLuint indx, const GLfloat* values)
2307 {
2308     RESOLVE_FUNC_VOID(0, VertexAttrib1fv)(indx, values);
2309 }
2310
2311 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
2312 {
2313     RESOLVE_FUNC_VOID(0, VertexAttrib2f)(indx, x, y);
2314 }
2315
2316 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib2fv(GLuint indx, const GLfloat* values)
2317 {
2318     RESOLVE_FUNC_VOID(0, VertexAttrib2fv)(indx, values);
2319 }
2320
2321 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
2322 {
2323     RESOLVE_FUNC_VOID(0, VertexAttrib3f)(indx, x, y, z);
2324 }
2325
2326 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib3fv(GLuint indx, const GLfloat* values)
2327 {
2328     RESOLVE_FUNC_VOID(0, VertexAttrib3fv)(indx, values);
2329 }
2330
2331 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
2332 {
2333     RESOLVE_FUNC_VOID(0, VertexAttrib4f)(indx, x, y, z, w);
2334 }
2335
2336 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttrib4fv(GLuint indx, const GLfloat* values)
2337 {
2338     RESOLVE_FUNC_VOID(0, VertexAttrib4fv)(indx, values);
2339 }
2340
2341 static void QOPENGLF_APIENTRY qopenglfResolveVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
2342 {
2343     RESOLVE_FUNC_VOID(0, VertexAttribPointer)(indx, size, type, normalized, stride, ptr);
2344 }
2345
2346 #endif // !QT_OPENGL_ES_2
2347
2348 static GLvoid *QOPENGLF_APIENTRY qopenglfResolveMapBuffer(GLenum target, GLenum access)
2349 {
2350     RESOLVE_FUNC(GLvoid *, ResolveOES, MapBuffer)(target, access);
2351 }
2352
2353 static GLboolean QOPENGLF_APIENTRY qopenglfResolveUnmapBuffer(GLenum target)
2354 {
2355     RESOLVE_FUNC(GLboolean, ResolveOES, UnmapBuffer)(target);
2356 }
2357
2358 static void QOPENGLF_APIENTRY qopenglfResolveBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
2359                        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
2360                        GLbitfield mask, GLenum filter)
2361 {
2362     RESOLVE_FUNC_VOID(ResolveEXT, BlitFramebuffer)
2363         (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
2364 }
2365
2366 static void QOPENGLF_APIENTRY qopenglfResolveRenderbufferStorageMultisample(GLenum target, GLsizei samples,
2367                                       GLenum internalFormat,
2368                                       GLsizei width, GLsizei height)
2369 {
2370     RESOLVE_FUNC_VOID(ResolveEXT, RenderbufferStorageMultisample)
2371         (target, samples, internalFormat, width, height);
2372 }
2373
2374 static void QOPENGLF_APIENTRY qopenglfResolveGetBufferSubData(GLenum target, qopengl_GLintptr offset, qopengl_GLsizeiptr size, GLvoid *data)
2375 {
2376     RESOLVE_FUNC_VOID(ResolveEXT, GetBufferSubData)
2377         (target, offset, size, data);
2378 }
2379
2380 QOpenGLFunctionsPrivate::QOpenGLFunctionsPrivate(QOpenGLContext *)
2381 {
2382     /* Assign a pointer to an above defined static function
2383      * which on first call resolves the function from the current
2384      * context, assigns it to the member variable and executes it
2385      * (see Resolver template) */
2386 #ifndef QT_OPENGL_ES_2
2387     ActiveTexture = qopenglfResolveActiveTexture;
2388     AttachShader = qopenglfResolveAttachShader;
2389     BindAttribLocation = qopenglfResolveBindAttribLocation;
2390     BindBuffer = qopenglfResolveBindBuffer;
2391     BindFramebuffer = qopenglfResolveBindFramebuffer;
2392     BindRenderbuffer = qopenglfResolveBindRenderbuffer;
2393     BlendColor = qopenglfResolveBlendColor;
2394     BlendEquation = qopenglfResolveBlendEquation;
2395     BlendEquationSeparate = qopenglfResolveBlendEquationSeparate;
2396     BlendFuncSeparate = qopenglfResolveBlendFuncSeparate;
2397     BufferData = qopenglfResolveBufferData;
2398     BufferSubData = qopenglfResolveBufferSubData;
2399     CheckFramebufferStatus = qopenglfResolveCheckFramebufferStatus;
2400     CompileShader = qopenglfResolveCompileShader;
2401     CompressedTexImage2D = qopenglfResolveCompressedTexImage2D;
2402     CompressedTexSubImage2D = qopenglfResolveCompressedTexSubImage2D;
2403     CreateProgram = qopenglfResolveCreateProgram;
2404     CreateShader = qopenglfResolveCreateShader;
2405     DeleteBuffers = qopenglfResolveDeleteBuffers;
2406     DeleteFramebuffers = qopenglfResolveDeleteFramebuffers;
2407     DeleteProgram = qopenglfResolveDeleteProgram;
2408     DeleteRenderbuffers = qopenglfResolveDeleteRenderbuffers;
2409     DeleteShader = qopenglfResolveDeleteShader;
2410     DetachShader = qopenglfResolveDetachShader;
2411     DisableVertexAttribArray = qopenglfResolveDisableVertexAttribArray;
2412     EnableVertexAttribArray = qopenglfResolveEnableVertexAttribArray;
2413     FramebufferRenderbuffer = qopenglfResolveFramebufferRenderbuffer;
2414     FramebufferTexture2D = qopenglfResolveFramebufferTexture2D;
2415     GenBuffers = qopenglfResolveGenBuffers;
2416     GenerateMipmap = qopenglfResolveGenerateMipmap;
2417     GenFramebuffers = qopenglfResolveGenFramebuffers;
2418     GenRenderbuffers = qopenglfResolveGenRenderbuffers;
2419     GetActiveAttrib = qopenglfResolveGetActiveAttrib;
2420     GetActiveUniform = qopenglfResolveGetActiveUniform;
2421     GetAttachedShaders = qopenglfResolveGetAttachedShaders;
2422     GetAttribLocation = qopenglfResolveGetAttribLocation;
2423     GetBufferParameteriv = qopenglfResolveGetBufferParameteriv;
2424     GetFramebufferAttachmentParameteriv = qopenglfResolveGetFramebufferAttachmentParameteriv;
2425     GetProgramiv = qopenglfResolveGetProgramiv;
2426     GetProgramInfoLog = qopenglfResolveGetProgramInfoLog;
2427     GetRenderbufferParameteriv = qopenglfResolveGetRenderbufferParameteriv;
2428     GetShaderiv = qopenglfResolveGetShaderiv;
2429     GetShaderInfoLog = qopenglfResolveGetShaderInfoLog;
2430     GetShaderPrecisionFormat = qopenglfResolveGetShaderPrecisionFormat;
2431     GetShaderSource = qopenglfResolveGetShaderSource;
2432     GetUniformfv = qopenglfResolveGetUniformfv;
2433     GetUniformiv = qopenglfResolveGetUniformiv;
2434     GetUniformLocation = qopenglfResolveGetUniformLocation;
2435     GetVertexAttribfv = qopenglfResolveGetVertexAttribfv;
2436     GetVertexAttribiv = qopenglfResolveGetVertexAttribiv;
2437     GetVertexAttribPointerv = qopenglfResolveGetVertexAttribPointerv;
2438     IsBuffer = qopenglfResolveIsBuffer;
2439     IsFramebuffer = qopenglfResolveIsFramebuffer;
2440     IsProgram = qopenglfResolveIsProgram;
2441     IsRenderbuffer = qopenglfResolveIsRenderbuffer;
2442     IsShader = qopenglfResolveIsShader;
2443     LinkProgram = qopenglfResolveLinkProgram;
2444     ReleaseShaderCompiler = qopenglfResolveReleaseShaderCompiler;
2445     RenderbufferStorage = qopenglfResolveRenderbufferStorage;
2446     SampleCoverage = qopenglfResolveSampleCoverage;
2447     ShaderBinary = qopenglfResolveShaderBinary;
2448     ShaderSource = qopenglfResolveShaderSource;
2449     StencilFuncSeparate = qopenglfResolveStencilFuncSeparate;
2450     StencilMaskSeparate = qopenglfResolveStencilMaskSeparate;
2451     StencilOpSeparate = qopenglfResolveStencilOpSeparate;
2452     Uniform1f = qopenglfResolveUniform1f;
2453     Uniform1fv = qopenglfResolveUniform1fv;
2454     Uniform1i = qopenglfResolveUniform1i;
2455     Uniform1iv = qopenglfResolveUniform1iv;
2456     Uniform2f = qopenglfResolveUniform2f;
2457     Uniform2fv = qopenglfResolveUniform2fv;
2458     Uniform2i = qopenglfResolveUniform2i;
2459     Uniform2iv = qopenglfResolveUniform2iv;
2460     Uniform3f = qopenglfResolveUniform3f;
2461     Uniform3fv = qopenglfResolveUniform3fv;
2462     Uniform3i = qopenglfResolveUniform3i;
2463     Uniform3iv = qopenglfResolveUniform3iv;
2464     Uniform4f = qopenglfResolveUniform4f;
2465     Uniform4fv = qopenglfResolveUniform4fv;
2466     Uniform4i = qopenglfResolveUniform4i;
2467     Uniform4iv = qopenglfResolveUniform4iv;
2468     UniformMatrix2fv = qopenglfResolveUniformMatrix2fv;
2469     UniformMatrix3fv = qopenglfResolveUniformMatrix3fv;
2470     UniformMatrix4fv = qopenglfResolveUniformMatrix4fv;
2471     UseProgram = qopenglfResolveUseProgram;
2472     ValidateProgram = qopenglfResolveValidateProgram;
2473     VertexAttrib1f = qopenglfResolveVertexAttrib1f;
2474     VertexAttrib1fv = qopenglfResolveVertexAttrib1fv;
2475     VertexAttrib2f = qopenglfResolveVertexAttrib2f;
2476     VertexAttrib2fv = qopenglfResolveVertexAttrib2fv;
2477     VertexAttrib3f = qopenglfResolveVertexAttrib3f;
2478     VertexAttrib3fv = qopenglfResolveVertexAttrib3fv;
2479     VertexAttrib4f = qopenglfResolveVertexAttrib4f;
2480     VertexAttrib4fv = qopenglfResolveVertexAttrib4fv;
2481     VertexAttribPointer = qopenglfResolveVertexAttribPointer;
2482 #endif // !QT_OPENGL_ES_2
2483 }
2484
2485 QOpenGLExtensionsPrivate::QOpenGLExtensionsPrivate(QOpenGLContext *ctx)
2486     : QOpenGLFunctionsPrivate(ctx)
2487 {
2488     MapBuffer = qopenglfResolveMapBuffer;
2489     UnmapBuffer = qopenglfResolveUnmapBuffer;
2490     BlitFramebuffer = qopenglfResolveBlitFramebuffer;
2491     RenderbufferStorageMultisample = qopenglfResolveRenderbufferStorageMultisample;
2492     GetBufferSubData = qopenglfResolveGetBufferSubData;
2493 }
2494
2495 QT_END_NAMESPACE