~oif-team/ubuntu/natty/qt4-x11/xi2.1

« back to all changes in this revision

Viewing changes to src/opengl/qglextensions.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Alessandro Ghersi
  • Date: 2009-11-02 18:30:08 UTC
  • mfrom: (1.2.2 upstream)
  • mto: (15.2.5 experimental)
  • mto: This revision was merged to the branch mainline in revision 88.
  • Revision ID: james.westby@ubuntu.com-20091102183008-b6a4gcs128mvfb3m
Tags: upstream-4.6.0~beta1
ImportĀ upstreamĀ versionĀ 4.6.0~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/****************************************************************************
2
2
**
3
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 
4
** All rights reserved.
4
5
** Contact: Nokia Corporation (qt-info@nokia.com)
5
6
**
6
7
** This file is part of the QtOpenGL module of the Qt Toolkit.
7
8
**
8
9
** $QT_BEGIN_LICENSE:LGPL$
9
 
** Commercial Usage
10
 
** Licensees holding valid Qt Commercial licenses may use this file in
11
 
** accordance with the Qt Commercial License Agreement provided with the
12
 
** Software or, alternatively, in accordance with the terms contained in
13
 
** a written agreement between you and Nokia.
 
10
** No Commercial Usage
 
11
** This file contains pre-release code and may not be distributed.
 
12
** You may use this file in accordance with the terms and conditions
 
13
** contained in the Technology Preview License Agreement accompanying
 
14
** this package.
14
15
**
15
16
** GNU Lesser General Public License Usage
16
17
** Alternatively, this file may be used under the terms of the GNU Lesser
20
21
** ensure the GNU Lesser General Public License version 2.1 requirements
21
22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22
23
**
23
 
** In addition, as a special exception, Nokia gives you certain
24
 
** additional rights. These rights are described in the Nokia Qt LGPL
25
 
** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26
 
** package.
27
 
**
28
 
** GNU General Public License Usage
29
 
** Alternatively, this file may be used under the terms of the GNU
30
 
** General Public License version 3.0 as published by the Free Software
31
 
** Foundation and appearing in the file LICENSE.GPL included in the
32
 
** packaging of this file.  Please review the following information to
33
 
** ensure the GNU General Public License version 3.0 requirements will be
34
 
** met: http://www.gnu.org/copyleft/gpl.html.
35
 
**
36
 
** If you are unsure which license is appropriate for your use, please
37
 
** contact the sales department at http://www.qtsoftware.com/contact.
 
24
** In addition, as a special exception, Nokia gives you certain additional
 
25
** rights.  These rights are described in the Nokia Qt LGPL Exception
 
26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 
27
**
 
28
** If you have questions regarding the use of this file, please contact
 
29
** Nokia at qt-info@nokia.com.
 
30
**
 
31
**
 
32
**
 
33
**
 
34
**
 
35
**
 
36
**
 
37
**
38
38
** $QT_END_LICENSE$
39
39
**
40
40
****************************************************************************/
43
43
 
44
44
QT_BEGIN_NAMESPACE
45
45
 
 
46
static void *qt_gl_getProcAddress_search
 
47
    (QGLContext *ctx, const char *name1, const char *name2,
 
48
     const char *name3, const char *name4)
 
49
{
 
50
    void *addr;
 
51
 
 
52
    addr = ctx->getProcAddress(QLatin1String(name1));
 
53
    if (addr)
 
54
        return addr;
 
55
 
 
56
    addr = ctx->getProcAddress(QLatin1String(name2));
 
57
    if (addr)
 
58
        return addr;
 
59
 
 
60
    addr = ctx->getProcAddress(QLatin1String(name3));
 
61
    if (addr)
 
62
        return addr;
 
63
 
 
64
    if (name4)
 
65
        return ctx->getProcAddress(QLatin1String(name4));
 
66
 
 
67
    return 0;
 
68
}
 
69
 
 
70
// Search for an extension function starting with the most likely
 
71
// function suffix first, and then trying the other variations.
 
72
#if defined(QT_OPENGL_ES)
 
73
#define qt_gl_getProcAddress(ctx,name) \
 
74
    qt_gl_getProcAddress_search((ctx), name, name "OES", name "EXT", name "ARB")
 
75
#define qt_gl_getProcAddressEXT(ctx,name) \
 
76
    qt_gl_getProcAddress_search((ctx), name "OES", name, name "EXT", name "ARB")
 
