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 | |
45 | QT_BEGIN_NAMESPACE |
46 | |
47 | static 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 | |
93 | bool 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) |
144 | bool 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) |
158 | bool 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) |
172 | bool 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 | |
193 | bool 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 |
234 | bool 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 | |
244 | bool 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) |
413 | bool 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 | |
435 | QT_END_NAMESPACE |
436 | |