43 #include <qpa/qplatformwindow.h>
44 #include <QtGui/qopenglcontext.h>
45 #include <QtCore/qdebug.h>
48 #include <QtCore/private/qjnihelpers_p.h>
74 #ifndef EGL_CONTEXT_MINOR_VERSION_KHR
75 #define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB
77 #ifndef EGL_CONTEXT_FLAGS_KHR
78 #define EGL_CONTEXT_FLAGS_KHR 0x30FC
80 #ifndef EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR
81 #define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD
83 #ifndef EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR
84 #define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001
86 #ifndef EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR
87 #define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
89 #ifndef EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR
90 #define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
92 #ifndef EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR
93 #define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002
97 #ifndef GL_CONTEXT_FLAGS
98 #define GL_CONTEXT_FLAGS 0x821E
100 #ifndef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
101 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
103 #ifndef GL_CONTEXT_FLAG_DEBUG_BIT
104 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
106 #ifndef GL_CONTEXT_PROFILE_MASK
107 #define GL_CONTEXT_PROFILE_MASK 0x9126
109 #ifndef GL_CONTEXT_CORE_PROFILE_BIT
110 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
112 #ifndef GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
113 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
118 : m_eglDisplay(display)
120 , m_ownsContext(
true)
127 m_shareContext = share ?
static_cast<QEGLPlatformContext *
>(share)->m_eglContext :
nullptr;
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) {
135 contextAttrs.append(
format.minorVersion());
142 &&
format.majorVersion() >= 3
147 contextAttrs.append(
flags);
158 #ifdef EGL_EXT_protected_content
161 contextAttrs.append(EGL_PROTECTED_CONTENT_EXT);
162 contextAttrs.append(EGL_TRUE);
171 contextAttrs.append(EGL_ALPHA_MASK_SIZE);
172 contextAttrs.append(8);
175 contextAttrs.append(EGL_NONE);
176 m_contextAttrs = contextAttrs;
180 m_api = EGL_OPENVG_API;
182 #ifdef EGL_VERSION_1_4
184 m_api = EGL_OPENGL_API;
188 m_api = EGL_OPENGL_ES_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());
199 if (m_eglContext == EGL_NO_CONTEXT) {
200 qWarning(
"QEGLPlatformContext: Failed to create context: %x", eglGetError());
204 static const bool printConfig = qEnvironmentVariableIntValue(
"QT_QPA_EGLFS_DEBUG");
206 qDebug() <<
"Created context for format" <<
format <<
"with config:";
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);
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) {
236 eglQueryContext(m_eglDisplay,
context, EGL_CONFIG_ID, &
value);
239 const EGLint
attribs[] = { EGL_CONFIG_ID,
value, EGL_NONE };
240 if (eglChooseConfig(m_eglDisplay,
attribs, &cfg, 1, &
n) &&
n == 1) {
244 qWarning(
"QEGLPlatformContext: Failed to get framebuffer configuration for context");
249 eglQueryContext(m_eglDisplay,
context, EGL_CONTEXT_CLIENT_TYPE, &
value);
250 if (
value == EGL_OPENGL_API ||
value == EGL_OPENGL_ES_API) {
255 if (
value == EGL_OPENGL_ES_API)
260 qWarning(
"QEGLPlatformContext: Failed to get client API type");
261 m_api = EGL_OPENGL_ES_API;
265 m_shareContext = share ?
static_cast<QEGLPlatformContext *
>(share)->m_eglContext :
nullptr;
266 updateFormatFromGL();
271 if (m_eglContext != EGL_NO_CONTEXT)
272 updateFormatFromGL();
280 const EGLint pbufferAttributes[] = {
283 EGL_LARGEST_PBUFFER, EGL_FALSE,
292 return eglCreatePbufferSurface(m_eglDisplay,
config, pbufferAttributes);
297 eglDestroySurface(m_eglDisplay, surface);
306 void QEGLPlatformContext::updateFormatFromGL()
311 EGLDisplay prevDisplay = eglGetCurrentDisplay();
312 if (prevDisplay == EGL_NO_DISPLAY)
313 prevDisplay = m_eglDisplay;
314 EGLContext prevContext = eglGetCurrentContext();
315 EGLSurface prevSurfaceDraw = eglGetCurrentSurface(EGL_DRAW);
316 EGLSurface prevSurfaceRead = eglGetCurrentSurface(EGL_READ);
322 EGLContext tempContext = EGL_NO_CONTEXT;
326 EGLBoolean ok = eglMakeCurrent(m_eglDisplay, tempSurface, tempSurface, m_eglContext);
329 tempContext = eglCreateContext(m_eglDisplay,
config,
nullptr, m_contextAttrs.
constData());
330 if (tempContext != EGL_NO_CONTEXT)
331 ok = eglMakeCurrent(m_eglDisplay, tempSurface, tempSurface, tempContext);
336 const GLubyte *
s = glGetString(GL_VERSION);
346 m_format.
setOptions(QSurfaceFormat::FormatOptions());
370 eglMakeCurrent(prevDisplay, prevSurfaceDraw, prevSurfaceRead, prevContext);
372 qWarning(
"QEGLPlatformContext: Failed to make temporary surface current, format not updated (%x)", eglGetError());
374 if (tempSurface != EGL_NO_SURFACE)
376 if (tempContext != EGL_NO_CONTEXT)
377 eglDestroyContext(m_eglDisplay, tempContext);
390 if (eglGetCurrentContext() == m_eglContext &&
391 eglGetCurrentDisplay() == m_eglDisplay &&
392 eglGetCurrentSurface(EGL_READ) == eglSurface &&
393 eglGetCurrentSurface(EGL_DRAW) == eglSurface) {
397 const bool ok = eglMakeCurrent(m_eglDisplay, eglSurface, eglSurface, m_eglContext);
399 if (!m_swapIntervalEnvChecked) {
400 m_swapIntervalEnvChecked =
true;
401 if (qEnvironmentVariableIsSet(
"QT_QPA_EGLFS_SWAPINTERVAL")) {
402 QByteArray swapIntervalString = qgetenv(
"QT_QPA_EGLFS_SWAPINTERVAL");
404 const int swapInterval = swapIntervalString.
toInt(&intervalOk);
406 m_swapIntervalFromEnv = swapInterval;
409 const int requestedSwapInterval = m_swapIntervalFromEnv >= 0
410 ? m_swapIntervalFromEnv
412 if (requestedSwapInterval >= 0 && m_swapInterval != requestedSwapInterval) {
413 m_swapInterval = requestedSwapInterval;
414 if (eglSurface != EGL_NO_SURFACE)
415 eglSwapInterval(
eglDisplay(), m_swapInterval);
418 qWarning(
"QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
426 if (m_ownsContext && m_eglContext != EGL_NO_CONTEXT)
427 eglDestroyContext(m_eglDisplay, m_eglContext);
429 m_eglContext = EGL_NO_CONTEXT;
435 bool ok = eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
437 qWarning(
"QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
444 if (eglSurface != EGL_NO_SURFACE) {
445 bool ok = eglSwapBuffers(m_eglDisplay, eglSurface);
447 qWarning(
"QEGLPlatformContext: eglSwapBuffers failed: %x", eglGetError());
454 QFunctionPointer proc = (QFunctionPointer) eglGetProcAddress(procName);
455 #if !defined(Q_OS_WIN) && !defined(Q_OS_INTEGRITY)
457 proc = (QFunctionPointer) dlsym(RTLD_DEFAULT, procName);
458 #elif !defined(QT_OPENGL_DYNAMIC)
465 static struct StdFunc {
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 },
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 },
612 {
"glClearDepthf", (QFunctionPointer) ::glClearDepthf },
613 {
"glDepthRangef", (QFunctionPointer) ::glDepthRangef },
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 },
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 },
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 },
842 for (
size_t i = 0;
i <
sizeof(standardFuncs) /
sizeof(StdFunc); ++
i) {
844 proc = standardFuncs[
i].func;
small capitals from c petite p scientific i
[1]
The QByteArray class provides an array of bytes.
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
virtual void runGLChecks()
void doneCurrent() override
void swapBuffers(QPlatformSurface *surface) override
EGLContext eglContext() const
QFunctionPointer getProcAddress(const char *procName) override
bool makeCurrent(QPlatformSurface *surface) override
void initialize() override
virtual EGLSurface createTemporaryOffscreenSurface()
virtual EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface)=0
EGLConfig config() const override
const_pointer constData() const noexcept
void resize(qsizetype size)
void append(parameter_type t)
QOpenGLContext * context() const
static bool parseOpenGLVersion(const QByteArray &versionString, int &major, int &minor)
bool supportsOpenGL() const
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_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
typedef GLint(GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)(GLuint program
GLint GLsizei GLsizei GLenum format
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))