1/****************************************************************************
2**
3** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the QtOpenGL 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 "qgl_p.h"
43#include <qglframebufferobject.h>
44
45QT_BEGIN_NAMESPACE
46
47static void *qt_gl_getProcAddress_search
48 (QGLContext *ctx, const char *name1, const char *name2,
49 const char *name3, const char *name4)
50{
51 void *addr;
52
53 addr = ctx->getProcAddress(QLatin1String(name1));
54 if (addr)
55 return addr;
56
57 addr = ctx->getProcAddress(QLatin1String(name2));
58 if (addr)
59 return addr;
60
61 addr = ctx->getProcAddress(QLatin1String(name3));
62 if (addr)
63 return addr;
64
65 if (name4)
66 return ctx->getProcAddress(QLatin1String(name4));
67
68 return 0;
69}
70
71// Search for an extension function starting with the most likely
72// function suffix first, and then trying the other variations.
73#if defined(QT_OPENGL_ES)
74#define qt_gl_getProcAddress(ctx,name) \
75 qt_gl_getProcAddress_search((ctx), name, name "OES", name "EXT", name "ARB")
76#define qt_gl_getProcAddressEXT(ctx,name) \
77 qt_gl_getProcAddress_search((ctx), name "OES", name, name "EXT", name "ARB")
78#define qt_gl_getProcAddressARB(ctx,name) \
79 qt_gl_getProcAddress_search((ctx), name "OES", name, name "ARB", name "EXT")
80#define qt_gl_getProcAddressOES(ctx,name) \
81 qt_gl_getProcAddress_search((ctx), name "OES", name, name "EXT", name "ARB")
82#else
83#define qt_gl_getProcAddress(ctx,name) \
84 qt_gl_getProcAddress_search((ctx), name, name "ARB", name "EXT", 0)
85#define qt_gl_getProcAddressEXT(ctx,name) \
86 qt_gl_getProcAddress_search((ctx), name "EXT", name, name "ARB", 0)
87#define qt_gl_getProcAddressARB(ctx,name) \
88 qt_gl_getProcAddress_search((ctx), name "ARB", name, name "EXT", 0)
89#define qt_gl_getProcAddressOES(ctx,name) \
90 qt_gl_getProcAddress_search((ctx), name "OES", name, name "EXT", name "ARB")
91#endif
92
93bool qt_resolve_framebufferobject_extensions(QGLContext *ctx)
94{
95#if defined(QT_OPENGL_ES_2)
96 static bool have_resolved = false;
97 if (have_resolved)
98 return true;
99 have_resolved = true;
100#else
101 if (glIsRenderbuffer != 0)
102 return true;
103#endif
104
105 if (ctx == 0) {
106 qWarning("QGLFramebufferObject: Unable to resolve framebuffer object extensions -"
107 " make sure there is a current context when creating the framebuffer object.");
108 return false;
109 }
110
111
112 glBlitFramebufferEXT = (_glBlitFramebufferEXT) qt_gl_getProcAddressEXT(ctx, "glBlitFramebuffer");
113 glRenderbufferStorageMultisampleEXT =
114 (_glRenderbufferStorageMultisampleEXT) qt_gl_getProcAddressEXT(ctx, "glRenderbufferStorageMultisample");
115
116#if !defined(QT_OPENGL_ES_2)
117 glIsRenderbuffer = (_glIsRenderbuffer) qt_gl_getProcAddressEXT(ctx, "glIsRenderbuffer");
118 if (!glIsRenderbuffer)
119 return false; // Not much point searching for anything else.
120 glBindRenderbuffer = (_glBindRenderbuffer) qt_gl_getProcAddressEXT(ctx, "glBindRenderbuffer");
121 glDeleteRenderbuffers = (_glDeleteRenderbuffers) qt_gl_getProcAddressEXT(ctx, "glDeleteRenderbuffers");
122 glGenRenderbuffers = (_glGenRenderbuffers) qt_gl_getProcAddressEXT(ctx, "glGenRenderbuffers");
123 glRenderbufferStorage = (_glRenderbufferStorage) qt_gl_getProcAddressEXT(ctx, "glRenderbufferStorage");
124 glGetRenderbufferParameteriv =
125 (_glGetRenderbufferParameteriv) qt_gl_getProcAddressEXT(ctx, "glGetRenderbufferParameteriv");
126 glIsFramebuffer = (_glIsFramebuffer) qt_gl_getProcAddressEXT(ctx, "glIsFramebuffer");
127 glBindFramebuffer = (_glBindFramebuffer) qt_gl_getProcAddressEXT(ctx, "glBindFramebuffer");
128 glDeleteFramebuffers = (_glDeleteFramebuffers) qt_gl_getProcAddressEXT(ctx, "glDeleteFramebuffers");
129 glGenFramebuffers = (_glGenFramebuffers) qt_gl_getProcAddressEXT(ctx, "glGenFramebuffers");
130 glCheckFramebufferStatus = (_glCheckFramebufferStatus) qt_gl_getProcAddressEXT(ctx, "glCheckFramebufferStatus");
131 glFramebufferTexture2D = (_glFramebufferTexture2D) qt_gl_getProcAddressEXT(ctx, "glFramebufferTexture2D");
132 glFramebufferRenderbuffer = (_glFramebufferRenderbuffer) qt_gl_getProcAddressEXT(ctx, "glFramebufferRenderbuffer");
133 glGetFramebufferAttachmentParameteriv =
134 (_glGetFramebufferAttachmentParameteriv) qt_gl_getProcAddressEXT(ctx, "glGetFramebufferAttachmentParameteriv");
135 glGenerateMipmap = (_glGenerateMipmap) qt_gl_getProcAddressEXT(ctx, "glGenerateMipmap");
136
137 return glIsRenderbuffer != 0;
138#else
139 return true;
140#endif
141}
142
143#if !defined(QT_OPENGL_ES_2)
144bool qt_resolve_version_1_3_functions(QGLContext *ctx)
145{
146 if (glMultiTexCoord4f != 0)
147 return true;
148
149 QGLContext cx(QGLFormat::defaultFormat());
150 glMultiTexCoord4f = (_glMultiTexCoord4f) ctx->getProcAddress(QLatin1String("glMultiTexCoord4f"));
151
152 glActiveTexture = (_glActiveTexture) ctx->getProcAddress(QLatin1String("glActiveTexture"));
153 return glMultiTexCoord4f && glActiveTexture;
154}
155#endif
156
157#if !defined(QT_OPENGL_ES_2)
158bool qt_resolve_stencil_face_extension(QGLContext *ctx)
159{
160 if (glActiveStencilFaceEXT != 0)
161 return true;
162
163 QGLContext cx(QGLFormat::defaultFormat());
164 glActiveStencilFaceEXT = (_glActiveStencilFaceEXT) ctx->getProcAddress(QLatin1String("glActiveStencilFaceEXT"));
165
166 return glActiveStencilFaceEXT;
167}
168#endif
169
170
171#if !defined(QT_OPENGL_ES_2)
172bool qt_resolve_frag_program_extensions(QGLContext *ctx)
173{
174 if (glProgramStringARB != 0)
175 return true;
176
177 // ARB_fragment_program
178 glProgramStringARB = (_glProgramStringARB) ctx->getProcAddress(QLatin1String("glProgramStringARB"));
179 glBindProgramARB = (_glBindProgramARB) ctx->getProcAddress(QLatin1String("glBindProgramARB"));
180 glDeleteProgramsARB = (_glDeleteProgramsARB) ctx->getProcAddress(QLatin1String("glDeleteProgramsARB"));
181 glGenProgramsARB = (_glGenProgramsARB) ctx->getProcAddress(QLatin1String("glGenProgramsARB"));
182 glProgramLocalParameter4fvARB = (_glProgramLocalParameter4fvARB) ctx->getProcAddress(QLatin1String("glProgramLocalParameter4fvARB"));
183
184 return glProgramStringARB
185 && glBindProgramARB
186 && glDeleteProgramsARB
187 && glGenProgramsARB
188 && glProgramLocalParameter4fvARB;
189}
190#endif
191
192
193bool qt_resolve_buffer_extensions(QGLContext *ctx)
194{
195 if (!QGLContextPrivate::extensionFuncs(ctx).qt_bufferFuncsResolved) {
196#if defined(QGL_RESOLVE_BUFFER_FUNCS)
197 glBindBuffer = (_glBindBuffer) qt_gl_getProcAddressARB(ctx, "glBindBuffer");
198 glDeleteBuffers = (_glDeleteBuffers) qt_gl_getProcAddressARB(ctx, "glDeleteBuffers");
199 glGenBuffers = (_glGenBuffers) qt_gl_getProcAddressARB(ctx, "glGenBuffers");
200 glBufferData = (_glBufferData) qt_gl_getProcAddressARB(ctx, "glBufferData");
201 glBufferSubData = (_glBufferSubData) qt_gl_getProcAddressARB(ctx, "glBufferSubData");
202 glGetBufferSubData = (_glGetBufferSubData) qt_gl_getProcAddressARB(ctx, "glGetBufferSubData");
203 glGetBufferParameteriv = (_glGetBufferParameteriv) qt_gl_getProcAddressARB(ctx, "glGetBufferParameteriv");
204#endif
205
206#ifdef QT_OPENGL_ES_2
207 QGLExtensionMatcher extensions;
208 if (extensions.match("GL_OES_mapbuffer")) {
209 glMapBufferARB = (_glMapBufferARB) qt_gl_getProcAddressARB(ctx, "glMapBufferOES");
210 glUnmapBufferARB = (_glUnmapBufferARB) qt_gl_getProcAddressARB(ctx, "glUnmapBufferOES");
211 }
212#else
213 glMapBufferARB = (_glMapBufferARB) qt_gl_getProcAddressARB(ctx, "glMapBuffer");
214 glUnmapBufferARB = (_glUnmapBufferARB) qt_gl_getProcAddressARB(ctx, "glUnmapBuffer");
215#endif
216
217 QGLContextPrivate::extensionFuncs(ctx).qt_bufferFuncsResolved = true;
218 }
219
220#if defined(QGL_RESOLVE_BUFFER_FUNCS)
221 return glBindBuffer
222 && glDeleteBuffers
223 && glGenBuffers
224 && glBufferData
225 && glBufferSubData
226 && glGetBufferParameteriv;
227 // glGetBufferSubData() is optional
228#else
229 return true;
230#endif
231}
232
233#ifndef QT_NO_EGL
234bool qt_resolve_eglimage_gl_extensions(QGLContext *ctx)
235{
236 if (glEGLImageTargetTexture2DOES || glEGLImageTargetRenderbufferStorageOES)
237 return true;
238 glEGLImageTargetTexture2DOES = (_glEGLImageTargetTexture2DOES) ctx->getProcAddress(QLatin1String("glEGLImageTargetTexture2DOES"));
239 glEGLImageTargetRenderbufferStorageOES = (_glEGLImageTargetRenderbufferStorageOES) ctx->getProcAddress(QLatin1String("glEGLImageTargetRenderbufferStorageOES"));
240 return glEGLImageTargetTexture2DOES && glEGLImageTargetRenderbufferStorageOES;
241}
242#endif
243
244bool qt_resolve_glsl_extensions(QGLContext *ctx)
245{
246
247#if defined(QT_OPENGL_ES_2)
248 // The GLSL shader functions are always present in OpenGL/ES 2.0.
249 // The only exceptions are glGetProgramBinaryOES and glProgramBinaryOES.
250 if (!QGLContextPrivate::extensionFuncs(ctx).qt_glslResolved) {
251 glGetProgramBinaryOES = (_glGetProgramBinaryOES) ctx->getProcAddress(QLatin1String("glGetProgramBinaryOES"));
252 glProgramBinaryOES = (_glProgramBinaryOES) ctx->getProcAddress(QLatin1String("glProgramBinaryOES"));
253 QGLContextPrivate::extensionFuncs(ctx).qt_glslResolved = true;
254 }
255 return true;
256#else
257 if (glCreateShader)
258 return true;
259
260 // Geometry shaders are optional...
261 glProgramParameteriEXT = (_glProgramParameteriEXT) ctx->getProcAddress(QLatin1String("glProgramParameteriEXT"));
262 glFramebufferTextureEXT = (_glFramebufferTextureEXT) ctx->getProcAddress(QLatin1String("glFramebufferTextureEXT"));
263 glFramebufferTextureLayerEXT = (_glFramebufferTextureLayerEXT) ctx->getProcAddress(QLatin1String("glFramebufferTextureLayerEXT"));
264 glFramebufferTextureFaceEXT = (_glFramebufferTextureFaceEXT) ctx->getProcAddress(QLatin1String("glFramebufferTextureFaceEXT"));
265
266 // Must at least have the FragmentShader extension to continue.
267 if (!(QGLExtensions::glExtensions() & QGLExtensions::FragmentShader))
268 return false;
269
270 glCreateShader = (_glCreateShader) ctx->getProcAddress(QLatin1String("glCreateShader"));
271 if (glCreateShader) {
272 glShaderSource = (_glShaderSource) ctx->getProcAddress(QLatin1String("glShaderSource"));
273 glShaderBinary = (_glShaderBinary) ctx->getProcAddress(QLatin1String("glShaderBinary"));
274 glCompileShader = (_glCompileShader) ctx->getProcAddress(QLatin1String("glCompileShader"));
275 glDeleteShader = (_glDeleteShader) ctx->getProcAddress(QLatin1String("glDeleteShader"));
276 glIsShader = (_glIsShader) ctx->getProcAddress(QLatin1String("glIsShader"));
277
278 glCreateProgram = (_glCreateProgram) ctx->getProcAddress(QLatin1String("glCreateProgram"));
279 glAttachShader = (_glAttachShader) ctx->getProcAddress(QLatin1String("glAttachShader"));
280 glDetachShader = (_glDetachShader) ctx->getProcAddress(QLatin1String("glDetachShader"));
281 glLinkProgram = (_glLinkProgram) ctx->getProcAddress(QLatin1String("glLinkProgram"));
282 glUseProgram = (_glUseProgram) ctx->getProcAddress(QLatin1String("glUseProgram"));
283 glDeleteProgram = (_glDeleteProgram) ctx->getProcAddress(QLatin1String("glDeleteProgram"));
284 glIsProgram = (_glIsProgram) ctx->getProcAddress(QLatin1String("glIsProgram"));
285
286 glGetShaderInfoLog = (_glGetShaderInfoLog) ctx->getProcAddress(QLatin1String("glGetShaderInfoLog"));
287 glGetShaderiv = (_glGetShaderiv) ctx->getProcAddress(QLatin1String("glGetShaderiv"));
288 glGetShaderSource = (_glGetShaderSource) ctx->getProcAddress(QLatin1String("glGetShaderSource"));
289 glGetProgramiv = (_glGetProgramiv) ctx->getProcAddress(QLatin1String("glGetProgramiv"));
290 glGetProgramInfoLog = (_glGetProgramInfoLog) ctx->getProcAddress(QLatin1String("glGetProgramInfoLog"));
291
292 glGetUniformLocation = (_glGetUniformLocation) ctx->getProcAddress(QLatin1String("glGetUniformLocation"));
293 glUniform4fv = (_glUniform4fv) ctx->getProcAddress(QLatin1String("glUniform4fv"));
294 glUniform3fv = (_glUniform3fv) ctx->getProcAddress(QLatin1String("glUniform3fv"));
295 glUniform2fv = (_glUniform2fv) ctx->getProcAddress(QLatin1String("glUniform2fv"));
296 glUniform1fv = (_glUniform1fv) ctx->getProcAddress(QLatin1String("glUniform1fv"));
297 glUniform1i = (_glUniform1i) ctx->getProcAddress(QLatin1String("glUniform1i"));
298 glUniform1iv = (_glUniform1iv) ctx->getProcAddress(QLatin1String("glUniform1iv"));
299 glUniformMatrix2fv = (_glUniformMatrix2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2fv"));
300 glUniformMatrix3fv = (_glUniformMatrix3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3fv"));
301 glUniformMatrix4fv = (_glUniformMatrix4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4fv"));
302 glUniformMatrix2x3fv = (_glUniformMatrix2x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x3fv"));
303 glUniformMatrix2x4fv = (_glUniformMatrix2x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x4fv"));
304 glUniformMatrix3x2fv = (_glUniformMatrix3x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x2fv"));
305 glUniformMatrix3x4fv = (_glUniformMatrix3x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x4fv"));
306 glUniformMatrix4x2fv = (_glUniformMatrix4x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x2fv"));
307 glUniformMatrix4x3fv = (_glUniformMatrix4x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x3fv"));
308
309 glBindAttribLocation = (_glBindAttribLocation) ctx->getProcAddress(QLatin1String("glBindAttribLocation"));
310 glGetAttribLocation = (_glGetAttribLocation) ctx->getProcAddress(QLatin1String("glGetAttribLocation"));
311 glVertexAttrib1fv = (_glVertexAttrib1fv) ctx->getProcAddress(QLatin1String("glVertexAttrib1fv"));
312 glVertexAttrib2fv = (_glVertexAttrib2fv) ctx->getProcAddress(QLatin1String("glVertexAttrib2fv"));
313 glVertexAttrib3fv = (_glVertexAttrib3fv) ctx->getProcAddress(QLatin1String("glVertexAttrib3fv"));
314 glVertexAttrib4fv = (_glVertexAttrib4fv) ctx->getProcAddress(QLatin1String("glVertexAttrib4fv"));
315 glVertexAttribPointer = (_glVertexAttribPointer) ctx->getProcAddress(QLatin1String("glVertexAttribPointer"));
316 glDisableVertexAttribArray = (_glDisableVertexAttribArray) ctx->getProcAddress(QLatin1String("glDisableVertexAttribArray"));
317 glEnableVertexAttribArray = (_glEnableVertexAttribArray) ctx->getProcAddress(QLatin1String("glEnableVertexAttribArray"));
318
319 } else {
320 // We may not have the standard shader functions, but we might
321 // have the older ARB functions instead.
322 glCreateShader = (_glCreateShader) ctx->getProcAddress(QLatin1String("glCreateShaderObjectARB"));
323 glShaderSource = (_glShaderSource) ctx->getProcAddress(QLatin1String("glShaderSourceARB"));
324 glShaderBinary = (_glShaderBinary) ctx->getProcAddress(QLatin1String("glShaderBinaryARB"));
325 glCompileShader = (_glCompileShader) ctx->getProcAddress(QLatin1String("glCompileShaderARB"));
326 glDeleteShader = (_glDeleteShader) ctx->getProcAddress(QLatin1String("glDeleteObjectARB"));
327 glIsShader = 0;
328
329 glCreateProgram = (_glCreateProgram) ctx->getProcAddress(QLatin1String("glCreateProgramObjectARB"));
330 glAttachShader = (_glAttachShader) ctx->getProcAddress(QLatin1String("glAttachObjectARB"));
331 glDetachShader = (_glDetachShader) ctx->getProcAddress(QLatin1String("glDetachObjectARB"));
332 glLinkProgram = (_glLinkProgram) ctx->getProcAddress(QLatin1String("glLinkProgramARB"));
333 glUseProgram = (_glUseProgram) ctx->getProcAddress(QLatin1String("glUseProgramObjectARB"));
334 glDeleteProgram = (_glDeleteProgram) ctx->getProcAddress(QLatin1String("glDeleteObjectARB"));
335 glIsProgram = 0;
336
337 glGetShaderInfoLog = (_glGetShaderInfoLog) ctx->getProcAddress(QLatin1String("glGetInfoLogARB"));
338 glGetShaderiv = (_glGetShaderiv) ctx->getProcAddress(QLatin1String("glGetObjectParameterivARB"));
339 glGetShaderSource = (_glGetShaderSource) ctx->getProcAddress(QLatin1String("glGetShaderSourceARB"));
340 glGetProgramiv = (_glGetProgramiv) ctx->getProcAddress(QLatin1String("glGetObjectParameterivARB"));
341 glGetProgramInfoLog = (_glGetProgramInfoLog) ctx->getProcAddress(QLatin1String("glGetInfoLogARB"));
342
343 glGetUniformLocation = (_glGetUniformLocation) ctx->getProcAddress(QLatin1String("glGetUniformLocationARB"));
344 glUniform4fv = (_glUniform4fv) ctx->getProcAddress(QLatin1String("glUniform4fvARB"));
345 glUniform3fv = (_glUniform3fv) ctx->getProcAddress(QLatin1String("glUniform3fvARB"));
346 glUniform2fv = (_glUniform2fv) ctx->getProcAddress(QLatin1String("glUniform2fvARB"));
347 glUniform1fv = (_glUniform1fv) ctx->getProcAddress(QLatin1String("glUniform1fvARB"));
348 glUniform1i = (_glUniform1i) ctx->getProcAddress(QLatin1String("glUniform1iARB"));
349 glUniform1iv = (_glUniform1iv) ctx->getProcAddress(QLatin1String("glUniform1ivARB"));
350 glUniformMatrix2fv = (_glUniformMatrix2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2fvARB"));
351 glUniformMatrix3fv = (_glUniformMatrix3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3fvARB"));
352 glUniformMatrix4fv = (_glUniformMatrix4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4fvARB"));
353 glUniformMatrix2x3fv = (_glUniformMatrix2x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x3fvARB"));
354 glUniformMatrix2x4fv = (_glUniformMatrix2x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x4fvARB"));
355 glUniformMatrix3x2fv = (_glUniformMatrix3x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x2fvARB"));
356 glUniformMatrix3x4fv = (_glUniformMatrix3x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x4fvARB"));
357 glUniformMatrix4x2fv = (_glUniformMatrix4x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x2fvARB"));
358 glUniformMatrix4x3fv = (_glUniformMatrix4x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x3fvARB"));
359
360 glBindAttribLocation = (_glBindAttribLocation) ctx->getProcAddress(QLatin1String("glBindAttribLocationARB"));
361 glGetAttribLocation = (_glGetAttribLocation) ctx->getProcAddress(QLatin1String("glGetAttribLocationARB"));
362 glVertexAttrib1fv = (_glVertexAttrib1fv) ctx->getProcAddress(QLatin1String("glVertexAttrib1fvARB"));
363 glVertexAttrib2fv = (_glVertexAttrib2fv) ctx->getProcAddress(QLatin1String("glVertexAttrib2fvARB"));
364 glVertexAttrib3fv = (_glVertexAttrib3fv) ctx->getProcAddress(QLatin1String("glVertexAttrib3fvARB"));
365 glVertexAttrib4fv = (_glVertexAttrib4fv) ctx->getProcAddress(QLatin1String("glVertexAttrib4fvARB"));
366 glVertexAttribPointer = (_glVertexAttribPointer) ctx->getProcAddress(QLatin1String("glVertexAttribPointerARB"));
367 glDisableVertexAttribArray = (_glDisableVertexAttribArray) ctx->getProcAddress(QLatin1String("glDisableVertexAttribArrayARB"));
368 glEnableVertexAttribArray = (_glEnableVertexAttribArray) ctx->getProcAddress(QLatin1String("glEnableVertexAttribArrayARB"));
369 }
370
371 // Note: glShaderBinary(), glIsShader(), glIsProgram(), and
372 // glUniformMatrixNxMfv() are optional, but all other functions
373 // are required.
374
375 return glCreateShader &&
376 glShaderSource &&
377 glCompileShader &&
378 glDeleteProgram &&
379 glCreateProgram &&
380 glAttachShader &&
381 glDetachShader &&
382 glLinkProgram &&
383 glUseProgram &&
384 glDeleteProgram &&
385 glGetShaderInfoLog &&
386 glGetShaderiv &&
387 glGetShaderSource &&
388 glGetProgramiv &&
389 glGetProgramInfoLog &&
390 glGetUniformLocation &&
391 glUniform1fv &&
392 glUniform2fv &&
393 glUniform3fv &&
394 glUniform4fv &&
395 glUniform1i &&
396 glUniform1iv &&
397 glUniformMatrix2fv &&
398 glUniformMatrix3fv &&
399 glUniformMatrix4fv &&
400 glBindAttribLocation &&
401 glGetAttribLocation &&
402 glVertexAttrib1fv &&
403 glVertexAttrib2fv &&
404 glVertexAttrib3fv &&
405 glVertexAttrib4fv &&
406 glVertexAttribPointer &&
407 glDisableVertexAttribArray &&
408 glEnableVertexAttribArray;
409#endif
410}
411
412#if !defined(QT_OPENGL_ES_2)
413bool qt_resolve_version_2_0_functions(QGLContext *ctx)
414{
415 bool gl2supported = true;
416 if (!qt_resolve_glsl_extensions(ctx))
417 gl2supported = false;
418
419 if (!qt_resolve_version_1_3_functions(ctx))
420 gl2supported = false;
421
422 if (glStencilOpSeparate)
423 return gl2supported;
424
425 glBlendColor = (_glBlendColor) ctx->getProcAddress(QLatin1String("glBlendColor"));
426 glStencilOpSeparate = (_glStencilOpSeparate) ctx->getProcAddress(QLatin1String("glStencilOpSeparate"));
427 if (!glBlendColor || !glStencilOpSeparate)
428 gl2supported = false;
429
430 return gl2supported;
431}
432#endif
433
434
435QT_END_NAMESPACE
436