77
#define qt_gl_getProcAddressARB(ctx,name) \
 
78
    qt_gl_getProcAddress_search((ctx), name "OES", name, name "ARB", name "EXT")
 
79
#define qt_gl_getProcAddressOES(ctx,name) \
 
80
    qt_gl_getProcAddress_search((ctx), name "OES", name, name "EXT", name "ARB")
 
81
#else
 
82
#define qt_gl_getProcAddress(ctx,name) \
 
83
    qt_gl_getProcAddress_search((ctx), name, name "ARB", name "EXT", 0)
 
84
#define qt_gl_getProcAddressEXT(ctx,name) \
 
85
    qt_gl_getProcAddress_search((ctx), name "EXT", name, name "ARB", 0)
 
86
#define qt_gl_getProcAddressARB(ctx,name) \
 
87
    qt_gl_getProcAddress_search((ctx), name "ARB", name, name "EXT", 0)
 
88
#define qt_gl_getProcAddressOES(ctx,name) \
 
89
    qt_gl_getProcAddress_search((ctx), name "OES", name, name "EXT", name "ARB")
 
90
#endif
 
91
 
46
92
bool qt_resolve_framebufferobject_extensions(QGLContext *ctx)
47
93
{
48
 
#if !defined(QT_OPENGL_ES_2)
49
 
    if (glIsRenderbufferEXT != 0)
50
 
        return true;
 
94
#if defined(QT_OPENGL_ES_2)
 
95
    static bool have_resolved = false;
 
96
    if (have_resolved)
 
97
        return true;
 
98
    have_resolved = true;
 
99
#else
 
100
    if (glIsRenderbuffer != 0)
 
101
        return true;
 
102
#endif
51
103
 
52
104
    if (ctx == 0) {
53
105
        qWarning("QGLFramebufferObject: Unable to resolve framebuffer object extensions -"
55
107
        return false;
56
108
    }
57
109
 
58
 
    glIsRenderbufferEXT = (_glIsRenderbufferEXT) ctx->getProcAddress(QLatin1String("glIsRenderbufferEXT"));
59
 
    glBindRenderbufferEXT = (_glBindRenderbufferEXT) ctx->getProcAddress(QLatin1String("glBindRenderbufferEXT"));
60
 
    glDeleteRenderbuffersEXT = (_glDeleteRenderbuffersEXT) ctx->getProcAddress(QLatin1String("glDeleteRenderbuffersEXT"));
61
 
    glGenRenderbuffersEXT = (_glGenRenderbuffersEXT) ctx->getProcAddress(QLatin1String("glGenRenderbuffersEXT"));
62
 
    glRenderbufferStorageEXT = (_glRenderbufferStorageEXT) ctx->getProcAddress(QLatin1String("glRenderbufferStorageEXT"));
63
 
    glGetRenderbufferParameterivEXT =
64
 
        (_glGetRenderbufferParameterivEXT) ctx->getProcAddress(QLatin1String("glGetRenderbufferParameterivEXT"));
65
 
    glIsFramebufferEXT = (_glIsFramebufferEXT) ctx->getProcAddress(QLatin1String("glIsFramebufferEXT"));
66
 
    glBindFramebufferEXT = (_glBindFramebufferEXT) ctx->getProcAddress(QLatin1String("glBindFramebufferEXT"));
67
 
    glDeleteFramebuffersEXT = (_glDeleteFramebuffersEXT) ctx->getProcAddress(QLatin1String("glDeleteFramebuffersEXT"));
68
 
    glGenFramebuffersEXT = (_glGenFramebuffersEXT) ctx->getProcAddress(QLatin1String("glGenFramebuffersEXT"));
69
 
    glCheckFramebufferStatusEXT = (_glCheckFramebufferStatusEXT) ctx->getProcAddress(QLatin1String("glCheckFramebufferStatusEXT"));
70
 
    glFramebufferTexture1DEXT = (_glFramebufferTexture1DEXT) ctx->getProcAddress(QLatin1String("glFramebufferTexture1DEXT"));
71
 
    glFramebufferTexture2DEXT = (_glFramebufferTexture2DEXT) ctx->getProcAddress(QLatin1String("glFramebufferTexture2DEXT"));
72
 
    glFramebufferTexture3DEXT = (_glFramebufferTexture3DEXT) ctx->getProcAddress(QLatin1String("glFramebufferTexture3DEXT"));
73
 
    glFramebufferRenderbufferEXT = (_glFramebufferRenderbufferEXT) ctx->getProcAddress(QLatin1String("glFramebufferRenderbufferEXT"));
74
 
    glGetFramebufferAttachmentParameterivEXT =
75
 
        (_glGetFramebufferAttachmentParameterivEXT) ctx->getProcAddress(QLatin1String("glGetFramebufferAttachmentParameterivEXT"));
76
 
    glGenerateMipmapEXT = (_glGenerateMipmapEXT) ctx->getProcAddress(QLatin1String("glGenerateMipmapEXT"));
77
 
    return glIsRenderbufferEXT;
 
110
 
 
111
    glBlitFramebufferEXT = (_glBlitFramebufferEXT) qt_gl_getProcAddressEXT(ctx, "glBlitFramebuffer");
 
112
    glRenderbufferStorageMultisampleEXT =
 
113
        (_glRenderbufferStorageMultisampleEXT) qt_gl_getProcAddressEXT(ctx, "glRenderbufferStorageMultisample");
 
114
 
 
115
#if !defined(QT_OPENGL_ES_2)
 
116
    glIsRenderbuffer = (_glIsRenderbuffer) qt_gl_getProcAddressEXT(ctx, "glIsRenderbuffer");
 
117
    if (!glIsRenderbuffer)
 
118
        return false;   // Not much point searching for anything else.
 
119
    glBindRenderbuffer = (_glBindRenderbuffer) qt_gl_getProcAddressEXT(ctx, "glBindRenderbuffer");
 
120
    glDeleteRenderbuffers = (_glDeleteRenderbuffers) qt_gl_getProcAddressEXT(ctx, "glDeleteRenderbuffers");
 
121
    glGenRenderbuffers = (_glGenRenderbuffers) qt_gl_getProcAddressEXT(ctx, "glGenRenderbuffers");
 
122
    glRenderbufferStorage = (_glRenderbufferStorage) qt_gl_getProcAddressEXT(ctx, "glRenderbufferStorage");
 
123
    glGetRenderbufferParameteriv =
 
124
        (_glGetRenderbufferParameteriv) qt_gl_getProcAddressEXT(ctx, "glGetRenderbufferParameteriv");
 
125
    glIsFramebuffer = (_glIsFramebuffer) qt_gl_getProcAddressEXT(ctx, "glIsFramebuffer");
 
126
    glBindFramebuffer = (_glBindFramebuffer) qt_gl_getProcAddressEXT(ctx, "glBindFramebuffer");
 
127
    glDeleteFramebuffers = (_glDeleteFramebuffers) qt_gl_getProcAddressEXT(ctx, "glDeleteFramebuffers");
 
128
    glGenFramebuffers = (_glGenFramebuffers) qt_gl_getProcAddressEXT(ctx, "glGenFramebuffers");
 
129
    glCheckFramebufferStatus = (_glCheckFramebufferStatus) qt_gl_getProcAddressEXT(ctx, "glCheckFramebufferStatus");
 
130
    glFramebufferTexture2D = (_glFramebufferTexture2D) qt_gl_getProcAddressEXT(ctx, "glFramebufferTexture2D");
 
131
    glFramebufferRenderbuffer = (_glFramebufferRenderbuffer) qt_gl_getProcAddressEXT(ctx, "glFramebufferRenderbuffer");
 
132
    glGetFramebufferAttachmentParameteriv =
 
133
        (_glGetFramebufferAttachmentParameteriv) qt_gl_getProcAddressEXT(ctx, "glGetFramebufferAttachmentParameteriv");
 
134
    glGenerateMipmap = (_glGenerateMipmap) qt_gl_getProcAddressEXT(ctx, "glGenerateMipmap");
 
135
 
 
136
    return glIsRenderbuffer != 0;
78
137
#else
79
 
    Q_UNUSED(ctx);
80
138
    return true;
81
139
#endif
82
140
}
83
141
 
 
142
#if !defined(QT_OPENGL_ES_2)
84
143
bool qt_resolve_version_1_3_functions(QGLContext *ctx)
85
144
{
86
145
    if (glMultiTexCoord4f != 0)
89
148
    QGLContext cx(QGLFormat::defaultFormat());
90
149
    glMultiTexCoord4f = (_glMultiTexCoord4f) ctx->getProcAddress(QLatin1String("glMultiTexCoord4f"));
91
150
 
92
 
#if defined(QT_OPENGL_ES_2)
93
 
    return glMultiTexCoord4f;
94
 
#else
95
151
    glActiveTexture = (_glActiveTexture) ctx->getProcAddress(QLatin1String("glActiveTexture"));
96
152
    return glMultiTexCoord4f && glActiveTexture;
 
153
}
97
154
#endif
98
 
}
99
155
 
 
156
#if !defined(QT_OPENGL_ES_2)
100
157
bool qt_resolve_stencil_face_extension(QGLContext *ctx)
101
158
{
102
159
    if (glActiveStencilFaceEXT != 0)
107
164
 
108
165
    return glActiveStencilFaceEXT;
109
166
}
110
 
 
 
