source: trunk/src/opengl/qglextensions.cpp@ 846

Last change on this file since 846 was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 21.7 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtOpenGL module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
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** 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 have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qgl_p.h"
43
44QT_BEGIN_NAMESPACE
45
46static 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
92bool qt_resolve_framebufferobject_extensions(QGLContext *ctx)
93{
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
103
104 if (ctx == 0) {
105 qWarning("QGLFramebufferObject: Unable to resolve framebuffer object extensions -"
106 " make sure there is a current context when creating the framebuffer object.");
107 return false;
108 }
109
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;
137#else
138 return true;
139#endif
140}
141
142#if !defined(QT_OPENGL_ES_2)
143bool qt_resolve_version_1_3_functions(QGLContext *ctx)
144{
145 if (glMultiTexCoord4f != 0)
146 return true;
147
148 QGLContext cx(QGLFormat::defaultFormat());
149 glMultiTexCoord4f = (_glMultiTexCoord4f) ctx->getProcAddress(QLatin1String("glMultiTexCoord4f"));
150
151 glActiveTexture = (_glActiveTexture) ctx->getProcAddress(QLatin1String("glActiveTexture"));
152 return glMultiTexCoord4f && glActiveTexture;
153}
154#endif
155
156#if !defined(QT_OPENGL_ES_2)
157bool qt_resolve_stencil_face_extension(QGLContext *ctx)
158{
159 if (glActiveStencilFaceEXT != 0)
160 return true;
161
162 QGLContext cx(QGLFormat::defaultFormat());
163 glActiveStencilFaceEXT = (_glActiveStencilFaceEXT) ctx->getProcAddress(QLatin1String("glActiveStencilFaceEXT"));
164
165 return glActiveStencilFaceEXT;
166}
167#endif
168
169
170#if !defined(QT_OPENGL_ES_2)
171bool qt_resolve_frag_program_extensions(QGLContext *ctx)
172{
173 if (glProgramStringARB != 0)
174 return true;
175
176 // ARB_fragment_program
177 glProgramStringARB = (_glProgramStringARB) ctx->getProcAddress(QLatin1String("glProgramStringARB"));
178 glBindProgramARB = (_glBindProgramARB) ctx->getProcAddress(QLatin1String("glBindProgramARB"));
179 glDeleteProgramsARB = (_glDeleteProgramsARB) ctx->getProcAddress(QLatin1String("glDeleteProgramsARB"));
180 glGenProgramsARB = (_glGenProgramsARB) ctx->getProcAddress(QLatin1String("glGenProgramsARB"));
181 glProgramLocalParameter4fvARB = (_glProgramLocalParameter4fvARB) ctx->getProcAddress(QLatin1String("glProgramLocalParameter4fvARB"));
182
183 return glProgramStringARB
184 && glBindProgramARB
185 && glDeleteProgramsARB
186 && glGenProgramsARB
187 && glProgramLocalParameter4fvARB;
188}
189#endif
190
191
192bool qt_resolve_buffer_extensions(QGLContext *ctx)
193{
194#if defined(QGL_RESOLVE_BUFFER_FUNCS)
195 if (glBindBuffer && glDeleteBuffers && glGenBuffers && glBufferData
196 && glBufferSubData && glGetBufferParameteriv)
197 return true;
198#endif
199
200#if defined(QGL_RESOLVE_BUFFER_FUNCS)
201 glBindBuffer = (_glBindBuffer) qt_gl_getProcAddressARB(ctx, "glBindBuffer");
202 glDeleteBuffers = (_glDeleteBuffers) qt_gl_getProcAddressARB(ctx, "glDeleteBuffers");
203 glGenBuffers = (_glGenBuffers) qt_gl_getProcAddressARB(ctx, "glGenBuffers");
204 glBufferData = (_glBufferData) qt_gl_getProcAddressARB(ctx, "glBufferData");
205 glBufferSubData = (_glBufferSubData) qt_gl_getProcAddressARB(ctx, "glBufferSubData");
206 glGetBufferSubData = (_glGetBufferSubData) qt_gl_getProcAddressARB(ctx, "glGetBufferSubData");
207 glGetBufferParameteriv = (_glGetBufferParameteriv) qt_gl_getProcAddressARB(ctx, "glGetBufferParameteriv");
208#endif
209 glMapBufferARB = (_glMapBufferARB) qt_gl_getProcAddressARB(ctx, "glMapBuffer");
210 glUnmapBufferARB = (_glUnmapBufferARB) qt_gl_getProcAddressARB(ctx, "glUnmapBuffer");
211
212#if defined(QGL_RESOLVE_BUFFER_FUNCS)
213 return glBindBuffer
214 && glDeleteBuffers
215 && glGenBuffers
216 && glBufferData
217 && glBufferSubData
218 && glGetBufferParameteriv;
219 // glGetBufferSubData() is optional
220#else
221 return true;
222#endif
223}
224
225#ifndef QT_NO_EGL
226bool qt_resolve_eglimage_gl_extensions(QGLContext *ctx)
227{
228 if (glEGLImageTargetTexture2DOES || glEGLImageTargetRenderbufferStorageOES)
229 return true;
230 glEGLImageTargetTexture2DOES = (_glEGLImageTargetTexture2DOES) ctx->getProcAddress(QLatin1String("glEGLImageTargetTexture2DOES"));
231 glEGLImageTargetRenderbufferStorageOES = (_glEGLImageTargetRenderbufferStorageOES) ctx->getProcAddress(QLatin1String("glEGLImageTargetRenderbufferStorageOES"));
232 return glEGLImageTargetTexture2DOES && glEGLImageTargetRenderbufferStorageOES;
233}
234#endif
235
236bool qt_resolve_glsl_extensions(QGLContext *ctx)
237{
238
239#if defined(QT_OPENGL_ES_2)
240 // The GLSL shader functions are always present in OpenGL/ES 2.0.
241 // The only exceptions are glGetProgramBinaryOES and glProgramBinaryOES.
242 if (!QGLContextPrivate::extensionFuncs(ctx).qt_glslResolved) {
243 glGetProgramBinaryOES = (_glGetProgramBinaryOES) ctx->getProcAddress(QLatin1String("glGetProgramBinaryOES"));
244 glProgramBinaryOES = (_glProgramBinaryOES) ctx->getProcAddress(QLatin1String("glProgramBinaryOES"));
245 QGLContextPrivate::extensionFuncs(ctx).qt_glslResolved = true;
246 }
247 return true;
248#else
249 if (glCreateShader)
250 return true;
251
252 // Geometry shaders are optional...
253 glProgramParameteriEXT = (_glProgramParameteriEXT) ctx->getProcAddress(QLatin1String("glProgramParameteriEXT"));
254 glFramebufferTextureEXT = (_glFramebufferTextureEXT) ctx->getProcAddress(QLatin1String("glFramebufferTextureEXT"));
255 glFramebufferTextureLayerEXT = (_glFramebufferTextureLayerEXT) ctx->getProcAddress(QLatin1String("glFramebufferTextureLayerEXT"));
256 glFramebufferTextureFaceEXT = (_glFramebufferTextureFaceEXT) ctx->getProcAddress(QLatin1String("glFramebufferTextureFaceEXT"));
257
258 // Must at least have the FragmentShader extension to continue.
259 if (!(QGLExtensions::glExtensions() & QGLExtensions::FragmentShader))
260 return false;
261
262 glCreateShader = (_glCreateShader) ctx->getProcAddress(QLatin1String("glCreateShader"));
263 if (glCreateShader) {
264 glShaderSource = (_glShaderSource) ctx->getProcAddress(QLatin1String("glShaderSource"));
265 glShaderBinary = (_glShaderBinary) ctx->getProcAddress(QLatin1String("glShaderBinary"));
266 glCompileShader = (_glCompileShader) ctx->getProcAddress(QLatin1String("glCompileShader"));
267 glDeleteShader = (_glDeleteShader) ctx->getProcAddress(QLatin1String("glDeleteShader"));
268 glIsShader = (_glIsShader) ctx->getProcAddress(QLatin1String("glIsShader"));
269
270 glCreateProgram = (_glCreateProgram) ctx->getProcAddress(QLatin1String("glCreateProgram"));
271 glAttachShader = (_glAttachShader) ctx->getProcAddress(QLatin1String("glAttachShader"));
272 glDetachShader = (_glDetachShader) ctx->getProcAddress(QLatin1String("glDetachShader"));
273 glLinkProgram = (_glLinkProgram) ctx->getProcAddress(QLatin1String("glLinkProgram"));
274 glUseProgram = (_glUseProgram) ctx->getProcAddress(QLatin1String("glUseProgram"));
275 glDeleteProgram = (_glDeleteProgram) ctx->getProcAddress(QLatin1String("glDeleteProgram"));
276 glIsProgram = (_glIsProgram) ctx->getProcAddress(QLatin1String("glIsProgram"));
277
278 glGetShaderInfoLog = (_glGetShaderInfoLog) ctx->getProcAddress(QLatin1String("glGetShaderInfoLog"));
279 glGetShaderiv = (_glGetShaderiv) ctx->getProcAddress(QLatin1String("glGetShaderiv"));
280 glGetShaderSource = (_glGetShaderSource) ctx->getProcAddress(QLatin1String("glGetShaderSource"));
281 glGetProgramiv = (_glGetProgramiv) ctx->getProcAddress(QLatin1String("glGetProgramiv"));
282 glGetProgramInfoLog = (_glGetProgramInfoLog) ctx->getProcAddress(QLatin1String("glGetProgramInfoLog"));
283
284 glGetUniformLocation = (_glGetUniformLocation) ctx->getProcAddress(QLatin1String("glGetUniformLocation"));
285 glUniform4fv = (_glUniform4fv) ctx->getProcAddress(QLatin1String("glUniform4fv"));
286 glUniform3fv = (_glUniform3fv) ctx->getProcAddress(QLatin1String("glUniform3fv"));
287 glUniform2fv = (_glUniform2fv) ctx->getProcAddress(QLatin1String("glUniform2fv"));
288 glUniform1fv = (_glUniform1fv) ctx->getProcAddress(QLatin1String("glUniform1fv"));
289 glUniform1i = (_glUniform1i) ctx->getProcAddress(QLatin1String("glUniform1i"));
290 glUniform1iv = (_glUniform1iv) ctx->getProcAddress(QLatin1String("glUniform1iv"));
291 glUniformMatrix2fv = (_glUniformMatrix2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2fv"));
292 glUniformMatrix3fv = (_glUniformMatrix3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3fv"));
293 glUniformMatrix4fv = (_glUniformMatrix4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4fv"));
294 glUniformMatrix2x3fv = (_glUniformMatrix2x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x3fv"));
295 glUniformMatrix2x4fv = (_glUniformMatrix2x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x4fv"));
296 glUniformMatrix3x2fv = (_glUniformMatrix3x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x2fv"));
297 glUniformMatrix3x4fv = (_glUniformMatrix3x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x4fv"));
298 glUniformMatrix4x2fv = (_glUniformMatrix4x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x2fv"));
299 glUniformMatrix4x3fv = (_glUniformMatrix4x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x3fv"));
300
301 glBindAttribLocation = (_glBindAttribLocation) ctx->getProcAddress(QLatin1String("glBindAttribLocation"));
302 glGetAttribLocation = (_glGetAttribLocation) ctx->getProcAddress(QLatin1String("glGetAttribLocation"));
303 glVertexAttrib1fv = (_glVertexAttrib1fv) ctx->getProcAddress(QLatin1String("glVertexAttrib1fv"));
304 glVertexAttrib2fv = (_glVertexAttrib2fv) ctx->getProcAddress(QLatin1String("glVertexAttrib2fv"));
305 glVertexAttrib3fv = (_glVertexAttrib3fv) ctx->getProcAddress(QLatin1String("glVertexAttrib3fv"));
306 glVertexAttrib4fv = (_glVertexAttrib4fv) ctx->getProcAddress(QLatin1String("glVertexAttrib4fv"));
307 glVertexAttribPointer = (_glVertexAttribPointer) ctx->getProcAddress(QLatin1String("glVertexAttribPointer"));
308 glDisableVertexAttribArray = (_glDisableVertexAttribArray) ctx->getProcAddress(QLatin1String("glDisableVertexAttribArray"));
309 glEnableVertexAttribArray = (_glEnableVertexAttribArray) ctx->getProcAddress(QLatin1String("glEnableVertexAttribArray"));
310
311 } else {
312 // We may not have the standard shader functions, but we might
313 // have the older ARB functions instead.
314 glCreateShader = (_glCreateShader) ctx->getProcAddress(QLatin1String("glCreateShaderObjectARB"));
315 glShaderSource = (_glShaderSource) ctx->getProcAddress(QLatin1String("glShaderSourceARB"));
316 glShaderBinary = (_glShaderBinary) ctx->getProcAddress(QLatin1String("glShaderBinaryARB"));
317 glCompileShader = (_glCompileShader) ctx->getProcAddress(QLatin1String("glCompileShaderARB"));
318 glDeleteShader = (_glDeleteShader) ctx->getProcAddress(QLatin1String("glDeleteObjectARB"));
319 glIsShader = 0;
320
321 glCreateProgram = (_glCreateProgram) ctx->getProcAddress(QLatin1String("glCreateProgramObjectARB"));
322 glAttachShader = (_glAttachShader) ctx->getProcAddress(QLatin1String("glAttachObjectARB"));
323 glDetachShader = (_glDetachShader) ctx->getProcAddress(QLatin1String("glDetachObjectARB"));
324 glLinkProgram = (_glLinkProgram) ctx->getProcAddress(QLatin1String("glLinkProgramARB"));
325 glUseProgram = (_glUseProgram) ctx->getProcAddress(QLatin1String("glUseProgramObjectARB"));
326 glDeleteProgram = (_glDeleteProgram) ctx->getProcAddress(QLatin1String("glDeleteObjectARB"));
327 glIsProgram = 0;
328
329 glGetShaderInfoLog = (_glGetShaderInfoLog) ctx->getProcAddress(QLatin1String("glGetInfoLogARB"));
330 glGetShaderiv = (_glGetShaderiv) ctx->getProcAddress(QLatin1String("glGetObjectParameterivARB"));
331 glGetShaderSource = (_glGetShaderSource) ctx->getProcAddress(QLatin1String("glGetShaderSourceARB"));
332 glGetProgramiv = (_glGetProgramiv) ctx->getProcAddress(QLatin1String("glGetObjectParameterivARB"));
333 glGetProgramInfoLog = (_glGetProgramInfoLog) ctx->getProcAddress(QLatin1String("glGetInfoLogARB"));
334
335 glGetUniformLocation = (_glGetUniformLocation) ctx->getProcAddress(QLatin1String("glGetUniformLocationARB"));
336 glUniform4fv = (_glUniform4fv) ctx->getProcAddress(QLatin1String("glUniform4fvARB"));
337 glUniform3fv = (_glUniform3fv) ctx->getProcAddress(QLatin1String("glUniform3fvARB"));
338 glUniform2fv = (_glUniform2fv) ctx->getProcAddress(QLatin1String("glUniform2fvARB"));
339 glUniform1fv = (_glUniform1fv) ctx->getProcAddress(QLatin1String("glUniform1fvARB"));
340 glUniform1i = (_glUniform1i) ctx->getProcAddress(QLatin1String("glUniform1iARB"));
341 glUniform1iv = (_glUniform1iv) ctx->getProcAddress(QLatin1String("glUniform1ivARB"));
342 glUniformMatrix2fv = (_glUniformMatrix2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2fvARB"));
343 glUniformMatrix3fv = (_glUniformMatrix3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3fvARB"));
344 glUniformMatrix4fv = (_glUniformMatrix4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4fvARB"));
345 glUniformMatrix2x3fv = (_glUniformMatrix2x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x3fvARB"));
346 glUniformMatrix2x4fv = (_glUniformMatrix2x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix2x4fvARB"));
347 glUniformMatrix3x2fv = (_glUniformMatrix3x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x2fvARB"));
348 glUniformMatrix3x4fv = (_glUniformMatrix3x4fv) ctx->getProcAddress(QLatin1String("glUniformMatrix3x4fvARB"));
349 glUniformMatrix4x2fv = (_glUniformMatrix4x2fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x2fvARB"));
350 glUniformMatrix4x3fv = (_glUniformMatrix4x3fv) ctx->getProcAddress(QLatin1String("glUniformMatrix4x3fvARB"));
351
352 glBindAttribLocation = (_glBindAttribLocation) ctx->getProcAddress(QLatin1String("glBindAttribLocationARB"));
353 glGetAttribLocation = (_glGetAttribLocation) ctx->getProcAddress(QLatin1String("glGetAttribLocationARB"));
354 glVertexAttrib1fv = (_glVertexAttrib1fv) ctx->getProcAddress(QLatin1String("glVertexAttrib1fvARB"));
355 glVertexAttrib2fv = (_glVertexAttrib2fv) ctx->getProcAddress(QLatin1String("glVertexAttrib2fvARB"));
356 glVertexAttrib3fv = (_glVertexAttrib3fv) ctx->getProcAddress(QLatin1String("glVertexAttrib3fvARB"));
357 glVertexAttrib4fv = (_glVertexAttrib4fv) ctx->getProcAddress(QLatin1String("glVertexAttrib4fvARB"));
358 glVertexAttribPointer = (_glVertexAttribPointer) ctx->getProcAddress(QLatin1String("glVertexAttribPointerARB"));
359 glDisableVertexAttribArray = (_glDisableVertexAttribArray) ctx->getProcAddress(QLatin1String("glDisableVertexAttribArrayARB"));
360 glEnableVertexAttribArray = (_glEnableVertexAttribArray) ctx->getProcAddress(QLatin1String("glEnableVertexAttribArrayARB"));
361 }
362
363 // Note: glShaderBinary(), glIsShader(), glIsProgram(), and
364 // glUniformMatrixNxMfv() are optional, but all other functions
365 // are required.
366
367 return glCreateShader &&
368 glShaderSource &&
369 glCompileShader &&
370 glDeleteProgram &&
371 glCreateProgram &&
372 glAttachShader &&
373 glDetachShader &&
374 glLinkProgram &&
375 glUseProgram &&
376 glDeleteProgram &&
377 glGetShaderInfoLog &&
378 glGetShaderiv &&
379 glGetShaderSource &&
380 glGetProgramiv &&
381 glGetProgramInfoLog &&
382 glGetUniformLocation &&
383 glUniform1fv &&
384 glUniform2fv &&
385 glUniform3fv &&
386 glUniform4fv &&
387 glUniform1i &&
388 glUniform1iv &&
389 glUniformMatrix2fv &&
390 glUniformMatrix3fv &&
391 glUniformMatrix4fv &&
392 glBindAttribLocation &&
393 glGetAttribLocation &&
394 glVertexAttrib1fv &&
395 glVertexAttrib2fv &&
396 glVertexAttrib3fv &&
397 glVertexAttrib4fv &&
398 glVertexAttribPointer &&
399 glDisableVertexAttribArray &&
400 glEnableVertexAttribArray;
401#endif
402}
403
404#if !defined(QT_OPENGL_ES_2)
405bool qt_resolve_version_2_0_functions(QGLContext *ctx)
406{
407 bool gl2supported = true;
408 if (!qt_resolve_glsl_extensions(ctx))
409 gl2supported = false;
410
411 if (!qt_resolve_version_1_3_functions(ctx))
412 gl2supported = false;
413
414 if (!qt_resolve_framebufferobject_extensions(ctx))
415 gl2supported = false;
416
417 if (glStencilOpSeparate)
418 return gl2supported;
419
420 glBlendColor = (_glBlendColor) ctx->getProcAddress(QLatin1String("glBlendColor"));
421 glStencilOpSeparate = (_glStencilOpSeparate) ctx->getProcAddress(QLatin1String("glStencilOpSeparate"));
422 if (!glBlendColor || !glStencilOpSeparate)
423 gl2supported = false;
424
425 return gl2supported;
426}
427#endif
428
429
430QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.