QtBase  v6.3.1
qeglplatformcontext.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2021 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #include "qeglplatformcontext_p.h"
41 #include "qeglconvenience_p.h"
42 #include "qeglpbuffer_p.h"
43 #include <qpa/qplatformwindow.h>
44 #include <QtGui/qopenglcontext.h>
45 #include <QtCore/qdebug.h>
46 
47 #ifdef Q_OS_ANDROID
48 #include <QtCore/private/qjnihelpers_p.h>
49 #endif
50 #ifndef Q_OS_WIN
51 #include <dlfcn.h>
52 #endif
53 
55 
73 // Constants from EGL_KHR_create_context
74 #ifndef EGL_CONTEXT_MINOR_VERSION_KHR
75 #define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB
76 #endif
77 #ifndef EGL_CONTEXT_FLAGS_KHR
78 #define EGL_CONTEXT_FLAGS_KHR 0x30FC
79 #endif
80 #ifndef EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR
81 #define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD
82 #endif
83 #ifndef EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR
84 #define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001
85 #endif
86 #ifndef EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR
87 #define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
88 #endif
89 #ifndef EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR
90 #define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
91 #endif
92 #ifndef EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR
93 #define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002
94 #endif
95 
96 // Constants for OpenGL which are not available in the ES headers.
97 #ifndef GL_CONTEXT_FLAGS
98 #define GL_CONTEXT_FLAGS 0x821E
99 #endif
100 #ifndef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
101 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
102 #endif
103 #ifndef GL_CONTEXT_FLAG_DEBUG_BIT
104 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
105 #endif
106 #ifndef GL_CONTEXT_PROFILE_MASK
107 #define GL_CONTEXT_PROFILE_MASK 0x9126
108 #endif
109 #ifndef GL_CONTEXT_CORE_PROFILE_BIT
110 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
111 #endif
112 #ifndef GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
113 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
114 #endif
115 
117  EGLConfig *config, Flags flags)
118  : m_eglDisplay(display)
119  , m_flags(flags)
120  , m_ownsContext(true)
121 {
122  m_eglConfig = config ? *config : q_configFromGLFormat(display, format);
123 
124  m_format = q_glFormatFromConfig(m_eglDisplay, m_eglConfig, format);
125  // m_format now has the renderableType() resolved (it cannot be Default anymore)
126  // but does not yet contain version, profile, options.
127  m_shareContext = share ? static_cast<QEGLPlatformContext *>(share)->m_eglContext : nullptr;
128 
129  QList<EGLint> contextAttrs;
130  contextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
131  contextAttrs.append(format.majorVersion());
132  const bool hasKHRCreateContext = q_hasEglExtension(m_eglDisplay, "EGL_KHR_create_context");
133  if (hasKHRCreateContext) {
134  contextAttrs.append(EGL_CONTEXT_MINOR_VERSION_KHR);
135  contextAttrs.append(format.minorVersion());
136  int flags = 0;
137  // The debug bit is supported both for OpenGL and OpenGL ES.
138  if (format.testOption(QSurfaceFormat::DebugContext))
140  // The fwdcompat bit is only for OpenGL 3.0+.
141  if (m_format.renderableType() == QSurfaceFormat::OpenGL
142  && format.majorVersion() >= 3
145  if (flags) {
146  contextAttrs.append(EGL_CONTEXT_FLAGS_KHR);
147  contextAttrs.append(flags);
148  }
149  // Profiles are OpenGL only and mandatory in 3.2+. The value is silently ignored for < 3.2.
150  if (m_format.renderableType() == QSurfaceFormat::OpenGL) {
151  contextAttrs.append(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR);
152  contextAttrs.append(format.profile() == QSurfaceFormat::CoreProfile
155  }
156  }
157 
158 #ifdef EGL_EXT_protected_content
159  if (format.testOption(QSurfaceFormat::ProtectedContent)) {
160  if (q_hasEglExtension(m_eglDisplay, "EGL_EXT_protected_content")) {
161  contextAttrs.append(EGL_PROTECTED_CONTENT_EXT);
162  contextAttrs.append(EGL_TRUE);
163  } else {
165  }
166  }
167 #endif
168 
169  // Special Options for OpenVG surfaces
170  if (m_format.renderableType() == QSurfaceFormat::OpenVG) {
171  contextAttrs.append(EGL_ALPHA_MASK_SIZE);
172  contextAttrs.append(8);
173  }
174 
175  contextAttrs.append(EGL_NONE);
176  m_contextAttrs = contextAttrs;
177 
178  switch (m_format.renderableType()) {
180  m_api = EGL_OPENVG_API;
181  break;
182 #ifdef EGL_VERSION_1_4
184  m_api = EGL_OPENGL_API;
185  break;
186 #endif // EGL_VERSION_1_4
187  default:
188  m_api = EGL_OPENGL_ES_API;
189  break;
190  }
191 
192  eglBindAPI(m_api);
193  m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, m_shareContext, contextAttrs.constData());
194  if (m_eglContext == EGL_NO_CONTEXT && m_shareContext != EGL_NO_CONTEXT) {
195  m_shareContext = nullptr;
196  m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, nullptr, contextAttrs.constData());
197  }
198 
199  if (m_eglContext == EGL_NO_CONTEXT) {
200  qWarning("QEGLPlatformContext: Failed to create context: %x", eglGetError());
201  return;
202  }
203 
204  static const bool printConfig = qEnvironmentVariableIntValue("QT_QPA_EGLFS_DEBUG");
205  if (printConfig) {
206  qDebug() << "Created context for format" << format << "with config:";
207  q_printEglConfig(m_eglDisplay, m_eglConfig);
208 
209  static const bool printAllConfigs = qEnvironmentVariableIntValue("QT_QPA_EGLFS_DEBUG") > 1;
210  if (printAllConfigs) {
211  EGLint numConfigs = 0;
212  eglGetConfigs(m_eglDisplay, nullptr, 0, &numConfigs);
213  QVector<EGLConfig> configs;
214  configs.resize(numConfigs);
215  eglGetConfigs(m_eglDisplay, configs.data(), numConfigs, &numConfigs);
216  qDebug("\nAll EGLConfigs: count=%d", numConfigs);
217  for (EGLint i = 0; i < numConfigs; ++i) {
218  qDebug("EGLConfig #%d", i);
219  q_printEglConfig(m_eglDisplay, configs[i]);
220  }
221  qDebug("\n");
222  }
223  }
224 
225  // Cannot just call updateFormatFromGL() since it relies on virtuals. Defer it to initialize().
226 }
227 
228 void QEGLPlatformContext::adopt(EGLContext context, EGLDisplay display, QPlatformOpenGLContext *share)
229 {
230  Q_ASSERT(!m_ownsContext);
231 
232  m_eglDisplay = display;
233 
234  // Figure out the EGLConfig.
235  EGLint value = 0;
236  eglQueryContext(m_eglDisplay, context, EGL_CONFIG_ID, &value);
237  EGLint n = 0;
238  EGLConfig cfg;
239  const EGLint attribs[] = { EGL_CONFIG_ID, value, EGL_NONE };
240  if (eglChooseConfig(m_eglDisplay, attribs, &cfg, 1, &n) && n == 1) {
241  m_eglConfig = cfg;
242  m_format = q_glFormatFromConfig(m_eglDisplay, m_eglConfig);
243  } else {
244  qWarning("QEGLPlatformContext: Failed to get framebuffer configuration for context");
245  }
246 
247  // Fetch client API type.
248  value = 0;
249  eglQueryContext(m_eglDisplay, context, EGL_CONTEXT_CLIENT_TYPE, &value);
250  if (value == EGL_OPENGL_API || value == EGL_OPENGL_ES_API) {
251  // if EGL config supports both OpenGL and OpenGL ES render type,
252  // q_glFormatFromConfig() with the default "referenceFormat" parameter
253  // will always figure it out as OpenGL render type.
254  // We can override it to match user's real render type.
255  if (value == EGL_OPENGL_ES_API)
257  m_api = value;
258  eglBindAPI(m_api);
259  } else {
260  qWarning("QEGLPlatformContext: Failed to get client API type");
261  m_api = EGL_OPENGL_ES_API;
262  }
263 
264  m_eglContext = context;
265  m_shareContext = share ? static_cast<QEGLPlatformContext *>(share)->m_eglContext : nullptr;
266  updateFormatFromGL();
267 }
268 
270 {
271  if (m_eglContext != EGL_NO_CONTEXT)
272  updateFormatFromGL();
273 }
274 
275 // Base implementation for pbuffers. Subclasses will handle the specialized cases for
276 // platforms without pbuffers.
278 {
279  // Make the context current to ensure the GL version query works. This needs a surface too.
280  const EGLint pbufferAttributes[] = {
281  EGL_WIDTH, 1,
282  EGL_HEIGHT, 1,
283  EGL_LARGEST_PBUFFER, EGL_FALSE,
284  EGL_NONE
285  };
286 
287  // Cannot just pass m_eglConfig because it may not be suitable for pbuffers. Instead,
288  // do what QEGLPbuffer would do: request a config with the same attributes but with
289  // PBUFFER_BIT set.
290  EGLConfig config = q_configFromGLFormat(m_eglDisplay, m_format, false, EGL_PBUFFER_BIT);
291 
292  return eglCreatePbufferSurface(m_eglDisplay, config, pbufferAttributes);
293 }
294 
296 {
297  eglDestroySurface(m_eglDisplay, surface);
298 }
299 
301 {
302  // Nothing to do here, subclasses may override in order to perform OpenGL
303  // queries needing a context.
304 }
305 
306 void QEGLPlatformContext::updateFormatFromGL()
307 {
308 #ifndef QT_NO_OPENGL
309  // Have to save & restore to prevent QOpenGLContext::currentContext() from becoming
310  // inconsistent after QOpenGLContext::create().
311  EGLDisplay prevDisplay = eglGetCurrentDisplay();
312  if (prevDisplay == EGL_NO_DISPLAY) // when no context is current
313  prevDisplay = m_eglDisplay;
314  EGLContext prevContext = eglGetCurrentContext();
315  EGLSurface prevSurfaceDraw = eglGetCurrentSurface(EGL_DRAW);
316  EGLSurface prevSurfaceRead = eglGetCurrentSurface(EGL_READ);
317 
318  // Rely on the surfaceless extension, if available. This is beneficial since we can
319  // avoid creating an extra pbuffer surface which is apparently troublesome with some
320  // drivers (Mesa) when certain attributes are present (multisampling).
321  EGLSurface tempSurface = EGL_NO_SURFACE;
322  EGLContext tempContext = EGL_NO_CONTEXT;
323  if (m_flags.testFlag(NoSurfaceless) || !q_hasEglExtension(m_eglDisplay, "EGL_KHR_surfaceless_context"))
324  tempSurface = createTemporaryOffscreenSurface();
325 
326  EGLBoolean ok = eglMakeCurrent(m_eglDisplay, tempSurface, tempSurface, m_eglContext);
327  if (!ok) {
328  EGLConfig config = q_configFromGLFormat(m_eglDisplay, m_format, false, EGL_PBUFFER_BIT);
329  tempContext = eglCreateContext(m_eglDisplay, config, nullptr, m_contextAttrs.constData());
330  if (tempContext != EGL_NO_CONTEXT)
331  ok = eglMakeCurrent(m_eglDisplay, tempSurface, tempSurface, tempContext);
332  }
333  if (ok) {
334  if (m_format.renderableType() == QSurfaceFormat::OpenGL
335  || m_format.renderableType() == QSurfaceFormat::OpenGLES) {
336  const GLubyte *s = glGetString(GL_VERSION);
337  if (s) {
338  QByteArray version = QByteArray(reinterpret_cast<const char *>(s));
339  int major, minor;
341  m_format.setMajorVersion(major);
342  m_format.setMinorVersion(minor);
343  }
344  }
346  m_format.setOptions(QSurfaceFormat::FormatOptions());
347  if (m_format.renderableType() == QSurfaceFormat::OpenGL) {
348  // Check profile and options.
349  if (m_format.majorVersion() < 3) {
351  } else {
352  GLint value = 0;
353  glGetIntegerv(GL_CONTEXT_FLAGS, &value);
358  if (m_format.version() >= qMakePair(3, 2)) {
359  value = 0;
360  glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &value);
365  }
366  }
367  }
368  }
369  runGLChecks();
370  eglMakeCurrent(prevDisplay, prevSurfaceDraw, prevSurfaceRead, prevContext);
371  } else {
372  qWarning("QEGLPlatformContext: Failed to make temporary surface current, format not updated (%x)", eglGetError());
373  }
374  if (tempSurface != EGL_NO_SURFACE)
376  if (tempContext != EGL_NO_CONTEXT)
377  eglDestroyContext(m_eglDisplay, tempContext);
378 #endif // QT_NO_OPENGL
379 }
380 
382 {
383  Q_ASSERT(surface->surface()->supportsOpenGL());
384 
385  eglBindAPI(m_api);
386 
387  EGLSurface eglSurface = eglSurfaceForPlatformSurface(surface);
388 
389  // shortcut: on some GPUs, eglMakeCurrent is not a cheap operation
390  if (eglGetCurrentContext() == m_eglContext &&
391  eglGetCurrentDisplay() == m_eglDisplay &&
392  eglGetCurrentSurface(EGL_READ) == eglSurface &&
393  eglGetCurrentSurface(EGL_DRAW) == eglSurface) {
394  return true;
395  }
396 
397  const bool ok = eglMakeCurrent(m_eglDisplay, eglSurface, eglSurface, m_eglContext);
398  if (ok) {
399  if (!m_swapIntervalEnvChecked) {
400  m_swapIntervalEnvChecked = true;
401  if (qEnvironmentVariableIsSet("QT_QPA_EGLFS_SWAPINTERVAL")) {
402  QByteArray swapIntervalString = qgetenv("QT_QPA_EGLFS_SWAPINTERVAL");
403  bool intervalOk;
404  const int swapInterval = swapIntervalString.toInt(&intervalOk);
405  if (intervalOk)
406  m_swapIntervalFromEnv = swapInterval;
407  }
408  }
409  const int requestedSwapInterval = m_swapIntervalFromEnv >= 0
410  ? m_swapIntervalFromEnv
411  : surface->format().swapInterval();
412  if (requestedSwapInterval >= 0 && m_swapInterval != requestedSwapInterval) {
413  m_swapInterval = requestedSwapInterval;
414  if (eglSurface != EGL_NO_SURFACE) // skip if using surfaceless context
415  eglSwapInterval(eglDisplay(), m_swapInterval);
416  }
417  } else {
418  qWarning("QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
419  }
420 
421  return ok;
422 }
423 
425 {
426  if (m_ownsContext && m_eglContext != EGL_NO_CONTEXT)
427  eglDestroyContext(m_eglDisplay, m_eglContext);
428 
429  m_eglContext = EGL_NO_CONTEXT;
430 }
431 
433 {
434  eglBindAPI(m_api);
435  bool ok = eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
436  if (!ok)
437  qWarning("QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
438 }
439 
441 {
442  eglBindAPI(m_api);
443  EGLSurface eglSurface = eglSurfaceForPlatformSurface(surface);
444  if (eglSurface != EGL_NO_SURFACE) { // skip if using surfaceless context
445  bool ok = eglSwapBuffers(m_eglDisplay, eglSurface);
446  if (!ok)
447  qWarning("QEGLPlatformContext: eglSwapBuffers failed: %x", eglGetError());
448  }
449 }
450 
451 QFunctionPointer QEGLPlatformContext::getProcAddress(const char *procName)
452 {
453  eglBindAPI(m_api);
454  QFunctionPointer proc = (QFunctionPointer) eglGetProcAddress(procName);
455 #if !defined(Q_OS_WIN) && !defined(Q_OS_INTEGRITY)
456  if (!proc)
457  proc = (QFunctionPointer) dlsym(RTLD_DEFAULT, procName);
458 #elif !defined(QT_OPENGL_DYNAMIC)
459  // On systems without KHR_get_all_proc_addresses and without
460  // dynamic linking there still has to be a way to access the
461  // standard GLES functions. QOpenGL(Extra)Functions never makes
462  // direct GL API calls since Qt 5.7, so all such workarounds are
463  // expected to be handled in the platform plugin.
464  if (!proc) {
465  static struct StdFunc {
466  const char *name;
467  QFunctionPointer func;
468  } standardFuncs[] = {
469 #if QT_CONFIG(opengles2)
470  { "glBindTexture", (QFunctionPointer) ::glBindTexture },
471  { "glBlendFunc", (QFunctionPointer) ::glBlendFunc },
472  { "glClear", (QFunctionPointer) ::glClear },
473  { "glClearColor", (QFunctionPointer) ::glClearColor },
474  { "glClearStencil", (QFunctionPointer) ::glClearStencil },
475  { "glColorMask", (QFunctionPointer) ::glColorMask },
476  { "glCopyTexImage2D", (QFunctionPointer) ::glCopyTexImage2D },
477  { "glCopyTexSubImage2D", (QFunctionPointer) ::glCopyTexSubImage2D },
478  { "glCullFace", (QFunctionPointer) ::glCullFace },
479  { "glDeleteTextures", (QFunctionPointer) ::glDeleteTextures },
480  { "glDepthFunc", (QFunctionPointer) ::glDepthFunc },
481  { "glDepthMask", (QFunctionPointer) ::glDepthMask },
482  { "glDisable", (QFunctionPointer) ::glDisable },
483  { "glDrawArrays", (QFunctionPointer) ::glDrawArrays },
484  { "glDrawElements", (QFunctionPointer) ::glDrawElements },
485  { "glEnable", (QFunctionPointer) ::glEnable },
486  { "glFinish", (QFunctionPointer) ::glFinish },
487  { "glFlush", (QFunctionPointer) ::glFlush },
488  { "glFrontFace", (QFunctionPointer) ::glFrontFace },
489  { "glGenTextures", (QFunctionPointer) ::glGenTextures },
490  { "glGetBooleanv", (QFunctionPointer) ::glGetBooleanv },
491  { "glGetError", (QFunctionPointer) ::glGetError },
492  { "glGetFloatv", (QFunctionPointer) ::glGetFloatv },
493  { "glGetIntegerv", (QFunctionPointer) ::glGetIntegerv },
494  { "glGetString", (QFunctionPointer) ::glGetString },
495  { "glGetTexParameterfv", (QFunctionPointer) ::glGetTexParameterfv },
496  { "glGetTexParameteriv", (QFunctionPointer) ::glGetTexParameteriv },
497  { "glHint", (QFunctionPointer) ::glHint },
498  { "glIsEnabled", (QFunctionPointer) ::glIsEnabled },
499  { "glIsTexture", (QFunctionPointer) ::glIsTexture },
500  { "glLineWidth", (QFunctionPointer) ::glLineWidth },
501  { "glPixelStorei", (QFunctionPointer) ::glPixelStorei },
502  { "glPolygonOffset", (QFunctionPointer) ::glPolygonOffset },
503  { "glReadPixels", (QFunctionPointer) ::glReadPixels },
504  { "glScissor", (QFunctionPointer) ::glScissor },
505  { "glStencilFunc", (QFunctionPointer) ::glStencilFunc },
506  { "glStencilMask", (QFunctionPointer) ::glStencilMask },
507  { "glStencilOp", (QFunctionPointer) ::glStencilOp },
508  { "glTexImage2D", (QFunctionPointer) ::glTexImage2D },
509  { "glTexParameterf", (QFunctionPointer) ::glTexParameterf },
510  { "glTexParameterfv", (QFunctionPointer) ::glTexParameterfv },
511  { "glTexParameteri", (QFunctionPointer) ::glTexParameteri },
512  { "glTexParameteriv", (QFunctionPointer) ::glTexParameteriv },
513  { "glTexSubImage2D", (QFunctionPointer) ::glTexSubImage2D },
514  { "glViewport", (QFunctionPointer) ::glViewport },
515 
516  { "glActiveTexture", (QFunctionPointer) ::glActiveTexture },
517  { "glAttachShader", (QFunctionPointer) ::glAttachShader },
518  { "glBindAttribLocation", (QFunctionPointer) ::glBindAttribLocation },
519  { "glBindBuffer", (QFunctionPointer) ::glBindBuffer },
520  { "glBindFramebuffer", (QFunctionPointer) ::glBindFramebuffer },
521  { "glBindRenderbuffer", (QFunctionPointer) ::glBindRenderbuffer },
522  { "glBlendColor", (QFunctionPointer) ::glBlendColor },
523  { "glBlendEquation", (QFunctionPointer) ::glBlendEquation },
524  { "glBlendEquationSeparate", (QFunctionPointer) ::glBlendEquationSeparate },
525  { "glBlendFuncSeparate", (QFunctionPointer) ::glBlendFuncSeparate },
526  { "glBufferData", (QFunctionPointer) ::glBufferData },
527  { "glBufferSubData", (QFunctionPointer) ::glBufferSubData },
528  { "glCheckFramebufferStatus", (QFunctionPointer) ::glCheckFramebufferStatus },
529  { "glCompileShader", (QFunctionPointer) ::glCompileShader },
530  { "glCompressedTexImage2D", (QFunctionPointer) ::glCompressedTexImage2D },
531  { "glCompressedTexSubImage2D", (QFunctionPointer) ::glCompressedTexSubImage2D },
532  { "glCreateProgram", (QFunctionPointer) ::glCreateProgram },
533  { "glCreateShader", (QFunctionPointer) ::glCreateShader },
534  { "glDeleteBuffers", (QFunctionPointer) ::glDeleteBuffers },
535  { "glDeleteFramebuffers", (QFunctionPointer) ::glDeleteFramebuffers },
536  { "glDeleteProgram", (QFunctionPointer) ::glDeleteProgram },
537  { "glDeleteRenderbuffers", (QFunctionPointer) ::glDeleteRenderbuffers },
538  { "glDeleteShader", (QFunctionPointer) ::glDeleteShader },
539  { "glDetachShader", (QFunctionPointer) ::glDetachShader },
540  { "glDisableVertexAttribArray", (QFunctionPointer) ::glDisableVertexAttribArray },
541  { "glEnableVertexAttribArray", (QFunctionPointer) ::glEnableVertexAttribArray },
542  { "glFramebufferRenderbuffer", (QFunctionPointer) ::glFramebufferRenderbuffer },
543  { "glFramebufferTexture2D", (QFunctionPointer) ::glFramebufferTexture2D },
544  { "glGenBuffers", (QFunctionPointer) ::glGenBuffers },
545  { "glGenerateMipmap", (QFunctionPointer) ::glGenerateMipmap },
546  { "glGenFramebuffers", (QFunctionPointer) ::glGenFramebuffers },
547  { "glGenRenderbuffers", (QFunctionPointer) ::glGenRenderbuffers },
548  { "glGetActiveAttrib", (QFunctionPointer) ::glGetActiveAttrib },
549  { "glGetActiveUniform", (QFunctionPointer) ::glGetActiveUniform },
550  { "glGetAttachedShaders", (QFunctionPointer) ::glGetAttachedShaders },
551  { "glGetAttribLocation", (QFunctionPointer) ::glGetAttribLocation },
552  { "glGetBufferParameteriv", (QFunctionPointer) ::glGetBufferParameteriv },
553  { "glGetFramebufferAttachmentParameteriv", (QFunctionPointer) ::glGetFramebufferAttachmentParameteriv },
554  { "glGetProgramiv", (QFunctionPointer) ::glGetProgramiv },
555  { "glGetProgramInfoLog", (QFunctionPointer) ::glGetProgramInfoLog },
556  { "glGetRenderbufferParameteriv", (QFunctionPointer) ::glGetRenderbufferParameteriv },
557  { "glGetShaderiv", (QFunctionPointer) ::glGetShaderiv },
558  { "glGetShaderInfoLog", (QFunctionPointer) ::glGetShaderInfoLog },
559  { "glGetShaderPrecisionFormat", (QFunctionPointer) ::glGetShaderPrecisionFormat },
560  { "glGetShaderSource", (QFunctionPointer) ::glGetShaderSource },
561  { "glGetUniformfv", (QFunctionPointer) ::glGetUniformfv },
562  { "glGetUniformiv", (QFunctionPointer) ::glGetUniformiv },
563  { "glGetUniformLocation", (QFunctionPointer) ::glGetUniformLocation },
564  { "glGetVertexAttribfv", (QFunctionPointer) ::glGetVertexAttribfv },
565  { "glGetVertexAttribiv", (QFunctionPointer) ::glGetVertexAttribiv },
566  { "glGetVertexAttribPointerv", (QFunctionPointer) ::glGetVertexAttribPointerv },
567  { "glIsBuffer", (QFunctionPointer) ::glIsBuffer },
568  { "glIsFramebuffer", (QFunctionPointer) ::glIsFramebuffer },
569  { "glIsProgram", (QFunctionPointer) ::glIsProgram },
570  { "glIsRenderbuffer", (QFunctionPointer) ::glIsRenderbuffer },
571  { "glIsShader", (QFunctionPointer) ::glIsShader },
572  { "glLinkProgram", (QFunctionPointer) ::glLinkProgram },
573  { "glReleaseShaderCompiler", (QFunctionPointer) ::glReleaseShaderCompiler },
574  { "glRenderbufferStorage", (QFunctionPointer) ::glRenderbufferStorage },
575  { "glSampleCoverage", (QFunctionPointer) ::glSampleCoverage },
576  { "glShaderBinary", (QFunctionPointer) ::glShaderBinary },
577  { "glShaderSource", (QFunctionPointer) ::glShaderSource },
578  { "glStencilFuncSeparate", (QFunctionPointer) ::glStencilFuncSeparate },
579  { "glStencilMaskSeparate", (QFunctionPointer) ::glStencilMaskSeparate },
580  { "glStencilOpSeparate", (QFunctionPointer) ::glStencilOpSeparate },
581  { "glUniform1f", (QFunctionPointer) ::glUniform1f },
582  { "glUniform1fv", (QFunctionPointer) ::glUniform1fv },
583  { "glUniform1i", (QFunctionPointer) ::glUniform1i },
584  { "glUniform1iv", (QFunctionPointer) ::glUniform1iv },
585  { "glUniform2f", (QFunctionPointer) ::glUniform2f },
586  { "glUniform2fv", (QFunctionPointer) ::glUniform2fv },
587  { "glUniform2i", (QFunctionPointer) ::glUniform2i },
588  { "glUniform2iv", (QFunctionPointer) ::glUniform2iv },
589  { "glUniform3f", (QFunctionPointer) ::glUniform3f },
590  { "glUniform3fv", (QFunctionPointer) ::glUniform3fv },
591  { "glUniform3i", (QFunctionPointer) ::glUniform3i },
592  { "glUniform3iv", (QFunctionPointer) ::glUniform3iv },
593  { "glUniform4f", (QFunctionPointer) ::glUniform4f },
594  { "glUniform4fv", (QFunctionPointer) ::glUniform4fv },
595  { "glUniform4i", (QFunctionPointer) ::glUniform4i },
596  { "glUniform4iv", (QFunctionPointer) ::glUniform4iv },
597  { "glUniformMatrix2fv", (QFunctionPointer) ::glUniformMatrix2fv },
598  { "glUniformMatrix3fv", (QFunctionPointer) ::glUniformMatrix3fv },
599  { "glUniformMatrix4fv", (QFunctionPointer) ::glUniformMatrix4fv },
600  { "glUseProgram", (QFunctionPointer) ::glUseProgram },
601  { "glValidateProgram", (QFunctionPointer) ::glValidateProgram },
602  { "glVertexAttrib1f", (QFunctionPointer) ::glVertexAttrib1f },
603  { "glVertexAttrib1fv", (QFunctionPointer) ::glVertexAttrib1fv },
604  { "glVertexAttrib2f", (QFunctionPointer) ::glVertexAttrib2f },
605  { "glVertexAttrib2fv", (QFunctionPointer) ::glVertexAttrib2fv },
606  { "glVertexAttrib3f", (QFunctionPointer) ::glVertexAttrib3f },
607  { "glVertexAttrib3fv", (QFunctionPointer) ::glVertexAttrib3fv },
608  { "glVertexAttrib4f", (QFunctionPointer) ::glVertexAttrib4f },
609  { "glVertexAttrib4fv", (QFunctionPointer) ::glVertexAttrib4fv },
610  { "glVertexAttribPointer", (QFunctionPointer) ::glVertexAttribPointer },
611 
612  { "glClearDepthf", (QFunctionPointer) ::glClearDepthf },
613  { "glDepthRangef", (QFunctionPointer) ::glDepthRangef },
614 #endif // QT_CONFIG(opengles2)
615 
616 #if QT_CONFIG(opengles3)
617  { "glBeginQuery", (QFunctionPointer) ::glBeginQuery },
618  { "glBeginTransformFeedback", (QFunctionPointer) ::glBeginTransformFeedback },
619  { "glBindBufferBase", (QFunctionPointer) ::glBindBufferBase },
620  { "glBindBufferRange", (QFunctionPointer) ::glBindBufferRange },
621  { "glBindSampler", (QFunctionPointer) ::glBindSampler },
622  { "glBindTransformFeedback", (QFunctionPointer) ::glBindTransformFeedback },
623  { "glBindVertexArray", (QFunctionPointer) ::glBindVertexArray },
624  { "glBlitFramebuffer", (QFunctionPointer) ::glBlitFramebuffer },
625  { "glClearBufferfi", (QFunctionPointer) ::glClearBufferfi },
626  { "glClearBufferfv", (QFunctionPointer) ::glClearBufferfv },
627  { "glClearBufferiv", (QFunctionPointer) ::glClearBufferiv },
628  { "glClearBufferuiv", (QFunctionPointer) ::glClearBufferuiv },
629  { "glClientWaitSync", (QFunctionPointer) ::glClientWaitSync },
630  { "glCompressedTexImage3D", (QFunctionPointer) ::glCompressedTexImage3D },
631  { "glCompressedTexSubImage3D", (QFunctionPointer) ::glCompressedTexSubImage3D },
632  { "glCopyBufferSubData", (QFunctionPointer) ::glCopyBufferSubData },
633  { "glCopyTexSubImage3D", (QFunctionPointer) ::glCopyTexSubImage3D },
634  { "glDeleteQueries", (QFunctionPointer) ::glDeleteQueries },
635  { "glDeleteSamplers", (QFunctionPointer) ::glDeleteSamplers },
636  { "glDeleteSync", (QFunctionPointer) ::glDeleteSync },
637  { "glDeleteTransformFeedbacks", (QFunctionPointer) ::glDeleteTransformFeedbacks },
638  { "glDeleteVertexArrays", (QFunctionPointer) ::glDeleteVertexArrays },
639  { "glDrawArraysInstanced", (QFunctionPointer) ::glDrawArraysInstanced },
640  { "glDrawBuffers", (QFunctionPointer) ::glDrawBuffers },
641  { "glDrawElementsInstanced", (QFunctionPointer) ::glDrawElementsInstanced },
642  { "glDrawRangeElements", (QFunctionPointer) ::glDrawRangeElements },
643  { "glEndQuery", (QFunctionPointer) ::glEndQuery },
644  { "glEndTransformFeedback", (QFunctionPointer) ::glEndTransformFeedback },
645  { "glFenceSync", (QFunctionPointer) ::glFenceSync },
646  { "glFlushMappedBufferRange", (QFunctionPointer) ::glFlushMappedBufferRange },
647  { "glFramebufferTextureLayer", (QFunctionPointer) ::glFramebufferTextureLayer },
648  { "glGenQueries", (QFunctionPointer) ::glGenQueries },
649  { "glGenSamplers", (QFunctionPointer) ::glGenSamplers },
650  { "glGenTransformFeedbacks", (QFunctionPointer) ::glGenTransformFeedbacks },
651  { "glGenVertexArrays", (QFunctionPointer) ::glGenVertexArrays },
652  { "glGetActiveUniformBlockName", (QFunctionPointer) ::glGetActiveUniformBlockName },
653  { "glGetActiveUniformBlockiv", (QFunctionPointer) ::glGetActiveUniformBlockiv },
654  { "glGetActiveUniformsiv", (QFunctionPointer) ::glGetActiveUniformsiv },
655  { "glGetBufferParameteri64v", (QFunctionPointer) ::glGetBufferParameteri64v },
656  { "glGetBufferPointerv", (QFunctionPointer) ::glGetBufferPointerv },
657  { "glGetFragDataLocation", (QFunctionPointer) ::glGetFragDataLocation },
658  { "glGetInteger64i_v", (QFunctionPointer) ::glGetInteger64i_v },
659  { "glGetInteger64v", (QFunctionPointer) ::glGetInteger64v },
660  { "glGetIntegeri_v", (QFunctionPointer) ::glGetIntegeri_v },
661  { "glGetInternalformativ", (QFunctionPointer) ::glGetInternalformativ },
662  { "glGetProgramBinary", (QFunctionPointer) ::glGetProgramBinary },
663  { "glGetQueryObjectuiv", (QFunctionPointer) ::glGetQueryObjectuiv },
664  { "glGetQueryiv", (QFunctionPointer) ::glGetQueryiv },
665  { "glGetSamplerParameterfv", (QFunctionPointer) ::glGetSamplerParameterfv },
666  { "glGetSamplerParameteriv", (QFunctionPointer) ::glGetSamplerParameteriv },
667  { "glGetStringi", (QFunctionPointer) ::glGetStringi },
668  { "glGetSynciv", (QFunctionPointer) ::glGetSynciv },
669  { "glGetTransformFeedbackVarying", (QFunctionPointer) ::glGetTransformFeedbackVarying },
670  { "glGetUniformBlockIndex", (QFunctionPointer) ::glGetUniformBlockIndex },
671  { "glGetUniformIndices", (QFunctionPointer) ::glGetUniformIndices },
672  { "glGetUniformuiv", (QFunctionPointer) ::glGetUniformuiv },
673  { "glGetVertexAttribIiv", (QFunctionPointer) ::glGetVertexAttribIiv },
674  { "glGetVertexAttribIuiv", (QFunctionPointer) ::glGetVertexAttribIuiv },
675  { "glInvalidateFramebuffer", (QFunctionPointer) ::glInvalidateFramebuffer },
676  { "glInvalidateSubFramebuffer", (QFunctionPointer) ::glInvalidateSubFramebuffer },
677  { "glIsQuery", (QFunctionPointer) ::glIsQuery },
678  { "glIsSampler", (QFunctionPointer) ::glIsSampler },
679  { "glIsSync", (QFunctionPointer) ::glIsSync },
680  { "glIsTransformFeedback", (QFunctionPointer) ::glIsTransformFeedback },
681  { "glIsVertexArray", (QFunctionPointer) ::glIsVertexArray },
682  { "glMapBufferRange", (QFunctionPointer) ::glMapBufferRange },
683  { "glPauseTransformFeedback", (QFunctionPointer) ::glPauseTransformFeedback },
684  { "glProgramBinary", (QFunctionPointer) ::glProgramBinary },
685  { "glProgramParameteri", (QFunctionPointer) ::glProgramParameteri },
686  { "glReadBuffer", (QFunctionPointer) ::glReadBuffer },
687  { "glRenderbufferStorageMultisample", (QFunctionPointer) ::glRenderbufferStorageMultisample },
688  { "glResumeTransformFeedback", (QFunctionPointer) ::glResumeTransformFeedback },
689  { "glSamplerParameterf", (QFunctionPointer) ::glSamplerParameterf },
690  { "glSamplerParameterfv", (QFunctionPointer) ::glSamplerParameterfv },
691  { "glSamplerParameteri", (QFunctionPointer) ::glSamplerParameteri },
692  { "glSamplerParameteriv", (QFunctionPointer) ::glSamplerParameteriv },
693  { "glTexImage3D", (QFunctionPointer) ::glTexImage3D },
694  { "glTexStorage2D", (QFunctionPointer) ::glTexStorage2D },
695  { "glTexStorage3D", (QFunctionPointer) ::glTexStorage3D },
696  { "glTexSubImage3D", (QFunctionPointer) ::glTexSubImage3D },
697  { "glTransformFeedbackVaryings", (QFunctionPointer) ::glTransformFeedbackVaryings },
698  { "glUniform1ui", (QFunctionPointer) ::glUniform1ui },
699  { "glUniform1uiv", (QFunctionPointer) ::glUniform1uiv },
700  { "glUniform2ui", (QFunctionPointer) ::glUniform2ui },
701  { "glUniform2uiv", (QFunctionPointer) ::glUniform2uiv },
702  { "glUniform3ui", (QFunctionPointer) ::glUniform3ui },
703  { "glUniform3uiv", (QFunctionPointer) ::glUniform3uiv },
704  { "glUniform4ui", (QFunctionPointer) ::glUniform4ui },
705  { "glUniform4uiv", (QFunctionPointer) ::glUniform4uiv },
706  { "glUniformBlockBinding", (QFunctionPointer) ::glUniformBlockBinding },
707  { "glUniformMatrix2x3fv", (QFunctionPointer) ::glUniformMatrix2x3fv },
708  { "glUniformMatrix2x4fv", (QFunctionPointer) ::glUniformMatrix2x4fv },
709  { "glUniformMatrix3x2fv", (QFunctionPointer) ::glUniformMatrix3x2fv },
710  { "glUniformMatrix3x4fv", (QFunctionPointer) ::glUniformMatrix3x4fv },
711  { "glUniformMatrix4x2fv", (QFunctionPointer) ::glUniformMatrix4x2fv },
712  { "glUniformMatrix4x3fv", (QFunctionPointer) ::glUniformMatrix4x3fv },
713  { "glUnmapBuffer", (QFunctionPointer) ::glUnmapBuffer },
714  { "glVertexAttribDivisor", (QFunctionPointer) ::glVertexAttribDivisor },
715  { "glVertexAttribI4i", (QFunctionPointer) ::glVertexAttribI4i },
716  { "glVertexAttribI4iv", (QFunctionPointer) ::glVertexAttribI4iv },
717  { "glVertexAttribI4ui", (QFunctionPointer) ::glVertexAttribI4ui },
718  { "glVertexAttribI4uiv", (QFunctionPointer) ::glVertexAttribI4uiv },
719  { "glVertexAttribIPointer", (QFunctionPointer) ::glVertexAttribIPointer },
720  { "glWaitSync", (QFunctionPointer) ::glWaitSync },
721 #endif // QT_CONFIG(opengles3)
722 
723 #if QT_CONFIG(opengles31)
724  { "glActiveShaderProgram", (QFunctionPointer) ::glActiveShaderProgram },
725  { "glBindImageTexture", (QFunctionPointer) ::glBindImageTexture },
726  { "glBindProgramPipeline", (QFunctionPointer) ::glBindProgramPipeline },
727  { "glBindVertexBuffer", (QFunctionPointer) ::glBindVertexBuffer },
728  { "glCreateShaderProgramv", (QFunctionPointer) ::glCreateShaderProgramv },
729  { "glDeleteProgramPipelines", (QFunctionPointer) ::glDeleteProgramPipelines },
730  { "glDispatchCompute", (QFunctionPointer) ::glDispatchCompute },
731  { "glDispatchComputeIndirect", (QFunctionPointer) ::glDispatchComputeIndirect },
732  { "glDrawArraysIndirect", (QFunctionPointer) ::glDrawArraysIndirect },
733  { "glDrawElementsIndirect", (QFunctionPointer) ::glDrawElementsIndirect },
734  { "glFramebufferParameteri", (QFunctionPointer) ::glFramebufferParameteri },
735  { "glGenProgramPipelines", (QFunctionPointer) ::glGenProgramPipelines },
736  { "glGetBooleani_v", (QFunctionPointer) ::glGetBooleani_v },
737  { "glGetFramebufferParameteriv", (QFunctionPointer) ::glGetFramebufferParameteriv },
738  { "glGetMultisamplefv", (QFunctionPointer) ::glGetMultisamplefv },
739  { "glGetProgramInterfaceiv", (QFunctionPointer) ::glGetProgramInterfaceiv },
740  { "glGetProgramPipelineInfoLog", (QFunctionPointer) ::glGetProgramPipelineInfoLog },
741  { "glGetProgramPipelineiv", (QFunctionPointer) ::glGetProgramPipelineiv },
742  { "glGetProgramResourceIndex", (QFunctionPointer) ::glGetProgramResourceIndex },
743  { "glGetProgramResourceLocation", (QFunctionPointer) ::glGetProgramResourceLocation },
744  { "glGetProgramResourceName", (QFunctionPointer) ::glGetProgramResourceName },
745  { "glGetProgramResourceiv", (QFunctionPointer) ::glGetProgramResourceiv },
746  { "glGetTexLevelParameterfv", (QFunctionPointer) ::glGetTexLevelParameterfv },
747  { "glGetTexLevelParameteriv", (QFunctionPointer) ::glGetTexLevelParameteriv },
748  { "glIsProgramPipeline", (QFunctionPointer) ::glIsProgramPipeline },
749  { "glMemoryBarrier", (QFunctionPointer) ::glMemoryBarrier },
750  { "glMemoryBarrierByRegion", (QFunctionPointer) ::glMemoryBarrierByRegion },
751  { "glProgramUniform1f", (QFunctionPointer) ::glProgramUniform1f },
752  { "glProgramUniform1fv", (QFunctionPointer) ::glProgramUniform1fv },
753  { "glProgramUniform1i", (QFunctionPointer) ::glProgramUniform1i },
754  { "glProgramUniform1iv", (QFunctionPointer) ::glProgramUniform1iv },
755  { "glProgramUniform1ui", (QFunctionPointer) ::glProgramUniform1ui },
756  { "glProgramUniform1uiv", (QFunctionPointer) ::glProgramUniform1uiv },
757  { "glProgramUniform2f", (QFunctionPointer) ::glProgramUniform2f },
758  { "glProgramUniform2fv", (QFunctionPointer) ::glProgramUniform2fv },
759  { "glProgramUniform2i", (QFunctionPointer) ::glProgramUniform2i },
760  { "glProgramUniform2iv", (QFunctionPointer) ::glProgramUniform2iv },
761  { "glProgramUniform2ui", (QFunctionPointer) ::glProgramUniform2ui },
762  { "glProgramUniform2uiv", (QFunctionPointer) ::glProgramUniform2uiv },
763  { "glProgramUniform3f", (QFunctionPointer) ::glProgramUniform3f },
764  { "glProgramUniform3fv", (QFunctionPointer) ::glProgramUniform3fv },
765  { "glProgramUniform3i", (QFunctionPointer) ::glProgramUniform3i },
766  { "glProgramUniform3iv", (QFunctionPointer) ::glProgramUniform3iv },
767  { "glProgramUniform3ui", (QFunctionPointer) ::glProgramUniform3ui },
768  { "glProgramUniform3uiv", (QFunctionPointer) ::glProgramUniform3uiv },
769  { "glProgramUniform4f", (QFunctionPointer) ::glProgramUniform4f },
770  { "glProgramUniform4fv", (QFunctionPointer) ::glProgramUniform4fv },
771  { "glProgramUniform4i", (QFunctionPointer) ::glProgramUniform4i },
772  { "glProgramUniform4iv", (QFunctionPointer) ::glProgramUniform4iv },
773  { "glProgramUniform4ui", (QFunctionPointer) ::glProgramUniform4ui },
774  { "glProgramUniform4uiv", (QFunctionPointer) ::glProgramUniform4uiv },
775  { "glProgramUniformMatrix2fv", (QFunctionPointer) ::glProgramUniformMatrix2fv },
776  { "glProgramUniformMatrix2x3fv", (QFunctionPointer) ::glProgramUniformMatrix2x3fv },
777  { "glProgramUniformMatrix2x4fv", (QFunctionPointer) ::glProgramUniformMatrix2x4fv },
778  { "glProgramUniformMatrix3fv", (QFunctionPointer) ::glProgramUniformMatrix3fv },
779  { "glProgramUniformMatrix3x2fv", (QFunctionPointer) ::glProgramUniformMatrix3x2fv },
780  { "glProgramUniformMatrix3x4fv", (QFunctionPointer) ::glProgramUniformMatrix3x4fv },
781  { "glProgramUniformMatrix4fv", (QFunctionPointer) ::glProgramUniformMatrix4fv },
782  { "glProgramUniformMatrix4x2fv", (QFunctionPointer) ::glProgramUniformMatrix4x2fv },
783  { "glProgramUniformMatrix4x3fv", (QFunctionPointer) ::glProgramUniformMatrix4x3fv },
784  { "glSampleMaski", (QFunctionPointer) ::glSampleMaski },
785  { "glTexStorage2DMultisample", (QFunctionPointer) ::glTexStorage2DMultisample },
786  { "glUseProgramStages", (QFunctionPointer) ::glUseProgramStages },
787  { "glValidateProgramPipeline", (QFunctionPointer) ::glValidateProgramPipeline },
788  { "glVertexAttribBinding", (QFunctionPointer) ::glVertexAttribBinding },
789  { "glVertexAttribFormat", (QFunctionPointer) ::glVertexAttribFormat },
790  { "glVertexAttribIFormat", (QFunctionPointer) ::glVertexAttribIFormat },
791  { "glVertexBindingDivisor", (QFunctionPointer) ::glVertexBindingDivisor },
792 #endif // QT_CONFIG(opengles31)
793 
794 #if QT_CONFIG(opengles32)
795  { "glBlendBarrier", (QFunctionPointer) ::glBlendBarrier },
796  { "glCopyImageSubData", (QFunctionPointer) ::glCopyImageSubData },
797  { "glDebugMessageControl", (QFunctionPointer) ::glDebugMessageControl },
798  { "glDebugMessageInsert", (QFunctionPointer) ::glDebugMessageInsert },
799  { "glDebugMessageCallback", (QFunctionPointer) ::glDebugMessageCallback },
800  { "glGetDebugMessageLog", (QFunctionPointer) ::glGetDebugMessageLog },
801  { "glPushDebugGroup", (QFunctionPointer) ::glPushDebugGroup },
802  { "glPopDebugGroup", (QFunctionPointer) ::glPopDebugGroup },
803  { "glObjectLabel", (QFunctionPointer) ::glObjectLabel },
804  { "glGetObjectLabel", (QFunctionPointer) ::glGetObjectLabel },
805  { "glObjectPtrLabel", (QFunctionPointer) ::glObjectPtrLabel },
806  { "glGetObjectPtrLabel", (QFunctionPointer) ::glGetObjectPtrLabel },
807  { "glGetPointerv", (QFunctionPointer) ::glGetPointerv },
808  { "glEnablei", (QFunctionPointer) ::glEnablei },
809  { "glDisablei", (QFunctionPointer) ::glDisablei },
810  { "glBlendEquationi", (QFunctionPointer) ::glBlendEquationi },
811  { "glBlendEquationSeparatei", (QFunctionPointer) ::glBlendEquationSeparatei },
812  { "glBlendFunci", (QFunctionPointer) ::glBlendFunci },
813  { "glBlendFuncSeparatei", (QFunctionPointer) ::glBlendFuncSeparatei },
814  { "glColorMaski", (QFunctionPointer) ::glColorMaski },
815  { "glIsEnabledi", (QFunctionPointer) ::glIsEnabledi },
816  { "glDrawElementsBaseVertex", (QFunctionPointer) ::glDrawElementsBaseVertex },
817  { "glDrawRangeElementsBaseVertex", (QFunctionPointer) ::glDrawRangeElementsBaseVertex },
818  { "glDrawElementsInstancedBaseVertex", (QFunctionPointer) ::glDrawElementsInstancedBaseVertex },
819  { "glFramebufferTexture", (QFunctionPointer) ::glFramebufferTexture },
820  { "glPrimitiveBoundingBox", (QFunctionPointer) ::glPrimitiveBoundingBox },
821  { "glGetGraphicsResetStatus", (QFunctionPointer) ::glGetGraphicsResetStatus },
822  { "glReadnPixels", (QFunctionPointer) ::glReadnPixels },
823  { "glGetnUniformfv", (QFunctionPointer) ::glGetnUniformfv },
824  { "glGetnUniformiv", (QFunctionPointer) ::glGetnUniformiv },
825  { "glGetnUniformuiv", (QFunctionPointer) ::glGetnUniformuiv },
826  { "glMinSampleShading", (QFunctionPointer) ::glMinSampleShading },
827  { "glPatchParameteri", (QFunctionPointer) ::glPatchParameteri },
828  { "glTexParameterIiv", (QFunctionPointer) ::glTexParameterIiv },
829  { "glTexParameterIuiv", (QFunctionPointer) ::glTexParameterIuiv },
830  { "glGetTexParameterIiv", (QFunctionPointer) ::glGetTexParameterIiv },
831  { "glGetTexParameterIuiv", (QFunctionPointer) ::glGetTexParameterIuiv },
832  { "glSamplerParameterIiv", (QFunctionPointer) ::glSamplerParameterIiv },
833  { "glSamplerParameterIuiv", (QFunctionPointer) ::glSamplerParameterIuiv },
834  { "glGetSamplerParameterIiv", (QFunctionPointer) ::glGetSamplerParameterIiv },
835  { "glGetSamplerParameterIuiv", (QFunctionPointer) ::glGetSamplerParameterIuiv },
836  { "glTexBuffer", (QFunctionPointer) ::glTexBuffer },
837  { "glTexBufferRange", (QFunctionPointer) ::glTexBufferRange },
838  { "glTexStorage3DMultisample", (QFunctionPointer) ::glTexStorage3DMultisample },
839 #endif // QT_CONFIG(opengles32)
840  };
841 
842  for (size_t i = 0; i < sizeof(standardFuncs) / sizeof(StdFunc); ++i) {
843  if (!qstrcmp(procName, standardFuncs[i].name)) {
844  proc = standardFuncs[i].func;
845  break;
846  }
847  }
848  }
849 #endif
850 
851  return proc;
852 }
853 
855 {
856  return m_format;
857 }
858 
860 {
861  return m_eglContext;
862 }
863 
865 {
866  return m_eglDisplay;
867 }
868 
870 {
871  return m_eglConfig;
872 }
873 
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
#define value
[5]
The QByteArray class provides an array of bytes.
Definition: qbytearray.h:85
int toInt(bool *ok=nullptr, int base=10) const
An EGL context implementation.
EGLConfig eglConfig() const
virtual void destroyTemporaryOffscreenSurface(EGLSurface surface)
EGLDisplay display() const override
EGLDisplay eglDisplay() const
QSurfaceFormat format() const override
void swapBuffers(QPlatformSurface *surface) override
EGLContext eglContext() const
QFunctionPointer getProcAddress(const char *procName) override
bool makeCurrent(QPlatformSurface *surface) override
virtual EGLSurface createTemporaryOffscreenSurface()
virtual EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface)=0
EGLConfig config() const override
const_pointer constData() const noexcept
Definition: qlist.h:444
pointer data()
Definition: qlist.h:442
void resize(qsizetype size)
Definition: qlist.h:420
void append(parameter_type t)
Definition: qlist.h:469
QOpenGLContext * context() const
static bool parseOpenGLVersion(const QByteArray &versionString, int &major, int &minor)
QSurface * surface() const
virtual QSurfaceFormat format() const =0
The QSurfaceFormat class represents the format of a QSurface. \inmodule QtGui.
void setMinorVersion(int minorVersion)
void setRenderableType(RenderableType type)
void setOptions(QSurfaceFormat::FormatOptions options)
void setProfile(OpenGLContextProfile profile)
int swapInterval() const
int majorVersion() const
RenderableType renderableType() const
void setMajorVersion(int majorVersion)
void setOption(FormatOption option, bool on=true)
QPair< int, int > version() const
bool supportsOpenGL() const
Definition: qsurface.cpp:108
int const char * version
Definition: zlib.h:814
#define true
Definition: ftrandom.c:51
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
EGLConfig q_configFromGLFormat(EGLDisplay display, const QSurfaceFormat &format, bool highestPixelFormat, int surfaceType)
QSurfaceFormat q_glFormatFromConfig(EGLDisplay display, const EGLConfig config, const QSurfaceFormat &referenceFormat)
bool q_hasEglExtension(EGLDisplay display, const char *extensionName)
void q_printEglConfig(EGLDisplay display, EGLConfig config)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR
#define GL_CONTEXT_PROFILE_MASK
#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR
#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR
#define EGL_CONTEXT_MINOR_VERSION_KHR
#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR
#define GL_CONTEXT_CORE_PROFILE_BIT
#define EGL_CONTEXT_FLAGS_KHR
#define GL_CONTEXT_FLAGS
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
#define GL_CONTEXT_FLAG_DEBUG_BIT
#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR
typedef EGLBoolean(EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC)(EGLint max_devices
typedef EGLSurface(EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)(EGLDisplay dpy
EGLOutputLayerEXT EGLint EGLAttrib value
typedef EGLDisplay(EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum platform
Flags
#define qDebug
[1]
Definition: qlogging.h:177
#define qWarning
Definition: qlogging.h:179
typedef GLint(GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)(GLuint program
GLbitfield flags
GLuint name
GLfloat n
GLint GLsizei GLsizei GLenum format
GLenum func
Definition: qopenglext.h:663
GLdouble s
[6]
Definition: qopenglext.h:235
const GLint * attribs
Definition: qopenglext.h:11241
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
Definition: qpair.h:55
#define Q_ASSERT(cond)
Definition: qrandom.cpp:84