167
#endif
 
168
 
 
169
 
 
170
#if !defined(QT_OPENGL_ES_2)
111
171
bool qt_resolve_frag_program_extensions(QGLContext *ctx)
112
172
{
113
173
    if (glProgramStringARB != 0)
126
186
        && glGenProgramsARB
127
187
        && glProgramLocalParameter4fvARB;
128
188
}
 
189
#endif
 
190
 
129
191
 
130
192
bool qt_resolve_buffer_extensions(QGLContext *ctx)
131
193
{
132
 
    if (glBindBufferARB && glDeleteBuffersARB && glGenBuffersARB && glBufferDataARB
133
 
        && glMapBufferARB && glUnmapBufferARB)
 
194
    if (glMapBufferARB && glUnmapBufferARB
 
195
#if !defined(QT_OPENGL_ES_2)
 
196
        && glBindBuffer && glDeleteBuffers && glGenBuffers && glBufferData
 
197
#endif
 
198
        )
134
199
        return true;
135
200
 
136
 
    glBindBufferARB = (_glBindBufferARB) ctx->getProcAddress(QLatin1String("glBindBufferARB"));
137
 
    glDeleteBuffersARB = (_glDeleteBuffersARB) ctx->getProcAddress(QLatin1String("glDeleteBuffersARB"));
138
 
    glGenBuffersARB = (_glGenBuffersARB) ctx->getProcAddress(QLatin1String("glGenBuffersARB"));
139
 
    glBufferDataARB = (_glBufferDataARB) ctx->getProcAddress(QLatin1String("glBufferDataARB"));
140
 
    glMapBufferARB = (_glMapBufferARB) ctx->getProcAddress(QLatin1String("glMapBufferARB"));
141
 
    glUnmapBufferARB = (_glUnmapBufferARB) ctx->getProcAddress(QLatin1String("glUnmapBufferARB"));
 
201
#if !defined(QT_OPENGL_ES_2)
 
202
    glBindBuffer = (_glBindBuffer) qt_gl_getProcAddressARB(ctx, "glBindBuffer");
 
203
    glDeleteBuffers = (_glDeleteBuffers) qt_gl_getProcAddressARB(ctx, "glDeleteBuffers");
 
204
    glGenBuffers = (_glGenBuffers) qt_gl_getProcAddressARB(ctx, "glGenBuffers");
 
205
    glBufferData = (_glBufferData) qt_gl_getProcAddressARB(ctx, "glBufferData");
 
206
#endif
 
207
    glMapBufferARB = (_glMapBufferARB) qt_gl_getProcAddressARB(ctx, "glMapBuffer");
 
208
    glUnmapBufferARB = (_glUnmapBufferARB) qt_gl_getProcAddressARB(ctx, "glUnmapBuffer");
142
209
 
143
 
    return glBindBufferARB
144
 
        && glDeleteBuffersARB
145
 
        && glGenBuffersARB
146
 
        && glBufferDataARB
147
 
        && glMapBufferARB
148
 
        && glUnmapBufferARB;
 
210
    return glMapBufferARB
 
211
        && glUnmapBufferARB
 
212
#if !defined(QT_OPENGL_ES_2)
 
213
        && glBindBuffer
 
214
        && glDeleteBuffers
 
215
        && glGenBuffers
 
216
        && glBufferData
 
217
#endif
 
218
        ;
149
219
}
150
220
 
151
221
bool qt_resolve_glsl_extensions(QGLContext *ctx)
152
222
{
 
223
#if defined(QT_OPENGL_ES_2)
 
224
    // The GLSL shader functions are always present in OpenGL/ES 2.0.
 
225
    // The only exceptions are glGetProgramBinaryOES and glProgramBinaryOES.
 
226
    if (!QGLContextPrivate::extensionFuncs(ctx).qt_glslResolved) {
 
227
        glGetProgramBinaryOES = (_glGetProgramBinaryOES) ctx->getProcAddress(QLatin1String("glGetProgramBinaryOES"));
 
228
        glProgramBinaryOES = (_glProgramBinaryOES) ctx->getProcAddress(QLatin1String("glProgramBinaryOES"));
 
229
        QGLContextPrivate::extensionFuncs(ctx).qt_glslResolved = true;
 
230
    }
 
231
    return true;
 
232
#else
153
233
    if (glCreateShader)
154
234
        return true;
155
235
 
156
236
    glCreateShader = (_glCreateShader) ctx->getProcAddress(QLatin1String("glCreateShader"));
157
 
    glShaderSource = (_glShaderSource) ctx->getProcAddress(QLatin1String("glShaderSource"));
158
 
    glCompileShader = (_glCompileShader) ctx->getProcAddress(QLatin1String("glCompileShader"));
159
 
    glDeleteShader = (_glDeleteShader) ctx->getProcAddress(QLatin1String("glDeleteShader"));
160
 
 
161
 
    glCreateProgram = (_glCreateProgram) ctx->getProcAddress(QLatin1String("glCreateProgram"));
162
 
    glAttachShader = (_glAttachShader) ctx->getProcAddress(QLatin1String("glAttachShader"));
163
 
    glDetachShader = (_glDetachShader) ctx->getProcAddress(QLatin1String("glDetachShader"));
164
 
    glLinkProgram = (_glLinkProgram) ctx->getProcAddress(QLatin1String("glLinkProgram"));
165
 
    glUseProgram = (_glUseProgram) ctx->getProcAddress(QLatin1String("glUseProgram"));
166
 
    glDeleteProgram = (_glDeleteProgram) ctx->getProcAddress(QLatin1String("glDeleteProgram"));
167
 
 
168
 
    glGetShaderInfoLog = (_glGetShaderInfoLog) ctx->getProcAddress(QLatin1String("glGetShaderInfoLog"));
169
 
    glGetShaderiv = (_glGetShaderiv) ctx->getProcAddress(QLatin1String("glGetShaderiv"));
170
 
    glGetProgramiv = (_glGetProgramiv) ctx->getProcAddress(QLatin1String("glGetProgramiv"));
171
 
 
172
 
    glGetUniformLocation = (_glGetUniformLocation) ctx->getProcAddress(QLatin1String("glGetUniformLocation"));
173
 
    glUniform4fv = (_glUniform4fv) ctx->getProcAddress(QLatin1String("glUniform4fv"));
174
 
    glUniform3fv = (_glUniform3fv) ctx->getProcAddress(QLatin1String("glUniform3fv"));
175
 
    glUniform2fv = (_glUniform2fv) ctx->getProcAddress(QLatin1String("glUniform2fv"));
176
 
    glUniform1fv = (_glUniform1fv) ctx->getProcAddress(QLatin1String("glUniform1fv"));
177
 
    glUniform1i = (_glUniform1i) ctx->getProcAddress(QLatin1String("glUniform1i"));
178
 
 
179
 
    return glCreateShader && glShaderSource && glCompileShader && glDeleteProgram &&
180
 
        glCreateProgram && glAttachShader && glDetachShader && glLinkProgram && glUseProgram &&
181
 
        glDeleteProgram && glGetShaderInfoLog && glGetShaderiv && glGetProgramiv && glGetUniformLocation &&
182
 
        glUniform1i && glUniform1fv && glUniform2fv && glUniform3fv && glUniform4fv;
183
 
}
 
237
    if (glCreateShader) {
 
238
        glShaderSource = (_glShaderSource) ctx->getProcAddress(QLatin1String("glShaderSource"));
 
239
        glShaderBinary = (_glShaderBinary) ctx->getProcAddress(QLatin1String("glShaderBinary"));
 
240
        glCompileShader = (_glCompileShader) ctx->getProcAddress(QLatin1String("glCompileShader"));
 
241
        glDeleteShader = (_glDeleteShader) ctx->getProcAddress(QLatin1String("glDeleteShader"));
 
242
        glIsShader = (_glIsShader) ctx->getProcAddress(QLatin1String("glIsShader"));
 
243
 
 
244
        glCreateProgram = (_glCreateProgram) ctx->getProcAddress(QLatin1String("glCreateProgram"));
 
245
        glAttachShader = (_glAttachShader) ctx->getProcAddress(QLatin1String("glAttachShader"));
 
246
        glDetachShader = (_glDetachShader) ctx->getProcAddress(QLatin1String("glDetachShader"));
 
247
        glLinkProgram = (_glLinkProgram) ctx->getProcAddress(QLatin1String("glLinkProgram"));
 
248
        glUseProgram = (_glUseProgram) ctx->getProcAddress(QLatin1String("glUseProgram"));
 
249
        glDeleteProgram = (_glDeleteProgram) ctx->getProcAddress(QLatin1String("glDeleteProgram"));
 
250
        glIsProgram = (_glIsProgram) ctx->getProcAddress(QLatin1String("glIsProgram"));
 
251
 
 
252
        glGetShaderInfoLog = (_glGetShaderInfoLog) ctx->getProcAddress(QLatin1String("glGetShaderInfoLog"));
 
253
        glGetShaderiv = (_glGetShaderiv) ctx->getProcAddress(QLatin1String("glGetShaderiv"));
 
254
        glGetShaderSource = (_glGetShaderSource) ctx->getProcAddress(QLatin1String("glGetShaderSource"));
 
255
        glGetProgramiv = (_glGetProgramiv) ctx->getProcAddress(QLatin1String("glGetProgramiv"));
 
256
        glGetProgramInfoLog = (_glGetProgramInfoLog) ctx->getProcAddress(QLatin1String("glGetProgramInfoLog"));
 
257
 
 
258
        glGetUniformLocation = (_glGetUniformLocation) ctx->getProcAddress(QLatin1String("glGetUniformLocation"));
 
259
        glUniform4fv = (_glUniform4fv) ctx->getProcAddress(QLatin1String("glUniform4fv"));
 
260
        glUniform3fv = (_glUniform3fv) ctx->getProcAddress(QLatin1String("glUniform3fv"));
 
261
        glUniform2fv = (_glUniform2fv) ctx->getProcAddress(QLatin1String("glUniform2fv"));
 
262
        glUniform1fv = (_glUniform1fv) ctx->getProcAddress(QLatin1String("glUniform1fv"));
 
263
        glUniform1i = (_glUniform1i) ctx->getProcAddress(QLatin1String("glUniform1i"));
 
264
        glUniform1iv = (_glUniform1iv) ctx->getProcAddress(QLatin1String("glUniform1iv"));
 
265
        glUniformMatrix2fv = (_glUniformMatrix2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2fv"));
 
266
        glUniformMatrix3fv = (_glUniformMatrix3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3fv"));
 
267
        glUniformMatrix4fv = (_glUniformMatrix4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4fv"));
 
268
        glUniformMatrix2x3fv = (_glUniformMatrix2x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x3fv"));
 
269
        glUniformMatrix2x4fv = (_glUniformMatrix2x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x4fv"));
 
270
        glUniformMatrix3x2fv = (_glUniformMatrix3x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x2fv"));
 
271
        glUniformMatrix3x4fv = (_glUniformMatrix3x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x4fv"));
 
272
        glUniformMatrix4x2fv = (_glUniformMatrix4x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x2fv"));
 
273
        glUniformMatrix4x3fv = (_glUniformMatrix4x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x3fv"));
 
274
 
 
275
        glBindAttribLocation = (_glBindAttribLocation) ctx->getProcAddress(QLatin1String("glBindAttribLocation"));
 
276
        glGetAttribLocation = (_glGetAttribLocation) ctx->getProcAddress(QLatin1String("glGetAttribLocation"));
 
277
        glVertexAttrib1fv = (_glVertexAttrib1fv) ctx->getProcAddress(QLatin1String("glVertexAttrib1fv"));
 
278
        glVertexAttrib2fv = (_glVertexAttrib2fv) ctx->getProcAddress(QLatin1String("glVertexAttrib2fv"));
 
279
        glVertexAttrib3fv = (_glVertexAttrib3fv) ctx->getProcAddress(QLatin1String("glVertexAttrib3fv"));
 
280
        glVertexAttrib4fv = (_glVertexAttrib4fv) ctx->getProcAddress(QLatin1String("glVertexAttrib4fv"));
 
281
        glVertexAttribPointer = (_glVertexAttribPointer) ctx->getProcAddress(QLatin1String("glVertexAttribPointer"));
 
282
        glDisableVertexAttribArray = (_glDisableVertexAttribArray) ctx->getProcAddress(QLatin1String("glDisableVertexAttribArray"));
 
283
        glEnableVertexAttribArray = (_glEnableVertexAttribArray) ctx->getProcAddress(QLatin1String("glEnableVertexAttribArray"));
 
284
 
 
285
    } else {
 
286
        // We may not have the standard shader functions, but we might
 
287
        // have the older ARB functions instead.
 
288
        glCreateShader = (_glCreateShader) ctx->getProcAddress(QLatin1String("glCreateShaderObjectARB"));
 
289
        glShaderSource = (_glShaderSource) ctx->getProcAddress(QLatin1String("glShaderSourceARB"));
 
290
        glShaderBinary = (_glShaderBinary) ctx->getProcAddress(QLatin1String("glShaderBinaryARB"));
 
291
        glCompileShader = (_glCompileShader) ctx->getProcAddress(QLatin1String("glCompileShaderARB"));
 
292
        glDeleteShader = (_glDeleteShader) ctx->getProcAddress(QLatin1String("glDeleteObjectARB"));
 
293
        glIsShader = 0;
 
294
 
 
295
        glCreateProgram = (_glCreateProgram) ctx->getProcAddress(QLatin1String("glCreateProgramObjectARB"));
 
296
        glAttachShader = (_glAttachShader) ctx->getProcAddress(QLatin1String("glAttachObjectARB"));
 
297
        glDetachShader = (_glDetachShader) ctx->getProcAddress(QLatin1String("glDetachObjectARB"));
 
298
        glLinkProgram = (_glLinkProgram) ctx->getProcAddress(QLatin1String("glLinkProgramARB"));
 
299
        glUseProgram = (_glUseProgram) ctx->getProcAddress(QLatin1String("glUseProgramObjectARB"));
 
300
        glDeleteProgram = (_glDeleteProgram) ctx->getProcAddress(QLatin1String("glDeleteObjectARB"));
 
301
        glIsProgram = 0;
 
302
 
 
303
        glGetShaderInfoLog = (_glGetShaderInfoLog) ctx->getProcAddress(QLatin1String("glGetInfoLogARB"));
 
304
        glGetShaderiv = (_glGetShaderiv) ctx->getProcAddress(QLatin1String("glGetObjectParameterivARB"));
 
305
        glGetShaderSource = (_glGetShaderSource) ctx->getProcAddress(QLatin1String("glGetShaderSourceARB"));
 
306
        glGetProgramiv = (_glGetProgramiv) ctx->getProcAddress(QLatin1String("glGetObjectParameterivARB"));
 
307
        glGetProgramInfoLog = (_glGetProgramInfoLog) ctx->getProcAddress(QLatin1String("glGetInfoLogARB"));
 
308
 
 
309
        glGetUniformLocation = (_glGetUniformLocation) ctx->getProcAddress(QLatin1String("glGetUniformLocationARB"));
 
310
        glUniform4fv = (_glUniform4fv) ctx->getProcAddress(QLatin1String("glUniform4fvARB"));
 
311
        glUniform3fv = (_glUniform3fv) ctx->getProcAddress(QLatin1String("glUniform3fvARB"));
 
312
        glUniform2fv = (_glUniform2fv) ctx->getProcAddress(QLatin1String("glUniform2fvARB"));
 
313
        glUniform1fv = (_glUniform1fv) ctx->getProcAddress(QLatin1String("glUniform1fvARB"));
 
314
        glUniform1i = (_glUniform1i) ctx->getProcAddress(QLatin1String("glUniform1iARB"));
 
315
        glUniform1iv = (_glUniform1iv) ctx->getProcAddress(QLatin1String("glUniform1ivARB"));
 
316
        glUniformMatrix2fv = (_glUniformMatrix2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2fvARB"));
 
317
        glUniformMatrix3fv = (_glUniformMatrix3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3fvARB"));
 
318
        glUniformMatrix4fv = (_glUniformMatrix4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4fvARB"));
 
319
        glUniformMatrix2x3fv = (_glUniformMatrix2x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x3fvARB"));
 
320
        glUniformMatrix2x4fv = (_glUniformMatrix2x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x4fvARB"));
 
321
        glUniformMatrix3x2fv = (_glUniformMatrix3x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x2fvARB"));
 
322
        glUniformMatrix3x4fv = (_glUniformMatrix3x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x4fvARB"));
 
323
        glUniformMatrix4x2fv = (_glUniformMatrix4x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x2fvARB"));
 
324
        glUniformMatrix4x3fv = (_glUniformMatrix4x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x3fvARB"));
 
325
 
 
326
        glBindAttribLocation = (_glBindAttribLocation) ctx->getProcAddress(QLatin1String("glBindAttribLocationARB"));
 
327
        glGetAttribLocation = (_glGetAttribLocation) ctx->getProcAddress(QLatin1String("glGetAttribLocationARB"));
 
328
        glVertexAttrib1fv = (_glVertexAttrib1fv) ctx->getProcAddress(QLatin1String("glVertexAttrib1fvARB"));
 
329
        glVertexAttrib2fv = (_glVertexAttrib2fv) ctx->getProcAddress(QLatin1String("glVertexAttrib2fvARB"));
 
330
        glVertexAttrib3fv = (_glVertexAttrib3fv) ctx->getProcAddress(QLatin1String("glVertexAttrib3fvARB"));
 
331
        glVertexAttrib4fv = (_glVertexAttrib4fv) ctx->getProcAddress(QLatin1String("glVertexAttrib4fvARB"));
 
332
        glVertexAttribPointer = (_glVertexAttribPointer) ctx->getProcAddress(QLatin1String("glVertexAttribPointerARB"));
 
333
        glDisableVertexAttribArray = (_glDisableVertexAttribArray) ctx->getProcAddress(QLatin1String("glDisableVertexAttribArrayARB"));
 
334
        glEnableVertexAttribArray = (_glEnableVertexAttribArray) ctx->getProcAddress(QLatin1String("glEnableVertexAttribArrayARB"));
 
335
    }
 
336
 
 
337
    // Note: glShaderBinary(), glIsShader(), glIsProgram(), and
 
338
    // glUniformMatrixNxMfv() are optional, but all other functions
 
339
    // are required.
 
340
 
 
341
    return glCreateShader &&
 
342
        glShaderSource &&
 
343
        glCompileShader &&
 
344
        glDeleteProgram &&
 
345
        glCreateProgram &&
 
346
        glAttachShader &&
 
347
        glDetachShader &&
 
348
        glLinkProgram &&
 
349
        glUseProgram &&
 
350
        glDeleteProgram &&
 
351
        glGetShaderInfoLog &&
 
352
        glGetShaderiv &&
 
353
        glGetShaderSource &&
 
354
        glGetProgramiv &&
 
355
        glGetProgramInfoLog &&
 
356
        glGetUniformLocation &&
 
357
        glUniform1fv &&
 
358
        glUniform2fv &&
 
359
        glUniform3fv &&
 
360
        glUniform4fv &&
 
361
        glUniform1i &&
 
362
        glUniform1iv &&
 
363
        glUniformMatrix2fv &&
 
364
        glUniformMatrix3fv &&
 
365
        glUniformMatrix4fv &&
 
366
        glBindAttribLocation &&
 
367
        glGetAttribLocation &&
 
368
        glVertexAttrib1fv &&
 
369
        glVertexAttrib2fv &&
 
370
        glVertexAttrib3fv &&
 
371
        glVertexAttrib4fv &&
 
372
        glVertexAttribPointer &&
 
373
        glDisableVertexAttribArray &&
 
374
        glEnableVertexAttribArray;
 
375
#endif
 
376
}
 
377
 
 
378
#if !defined(QT_OPENGL_ES_2)
 
379
bool qt_resolve_version_2_0_functions(QGLContext *ctx)
 
380
{
 
381
    bool gl2supported = true;
 
382
    if (!qt_resolve_glsl_extensions(ctx))
 
383
        gl2supported = false;
 
384
 
 
385
    if (!qt_resolve_version_1_3_functions(ctx))
 
386
        gl2supported = false;
 
387
 
 
388
    if (!qt_resolve_framebufferobject_extensions(ctx))
 
389
        gl2supported = false;
 
390
 
 
391
    if (glStencilOpSeparate)
 
392
        return gl2supported;
 
393
 
 
394
    glBlendColor = (_glBlendColor) ctx->getProcAddress(QLatin1String("glBlendColor"));
 
395
    glStencilOpSeparate = (_glStencilOpSeparate) ctx->getProcAddress(QLatin1String("glStencilOpSeparate"));
 
396
    if (!glBlendColor || !glStencilOpSeparate)
 
397
        gl2supported = false;
 
398
 
 
399
    return gl2supported;
 
400
}
 
401
#endif
 
402
 
184
403
 
185
404
QT_END_NAMESPACE