7#include <qpa/qplatformwindow.h>
8#include <QtGui/qopenglcontext.h>
9#include <QtCore/qdebug.h>
12#include <QtCore/private/qjnihelpers_p.h>
38#ifndef EGL_CONTEXT_MINOR_VERSION_KHR
39#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB
41#ifndef EGL_CONTEXT_FLAGS_KHR
42#define EGL_CONTEXT_FLAGS_KHR 0x30FC
44#ifndef EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR
45#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD
47#ifndef EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR
48#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001
50#ifndef EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR
51#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
53#ifndef EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR
54#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
56#ifndef EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR
57#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002
61#ifndef GL_CONTEXT_FLAGS
62#define GL_CONTEXT_FLAGS 0x821E
64#ifndef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
65#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
67#ifndef GL_CONTEXT_FLAG_DEBUG_BIT
68#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
70#ifndef GL_CONTEXT_PROFILE_MASK
71#define GL_CONTEXT_PROFILE_MASK 0x9126
73#ifndef GL_CONTEXT_CORE_PROFILE_BIT
74#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
76#ifndef GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
77#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
94 contextAttrs.
append(EGL_CONTEXT_CLIENT_VERSION);
96 const bool hasKHRCreateContext =
q_hasEglExtension(m_eglDisplay,
"EGL_KHR_create_context");
97 if (hasKHRCreateContext) {
106 &&
format.majorVersion() >= 3
122#ifdef EGL_EXT_protected_content
125 contextAttrs.
append(EGL_PROTECTED_CONTENT_EXT);
126 contextAttrs.
append(EGL_TRUE);
135 contextAttrs.
append(EGL_ALPHA_MASK_SIZE);
139 contextAttrs.
append(EGL_NONE);
140 m_contextAttrs = contextAttrs;
144 m_api = EGL_OPENVG_API;
146#ifdef EGL_VERSION_1_4
148 m_api = EGL_OPENGL_API;
152 m_api = EGL_OPENGL_ES_API;
157 m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, m_shareContext, contextAttrs.
constData());
158 if (m_eglContext == EGL_NO_CONTEXT && m_shareContext != EGL_NO_CONTEXT) {
159 m_shareContext =
nullptr;
160 m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig,
nullptr, contextAttrs.
constData());
163 if (m_eglContext == EGL_NO_CONTEXT) {
164 qWarning(
"QEGLPlatformContext: Failed to create context: %x", eglGetError());
170 qDebug() <<
"Created context for format" <<
format <<
"with config:";
174 if (printAllConfigs) {
175 EGLint numConfigs = 0;
176 eglGetConfigs(m_eglDisplay,
nullptr, 0, &numConfigs);
178 configs.
resize(numConfigs);
179 eglGetConfigs(m_eglDisplay, configs.
data(), numConfigs, &numConfigs);
180 qDebug(
"\nAll EGLConfigs: count=%d", numConfigs);
181 for (EGLint
i = 0;
i < numConfigs; ++
i) {
200 eglQueryContext(m_eglDisplay,
context, EGL_CONFIG_ID, &
value);
203 const EGLint
attribs[] = { EGL_CONFIG_ID,
value, EGL_NONE };
204 if (eglChooseConfig(m_eglDisplay,
attribs, &cfg, 1, &
n) &&
n == 1) {
208 qWarning(
"QEGLPlatformContext: Failed to get framebuffer configuration for context");
213 eglQueryContext(m_eglDisplay,
context, EGL_CONTEXT_CLIENT_TYPE, &
value);
214 if (
value == EGL_OPENGL_API ||
value == EGL_OPENGL_ES_API) {
219 if (
value == EGL_OPENGL_ES_API)
224 qWarning(
"QEGLPlatformContext: Failed to get client API type");
225 m_api = EGL_OPENGL_ES_API;
230 updateFormatFromGL();
235 if (m_eglContext != EGL_NO_CONTEXT)
236 updateFormatFromGL();
244 const EGLint pbufferAttributes[] = {
247 EGL_LARGEST_PBUFFER, EGL_FALSE,
256 return eglCreatePbufferSurface(m_eglDisplay,
config, pbufferAttributes);
261 eglDestroySurface(m_eglDisplay, surface);
270void QEGLPlatformContext::updateFormatFromGL()
275 EGLDisplay prevDisplay = eglGetCurrentDisplay();
276 if (prevDisplay == EGL_NO_DISPLAY)
277 prevDisplay = m_eglDisplay;
278 EGLContext prevContext = eglGetCurrentContext();
279 EGLSurface prevSurfaceDraw = eglGetCurrentSurface(EGL_DRAW);
280 EGLSurface prevSurfaceRead = eglGetCurrentSurface(EGL_READ);
286 EGLContext tempContext = EGL_NO_CONTEXT;
290 EGLBoolean ok = eglMakeCurrent(m_eglDisplay, tempSurface, tempSurface, m_eglContext);
293 tempContext = eglCreateContext(m_eglDisplay,
config,
nullptr, m_contextAttrs.
constData());
294 if (tempContext != EGL_NO_CONTEXT)
295 ok = eglMakeCurrent(m_eglDisplay, tempSurface, tempSurface, tempContext);
300 const GLubyte *
s = glGetString(GL_VERSION);
310 m_format.
setOptions(QSurfaceFormat::FormatOptions());
334 eglMakeCurrent(prevDisplay, prevSurfaceDraw, prevSurfaceRead, prevContext);
336 qWarning(
"QEGLPlatformContext: Failed to make temporary surface current, format not updated (%x)", eglGetError());
338 if (tempSurface != EGL_NO_SURFACE)
340 if (tempContext != EGL_NO_CONTEXT)
341 eglDestroyContext(m_eglDisplay, tempContext);
354 if (eglGetCurrentContext() == m_eglContext &&
355 eglGetCurrentDisplay() == m_eglDisplay &&
356 eglGetCurrentSurface(EGL_READ) == eglSurface &&
357 eglGetCurrentSurface(EGL_DRAW) == eglSurface) {
361 const bool ok = eglMakeCurrent(m_eglDisplay, eglSurface, eglSurface, m_eglContext);
363 if (!m_swapIntervalEnvChecked) {
364 m_swapIntervalEnvChecked =
true;
368 const int swapInterval = swapIntervalString.
toInt(&intervalOk);
370 m_swapIntervalFromEnv = swapInterval;
373 const int requestedSwapInterval = m_swapIntervalFromEnv >= 0
374 ? m_swapIntervalFromEnv
376 if (requestedSwapInterval >= 0 && m_swapInterval != requestedSwapInterval) {
377 m_swapInterval = requestedSwapInterval;
378 if (eglSurface != EGL_NO_SURFACE)
379 eglSwapInterval(
eglDisplay(), m_swapInterval);
382 qWarning(
"QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
390 if (m_ownsContext && m_eglContext != EGL_NO_CONTEXT)
391 eglDestroyContext(m_eglDisplay, m_eglContext);
393 m_eglContext = EGL_NO_CONTEXT;
399 bool ok = eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
401 qWarning(
"QEGLPlatformContext: eglMakeCurrent failed: %x", eglGetError());
408 if (eglSurface != EGL_NO_SURFACE) {
409 bool ok = eglSwapBuffers(m_eglDisplay, eglSurface);
411 qWarning(
"QEGLPlatformContext: eglSwapBuffers failed: %x", eglGetError());
418 QFunctionPointer proc = (QFunctionPointer) eglGetProcAddress(procName);
419#if !defined(Q_OS_WIN) && !defined(Q_OS_INTEGRITY)
421 proc = (QFunctionPointer) dlsym(RTLD_DEFAULT, procName);
422#elif !defined(QT_OPENGL_DYNAMIC)
429 static struct StdFunc {
431 QFunctionPointer
func;
432 } standardFuncs[] = {
433#if QT_CONFIG(opengles2)
434 {
"glBindTexture", (QFunctionPointer) ::glBindTexture },
435 {
"glBlendFunc", (QFunctionPointer) ::glBlendFunc },
436 {
"glClear", (QFunctionPointer) ::glClear },
437 {
"glClearColor", (QFunctionPointer) ::glClearColor },
438 {
"glClearStencil", (QFunctionPointer) ::glClearStencil },
439 {
"glColorMask", (QFunctionPointer) ::glColorMask },
440 {
"glCopyTexImage2D", (QFunctionPointer) ::glCopyTexImage2D },
441 {
"glCopyTexSubImage2D", (QFunctionPointer) ::glCopyTexSubImage2D },
442 {
"glCullFace", (QFunctionPointer) ::glCullFace },
443 {
"glDeleteTextures", (QFunctionPointer) ::glDeleteTextures },
444 {
"glDepthFunc", (QFunctionPointer) ::glDepthFunc },
445 {
"glDepthMask", (QFunctionPointer) ::glDepthMask },
446 {
"glDisable", (QFunctionPointer) ::glDisable },
447 {
"glDrawArrays", (QFunctionPointer) ::glDrawArrays },
448 {
"glDrawElements", (QFunctionPointer) ::glDrawElements },
449 {
"glEnable", (QFunctionPointer) ::glEnable },
450 {
"glFinish", (QFunctionPointer) ::glFinish },
451 {
"glFlush", (QFunctionPointer) ::glFlush },
452 {
"glFrontFace", (QFunctionPointer) ::glFrontFace },
453 {
"glGenTextures", (QFunctionPointer) ::glGenTextures },
454 {
"glGetBooleanv", (QFunctionPointer) ::glGetBooleanv },
455 {
"glGetError", (QFunctionPointer) ::glGetError },
456 {
"glGetFloatv", (QFunctionPointer) ::glGetFloatv },
457 {
"glGetIntegerv", (QFunctionPointer) ::glGetIntegerv },
458 {
"glGetString", (QFunctionPointer) ::glGetString },
459 {
"glGetTexParameterfv", (QFunctionPointer) ::glGetTexParameterfv },
460 {
"glGetTexParameteriv", (QFunctionPointer) ::glGetTexParameteriv },
461 {
"glHint", (QFunctionPointer) ::glHint },
462 {
"glIsEnabled", (QFunctionPointer) ::glIsEnabled },
463 {
"glIsTexture", (QFunctionPointer) ::glIsTexture },
464 {
"glLineWidth", (QFunctionPointer) ::glLineWidth },
465 {
"glPixelStorei", (QFunctionPointer) ::glPixelStorei },
466 {
"glPolygonOffset", (QFunctionPointer) ::glPolygonOffset },
467 {
"glReadPixels", (QFunctionPointer) ::glReadPixels },
468 {
"glScissor", (QFunctionPointer) ::glScissor },
469 {
"glStencilFunc", (QFunctionPointer) ::glStencilFunc },
470 {
"glStencilMask", (QFunctionPointer) ::glStencilMask },
471 {
"glStencilOp", (QFunctionPointer) ::glStencilOp },
472 {
"glTexImage2D", (QFunctionPointer) ::glTexImage2D },
473 {
"glTexParameterf", (QFunctionPointer) ::glTexParameterf },
474 {
"glTexParameterfv", (QFunctionPointer) ::glTexParameterfv },
475 {
"glTexParameteri", (QFunctionPointer) ::glTexParameteri },
476 {
"glTexParameteriv", (QFunctionPointer) ::glTexParameteriv },
477 {
"glTexSubImage2D", (QFunctionPointer) ::glTexSubImage2D },
478 {
"glViewport", (QFunctionPointer) ::glViewport },
480 {
"glActiveTexture", (QFunctionPointer) ::glActiveTexture },
481 {
"glAttachShader", (QFunctionPointer) ::glAttachShader },
482 {
"glBindAttribLocation", (QFunctionPointer) ::glBindAttribLocation },
483 {
"glBindBuffer", (QFunctionPointer) ::glBindBuffer },
484 {
"glBindFramebuffer", (QFunctionPointer) ::glBindFramebuffer },
485 {
"glBindRenderbuffer", (QFunctionPointer) ::glBindRenderbuffer },
486 {
"glBlendColor", (QFunctionPointer) ::glBlendColor },
487 {
"glBlendEquation", (QFunctionPointer) ::glBlendEquation },
488 {
"glBlendEquationSeparate", (QFunctionPointer) ::glBlendEquationSeparate },
489 {
"glBlendFuncSeparate", (QFunctionPointer) ::glBlendFuncSeparate },
490 {
"glBufferData", (QFunctionPointer) ::glBufferData },
491 {
"glBufferSubData", (QFunctionPointer) ::glBufferSubData },
492 {
"glCheckFramebufferStatus", (QFunctionPointer) ::glCheckFramebufferStatus },
493 {
"glCompileShader", (QFunctionPointer) ::glCompileShader },
494 {
"glCompressedTexImage2D", (QFunctionPointer) ::glCompressedTexImage2D },
495 {
"glCompressedTexSubImage2D", (QFunctionPointer) ::glCompressedTexSubImage2D },
496 {
"glCreateProgram", (QFunctionPointer) ::glCreateProgram },
497 {
"glCreateShader", (QFunctionPointer) ::glCreateShader },
498 {
"glDeleteBuffers", (QFunctionPointer) ::glDeleteBuffers },
499 {
"glDeleteFramebuffers", (QFunctionPointer) ::glDeleteFramebuffers },
500 {
"glDeleteProgram", (QFunctionPointer) ::glDeleteProgram },
501 {
"glDeleteRenderbuffers", (QFunctionPointer) ::glDeleteRenderbuffers },
502 {
"glDeleteShader", (QFunctionPointer) ::glDeleteShader },
503 {
"glDetachShader", (QFunctionPointer) ::glDetachShader },
504 {
"glDisableVertexAttribArray", (QFunctionPointer) ::glDisableVertexAttribArray },
505 {
"glEnableVertexAttribArray", (QFunctionPointer) ::glEnableVertexAttribArray },
506 {
"glFramebufferRenderbuffer", (QFunctionPointer) ::glFramebufferRenderbuffer },
507 {
"glFramebufferTexture2D", (QFunctionPointer) ::glFramebufferTexture2D },
508 {
"glGenBuffers", (QFunctionPointer) ::glGenBuffers },
509 {
"glGenerateMipmap", (QFunctionPointer) ::glGenerateMipmap },
510 {
"glGenFramebuffers", (QFunctionPointer) ::glGenFramebuffers },
511 {
"glGenRenderbuffers", (QFunctionPointer) ::glGenRenderbuffers },
512 {
"glGetActiveAttrib", (QFunctionPointer) ::glGetActiveAttrib },
513 {
"glGetActiveUniform", (QFunctionPointer) ::glGetActiveUniform },
514 {
"glGetAttachedShaders", (QFunctionPointer) ::glGetAttachedShaders },
515 {
"glGetAttribLocation", (QFunctionPointer) ::glGetAttribLocation },
516 {
"glGetBufferParameteriv", (QFunctionPointer) ::glGetBufferParameteriv },
517 {
"glGetFramebufferAttachmentParameteriv", (QFunctionPointer) ::glGetFramebufferAttachmentParameteriv },
518 {
"glGetProgramiv", (QFunctionPointer) ::glGetProgramiv },
519 {
"glGetProgramInfoLog", (QFunctionPointer) ::glGetProgramInfoLog },
520 {
"glGetRenderbufferParameteriv", (QFunctionPointer) ::glGetRenderbufferParameteriv },
521 {
"glGetShaderiv", (QFunctionPointer) ::glGetShaderiv },
522 {
"glGetShaderInfoLog", (QFunctionPointer) ::glGetShaderInfoLog },
523 {
"glGetShaderPrecisionFormat", (QFunctionPointer) ::glGetShaderPrecisionFormat },
524 {
"glGetShaderSource", (QFunctionPointer) ::glGetShaderSource },
525 {
"glGetUniformfv", (QFunctionPointer) ::glGetUniformfv },
526 {
"glGetUniformiv", (QFunctionPointer) ::glGetUniformiv },
527 {
"glGetUniformLocation", (QFunctionPointer) ::glGetUniformLocation },
528 {
"glGetVertexAttribfv", (QFunctionPointer) ::glGetVertexAttribfv },
529 {
"glGetVertexAttribiv", (QFunctionPointer) ::glGetVertexAttribiv },
530 {
"glGetVertexAttribPointerv", (QFunctionPointer) ::glGetVertexAttribPointerv },
531 {
"glIsBuffer", (QFunctionPointer) ::glIsBuffer },
532 {
"glIsFramebuffer", (QFunctionPointer) ::glIsFramebuffer },
533 {
"glIsProgram", (QFunctionPointer) ::glIsProgram },
534 {
"glIsRenderbuffer", (QFunctionPointer) ::glIsRenderbuffer },
535 {
"glIsShader", (QFunctionPointer) ::glIsShader },
536 {
"glLinkProgram", (QFunctionPointer) ::glLinkProgram },
537 {
"glReleaseShaderCompiler", (QFunctionPointer) ::glReleaseShaderCompiler },
538 {
"glRenderbufferStorage", (QFunctionPointer) ::glRenderbufferStorage },
539 {
"glSampleCoverage", (QFunctionPointer) ::glSampleCoverage },
540 {
"glShaderBinary", (QFunctionPointer) ::glShaderBinary },
541 {
"glShaderSource", (QFunctionPointer) ::glShaderSource },
542 {
"glStencilFuncSeparate", (QFunctionPointer) ::glStencilFuncSeparate },
543 {
"glStencilMaskSeparate", (QFunctionPointer) ::glStencilMaskSeparate },
544 {
"glStencilOpSeparate", (QFunctionPointer) ::glStencilOpSeparate },
545 {
"glUniform1f", (QFunctionPointer) ::glUniform1f },
546 {
"glUniform1fv", (QFunctionPointer) ::glUniform1fv },
547 {
"glUniform1i", (QFunctionPointer) ::glUniform1i },
548 {
"glUniform1iv", (QFunctionPointer) ::glUniform1iv },
549 {
"glUniform2f", (QFunctionPointer) ::glUniform2f },
550 {
"glUniform2fv", (QFunctionPointer) ::glUniform2fv },
551 {
"glUniform2i", (QFunctionPointer) ::glUniform2i },
552 {
"glUniform2iv", (QFunctionPointer) ::glUniform2iv },
553 {
"glUniform3f", (QFunctionPointer) ::glUniform3f },
554 {
"glUniform3fv", (QFunctionPointer) ::glUniform3fv },
555 {
"glUniform3i", (QFunctionPointer) ::glUniform3i },
556 {
"glUniform3iv", (QFunctionPointer) ::glUniform3iv },
557 {
"glUniform4f", (QFunctionPointer) ::glUniform4f },
558 {
"glUniform4fv", (QFunctionPointer) ::glUniform4fv },
559 {
"glUniform4i", (QFunctionPointer) ::glUniform4i },
560 {
"glUniform4iv", (QFunctionPointer) ::glUniform4iv },
561 {
"glUniformMatrix2fv", (QFunctionPointer) ::glUniformMatrix2fv },
562 {
"glUniformMatrix3fv", (QFunctionPointer) ::glUniformMatrix3fv },
563 {
"glUniformMatrix4fv", (QFunctionPointer) ::glUniformMatrix4fv },
564 {
"glUseProgram", (QFunctionPointer) ::glUseProgram },
565 {
"glValidateProgram", (QFunctionPointer) ::glValidateProgram },
566 {
"glVertexAttrib1f", (QFunctionPointer) ::glVertexAttrib1f },
567 {
"glVertexAttrib1fv", (QFunctionPointer) ::glVertexAttrib1fv },
568 {
"glVertexAttrib2f", (QFunctionPointer) ::glVertexAttrib2f },
569 {
"glVertexAttrib2fv", (QFunctionPointer) ::glVertexAttrib2fv },
570 {
"glVertexAttrib3f", (QFunctionPointer) ::glVertexAttrib3f },
571 {
"glVertexAttrib3fv", (QFunctionPointer) ::glVertexAttrib3fv },
572 {
"glVertexAttrib4f", (QFunctionPointer) ::glVertexAttrib4f },
573 {
"glVertexAttrib4fv", (QFunctionPointer) ::glVertexAttrib4fv },
574 {
"glVertexAttribPointer", (QFunctionPointer) ::glVertexAttribPointer },
576 {
"glClearDepthf", (QFunctionPointer) ::glClearDepthf },
577 {
"glDepthRangef", (QFunctionPointer) ::glDepthRangef },
580#if QT_CONFIG(opengles3)
581 {
"glBeginQuery", (QFunctionPointer) ::glBeginQuery },
582 {
"glBeginTransformFeedback", (QFunctionPointer) ::glBeginTransformFeedback },
583 {
"glBindBufferBase", (QFunctionPointer) ::glBindBufferBase },
584 {
"glBindBufferRange", (QFunctionPointer) ::glBindBufferRange },
585 {
"glBindSampler", (QFunctionPointer) ::glBindSampler },
586 {
"glBindTransformFeedback", (QFunctionPointer) ::glBindTransformFeedback },
587 {
"glBindVertexArray", (QFunctionPointer) ::glBindVertexArray },
588 {
"glBlitFramebuffer", (QFunctionPointer) ::glBlitFramebuffer },
589 {
"glClearBufferfi", (QFunctionPointer) ::glClearBufferfi },
590 {
"glClearBufferfv", (QFunctionPointer) ::glClearBufferfv },
591 {
"glClearBufferiv", (QFunctionPointer) ::glClearBufferiv },
592 {
"glClearBufferuiv", (QFunctionPointer) ::glClearBufferuiv },
593 {
"glClientWaitSync", (QFunctionPointer) ::glClientWaitSync },
594 {
"glCompressedTexImage3D", (QFunctionPointer) ::glCompressedTexImage3D },
595 {
"glCompressedTexSubImage3D", (QFunctionPointer) ::glCompressedTexSubImage3D },
596 {
"glCopyBufferSubData", (QFunctionPointer) ::glCopyBufferSubData },
597 {
"glCopyTexSubImage3D", (QFunctionPointer) ::glCopyTexSubImage3D },
598 {
"glDeleteQueries", (QFunctionPointer) ::glDeleteQueries },
599 {
"glDeleteSamplers", (QFunctionPointer) ::glDeleteSamplers },
600 {
"glDeleteSync", (QFunctionPointer) ::glDeleteSync },
601 {
"glDeleteTransformFeedbacks", (QFunctionPointer) ::glDeleteTransformFeedbacks },
602 {
"glDeleteVertexArrays", (QFunctionPointer) ::glDeleteVertexArrays },
603 {
"glDrawArraysInstanced", (QFunctionPointer) ::glDrawArraysInstanced },
604 {
"glDrawBuffers", (QFunctionPointer) ::glDrawBuffers },
605 {
"glDrawElementsInstanced", (QFunctionPointer) ::glDrawElementsInstanced },
606 {
"glDrawRangeElements", (QFunctionPointer) ::glDrawRangeElements },
607 {
"glEndQuery", (QFunctionPointer) ::glEndQuery },
608 {
"glEndTransformFeedback", (QFunctionPointer) ::glEndTransformFeedback },
609 {
"glFenceSync", (QFunctionPointer) ::glFenceSync },
610 {
"glFlushMappedBufferRange", (QFunctionPointer) ::glFlushMappedBufferRange },
611 {
"glFramebufferTextureLayer", (QFunctionPointer) ::glFramebufferTextureLayer },
612 {
"glGenQueries", (QFunctionPointer) ::glGenQueries },
613 {
"glGenSamplers", (QFunctionPointer) ::glGenSamplers },
614 {
"glGenTransformFeedbacks", (QFunctionPointer) ::glGenTransformFeedbacks },
615 {
"glGenVertexArrays", (QFunctionPointer) ::glGenVertexArrays },
616 {
"glGetActiveUniformBlockName", (QFunctionPointer) ::glGetActiveUniformBlockName },
617 {
"glGetActiveUniformBlockiv", (QFunctionPointer) ::glGetActiveUniformBlockiv },
618 {
"glGetActiveUniformsiv", (QFunctionPointer) ::glGetActiveUniformsiv },
619 {
"glGetBufferParameteri64v", (QFunctionPointer) ::glGetBufferParameteri64v },
620 {
"glGetBufferPointerv", (QFunctionPointer) ::glGetBufferPointerv },
621 {
"glGetFragDataLocation", (QFunctionPointer) ::glGetFragDataLocation },
622 {
"glGetInteger64i_v", (QFunctionPointer) ::glGetInteger64i_v },
623 {
"glGetInteger64v", (QFunctionPointer) ::glGetInteger64v },
624 {
"glGetIntegeri_v", (QFunctionPointer) ::glGetIntegeri_v },
625 {
"glGetInternalformativ", (QFunctionPointer) ::glGetInternalformativ },
626 {
"glGetProgramBinary", (QFunctionPointer) ::glGetProgramBinary },
627 {
"glGetQueryObjectuiv", (QFunctionPointer) ::glGetQueryObjectuiv },
628 {
"glGetQueryiv", (QFunctionPointer) ::glGetQueryiv },
629 {
"glGetSamplerParameterfv", (QFunctionPointer) ::glGetSamplerParameterfv },
630 {
"glGetSamplerParameteriv", (QFunctionPointer) ::glGetSamplerParameteriv },
631 {
"glGetStringi", (QFunctionPointer) ::glGetStringi },
632 {
"glGetSynciv", (QFunctionPointer) ::glGetSynciv },
633 {
"glGetTransformFeedbackVarying", (QFunctionPointer) ::glGetTransformFeedbackVarying },
634 {
"glGetUniformBlockIndex", (QFunctionPointer) ::glGetUniformBlockIndex },
635 {
"glGetUniformIndices", (QFunctionPointer) ::glGetUniformIndices },
636 {
"glGetUniformuiv", (QFunctionPointer) ::glGetUniformuiv },
637 {
"glGetVertexAttribIiv", (QFunctionPointer) ::glGetVertexAttribIiv },
638 {
"glGetVertexAttribIuiv", (QFunctionPointer) ::glGetVertexAttribIuiv },
639 {
"glInvalidateFramebuffer", (QFunctionPointer) ::glInvalidateFramebuffer },
640 {
"glInvalidateSubFramebuffer", (QFunctionPointer) ::glInvalidateSubFramebuffer },
641 {
"glIsQuery", (QFunctionPointer) ::glIsQuery },
642 {
"glIsSampler", (QFunctionPointer) ::glIsSampler },
643 {
"glIsSync", (QFunctionPointer) ::glIsSync },
644 {
"glIsTransformFeedback", (QFunctionPointer) ::glIsTransformFeedback },
645 {
"glIsVertexArray", (QFunctionPointer) ::glIsVertexArray },
646 {
"glMapBufferRange", (QFunctionPointer) ::glMapBufferRange },
647 {
"glPauseTransformFeedback", (QFunctionPointer) ::glPauseTransformFeedback },
648 {
"glProgramBinary", (QFunctionPointer) ::glProgramBinary },
649 {
"glProgramParameteri", (QFunctionPointer) ::glProgramParameteri },
650 {
"glReadBuffer", (QFunctionPointer) ::glReadBuffer },
651 {
"glRenderbufferStorageMultisample", (QFunctionPointer) ::glRenderbufferStorageMultisample },
652 {
"glResumeTransformFeedback", (QFunctionPointer) ::glResumeTransformFeedback },
653 {
"glSamplerParameterf", (QFunctionPointer) ::glSamplerParameterf },
654 {
"glSamplerParameterfv", (QFunctionPointer) ::glSamplerParameterfv },
655 {
"glSamplerParameteri", (QFunctionPointer) ::glSamplerParameteri },
656 {
"glSamplerParameteriv", (QFunctionPointer) ::glSamplerParameteriv },
657 {
"glTexImage3D", (QFunctionPointer) ::glTexImage3D },
658 {
"glTexStorage2D", (QFunctionPointer) ::glTexStorage2D },
659 {
"glTexStorage3D", (QFunctionPointer) ::glTexStorage3D },
660 {
"glTexSubImage3D", (QFunctionPointer) ::glTexSubImage3D },
661 {
"glTransformFeedbackVaryings", (QFunctionPointer) ::glTransformFeedbackVaryings },
662 {
"glUniform1ui", (QFunctionPointer) ::glUniform1ui },
663 {
"glUniform1uiv", (QFunctionPointer) ::glUniform1uiv },
664 {
"glUniform2ui", (QFunctionPointer) ::glUniform2ui },
665 {
"glUniform2uiv", (QFunctionPointer) ::glUniform2uiv },
666 {
"glUniform3ui", (QFunctionPointer) ::glUniform3ui },
667 {
"glUniform3uiv", (QFunctionPointer) ::glUniform3uiv },
668 {
"glUniform4ui", (QFunctionPointer) ::glUniform4ui },
669 {
"glUniform4uiv", (QFunctionPointer) ::glUniform4uiv },
670 {
"glUniformBlockBinding", (QFunctionPointer) ::glUniformBlockBinding },
671 {
"glUniformMatrix2x3fv", (QFunctionPointer) ::glUniformMatrix2x3fv },
672 {
"glUniformMatrix2x4fv", (QFunctionPointer) ::glUniformMatrix2x4fv },
673 {
"glUniformMatrix3x2fv", (QFunctionPointer) ::glUniformMatrix3x2fv },
674 {
"glUniformMatrix3x4fv", (QFunctionPointer) ::glUniformMatrix3x4fv },
675 {
"glUniformMatrix4x2fv", (QFunctionPointer) ::glUniformMatrix4x2fv },
676 {
"glUniformMatrix4x3fv", (QFunctionPointer) ::glUniformMatrix4x3fv },
677 {
"glUnmapBuffer", (QFunctionPointer) ::glUnmapBuffer },
678 {
"glVertexAttribDivisor", (QFunctionPointer) ::glVertexAttribDivisor },
679 {
"glVertexAttribI4i", (QFunctionPointer) ::glVertexAttribI4i },
680 {
"glVertexAttribI4iv", (QFunctionPointer) ::glVertexAttribI4iv },
681 {
"glVertexAttribI4ui", (QFunctionPointer) ::glVertexAttribI4ui },
682 {
"glVertexAttribI4uiv", (QFunctionPointer) ::glVertexAttribI4uiv },
683 {
"glVertexAttribIPointer", (QFunctionPointer) ::glVertexAttribIPointer },
684 {
"glWaitSync", (QFunctionPointer) ::glWaitSync },
687#if QT_CONFIG(opengles31)
688 {
"glActiveShaderProgram", (QFunctionPointer) ::glActiveShaderProgram },
689 {
"glBindImageTexture", (QFunctionPointer) ::glBindImageTexture },
690 {
"glBindProgramPipeline", (QFunctionPointer) ::glBindProgramPipeline },
691 {
"glBindVertexBuffer", (QFunctionPointer) ::glBindVertexBuffer },
692 {
"glCreateShaderProgramv", (QFunctionPointer) ::glCreateShaderProgramv },
693 {
"glDeleteProgramPipelines", (QFunctionPointer) ::glDeleteProgramPipelines },
694 {
"glDispatchCompute", (QFunctionPointer) ::glDispatchCompute },
695 {
"glDispatchComputeIndirect", (QFunctionPointer) ::glDispatchComputeIndirect },
696 {
"glDrawArraysIndirect", (QFunctionPointer) ::glDrawArraysIndirect },
697 {
"glDrawElementsIndirect", (QFunctionPointer) ::glDrawElementsIndirect },
698 {
"glFramebufferParameteri", (QFunctionPointer) ::glFramebufferParameteri },
699 {
"glGenProgramPipelines", (QFunctionPointer) ::glGenProgramPipelines },
700 {
"glGetBooleani_v", (QFunctionPointer) ::glGetBooleani_v },
701 {
"glGetFramebufferParameteriv", (QFunctionPointer) ::glGetFramebufferParameteriv },
702 {
"glGetMultisamplefv", (QFunctionPointer) ::glGetMultisamplefv },
703 {
"glGetProgramInterfaceiv", (QFunctionPointer) ::glGetProgramInterfaceiv },
704 {
"glGetProgramPipelineInfoLog", (QFunctionPointer) ::glGetProgramPipelineInfoLog },
705 {
"glGetProgramPipelineiv", (QFunctionPointer) ::glGetProgramPipelineiv },
706 {
"glGetProgramResourceIndex", (QFunctionPointer) ::glGetProgramResourceIndex },
707 {
"glGetProgramResourceLocation", (QFunctionPointer) ::glGetProgramResourceLocation },
708 {
"glGetProgramResourceName", (QFunctionPointer) ::glGetProgramResourceName },
709 {
"glGetProgramResourceiv", (QFunctionPointer) ::glGetProgramResourceiv },
710 {
"glGetTexLevelParameterfv", (QFunctionPointer) ::glGetTexLevelParameterfv },
711 {
"glGetTexLevelParameteriv", (QFunctionPointer) ::glGetTexLevelParameteriv },
712 {
"glIsProgramPipeline", (QFunctionPointer) ::glIsProgramPipeline },
713 {
"glMemoryBarrier", (QFunctionPointer) ::glMemoryBarrier },
714 {
"glMemoryBarrierByRegion", (QFunctionPointer) ::glMemoryBarrierByRegion },
715 {
"glProgramUniform1f", (QFunctionPointer) ::glProgramUniform1f },
716 {
"glProgramUniform1fv", (QFunctionPointer) ::glProgramUniform1fv },
717 {
"glProgramUniform1i", (QFunctionPointer) ::glProgramUniform1i },
718 {
"glProgramUniform1iv", (QFunctionPointer) ::glProgramUniform1iv },
719 {
"glProgramUniform1ui", (QFunctionPointer) ::glProgramUniform1ui },
720 {
"glProgramUniform1uiv", (QFunctionPointer) ::glProgramUniform1uiv },
721 {
"glProgramUniform2f", (QFunctionPointer) ::glProgramUniform2f },
722 {
"glProgramUniform2fv", (QFunctionPointer) ::glProgramUniform2fv },
723 {
"glProgramUniform2i", (QFunctionPointer) ::glProgramUniform2i },
724 {
"glProgramUniform2iv", (QFunctionPointer) ::glProgramUniform2iv },
725 {
"glProgramUniform2ui", (QFunctionPointer) ::glProgramUniform2ui },
726 {
"glProgramUniform2uiv", (QFunctionPointer) ::glProgramUniform2uiv },
727 {
"glProgramUniform3f", (QFunctionPointer) ::glProgramUniform3f },
728 {
"glProgramUniform3fv", (QFunctionPointer) ::glProgramUniform3fv },
729 {
"glProgramUniform3i", (QFunctionPointer) ::glProgramUniform3i },
730 {
"glProgramUniform3iv", (QFunctionPointer) ::glProgramUniform3iv },
731 {
"glProgramUniform3ui", (QFunctionPointer) ::glProgramUniform3ui },
732 {
"glProgramUniform3uiv", (QFunctionPointer) ::glProgramUniform3uiv },
733 {
"glProgramUniform4f", (QFunctionPointer) ::glProgramUniform4f },
734 {
"glProgramUniform4fv", (QFunctionPointer) ::glProgramUniform4fv },
735 {
"glProgramUniform4i", (QFunctionPointer) ::glProgramUniform4i },
736 {
"glProgramUniform4iv", (QFunctionPointer) ::glProgramUniform4iv },
737 {
"glProgramUniform4ui", (QFunctionPointer) ::glProgramUniform4ui },
738 {
"glProgramUniform4uiv", (QFunctionPointer) ::glProgramUniform4uiv },
739 {
"glProgramUniformMatrix2fv", (QFunctionPointer) ::glProgramUniformMatrix2fv },
740 {
"glProgramUniformMatrix2x3fv", (QFunctionPointer) ::glProgramUniformMatrix2x3fv },
741 {
"glProgramUniformMatrix2x4fv", (QFunctionPointer) ::glProgramUniformMatrix2x4fv },
742 {
"glProgramUniformMatrix3fv", (QFunctionPointer) ::glProgramUniformMatrix3fv },
743 {
"glProgramUniformMatrix3x2fv", (QFunctionPointer) ::glProgramUniformMatrix3x2fv },
744 {
"glProgramUniformMatrix3x4fv", (QFunctionPointer) ::glProgramUniformMatrix3x4fv },
745 {
"glProgramUniformMatrix4fv", (QFunctionPointer) ::glProgramUniformMatrix4fv },
746 {
"glProgramUniformMatrix4x2fv", (QFunctionPointer) ::glProgramUniformMatrix4x2fv },
747 {
"glProgramUniformMatrix4x3fv", (QFunctionPointer) ::glProgramUniformMatrix4x3fv },
748 {
"glSampleMaski", (QFunctionPointer) ::glSampleMaski },
749 {
"glTexStorage2DMultisample", (QFunctionPointer) ::glTexStorage2DMultisample },
750 {
"glUseProgramStages", (QFunctionPointer) ::glUseProgramStages },
751 {
"glValidateProgramPipeline", (QFunctionPointer) ::glValidateProgramPipeline },
752 {
"glVertexAttribBinding", (QFunctionPointer) ::glVertexAttribBinding },
753 {
"glVertexAttribFormat", (QFunctionPointer) ::glVertexAttribFormat },
754 {
"glVertexAttribIFormat", (QFunctionPointer) ::glVertexAttribIFormat },
755 {
"glVertexBindingDivisor", (QFunctionPointer) ::glVertexBindingDivisor },
758#if QT_CONFIG(opengles32)
759 {
"glBlendBarrier", (QFunctionPointer) ::glBlendBarrier },
760 {
"glCopyImageSubData", (QFunctionPointer) ::glCopyImageSubData },
761 {
"glDebugMessageControl", (QFunctionPointer) ::glDebugMessageControl },
762 {
"glDebugMessageInsert", (QFunctionPointer) ::glDebugMessageInsert },
763 {
"glDebugMessageCallback", (QFunctionPointer) ::glDebugMessageCallback },
764 {
"glGetDebugMessageLog", (QFunctionPointer) ::glGetDebugMessageLog },
765 {
"glPushDebugGroup", (QFunctionPointer) ::glPushDebugGroup },
766 {
"glPopDebugGroup", (QFunctionPointer) ::glPopDebugGroup },
767 {
"glObjectLabel", (QFunctionPointer) ::glObjectLabel },
768 {
"glGetObjectLabel", (QFunctionPointer) ::glGetObjectLabel },
769 {
"glObjectPtrLabel", (QFunctionPointer) ::glObjectPtrLabel },
770 {
"glGetObjectPtrLabel", (QFunctionPointer) ::glGetObjectPtrLabel },
771 {
"glGetPointerv", (QFunctionPointer) ::glGetPointerv },
772 {
"glEnablei", (QFunctionPointer) ::glEnablei },
773 {
"glDisablei", (QFunctionPointer) ::glDisablei },
774 {
"glBlendEquationi", (QFunctionPointer) ::glBlendEquationi },
775 {
"glBlendEquationSeparatei", (QFunctionPointer) ::glBlendEquationSeparatei },
776 {
"glBlendFunci", (QFunctionPointer) ::glBlendFunci },
777 {
"glBlendFuncSeparatei", (QFunctionPointer) ::glBlendFuncSeparatei },
778 {
"glColorMaski", (QFunctionPointer) ::glColorMaski },
779 {
"glIsEnabledi", (QFunctionPointer) ::glIsEnabledi },
780 {
"glDrawElementsBaseVertex", (QFunctionPointer) ::glDrawElementsBaseVertex },
781 {
"glDrawRangeElementsBaseVertex", (QFunctionPointer) ::glDrawRangeElementsBaseVertex },
782 {
"glDrawElementsInstancedBaseVertex", (QFunctionPointer) ::glDrawElementsInstancedBaseVertex },
783 {
"glFramebufferTexture", (QFunctionPointer) ::glFramebufferTexture },
784 {
"glPrimitiveBoundingBox", (QFunctionPointer) ::glPrimitiveBoundingBox },
785 {
"glGetGraphicsResetStatus", (QFunctionPointer) ::glGetGraphicsResetStatus },
786 {
"glReadnPixels", (QFunctionPointer) ::glReadnPixels },
787 {
"glGetnUniformfv", (QFunctionPointer) ::glGetnUniformfv },
788 {
"glGetnUniformiv", (QFunctionPointer) ::glGetnUniformiv },
789 {
"glGetnUniformuiv", (QFunctionPointer) ::glGetnUniformuiv },
790 {
"glMinSampleShading", (QFunctionPointer) ::glMinSampleShading },
791 {
"glPatchParameteri", (QFunctionPointer) ::glPatchParameteri },
792 {
"glTexParameterIiv", (QFunctionPointer) ::glTexParameterIiv },
793 {
"glTexParameterIuiv", (QFunctionPointer) ::glTexParameterIuiv },
794 {
"glGetTexParameterIiv", (QFunctionPointer) ::glGetTexParameterIiv },
795 {
"glGetTexParameterIuiv", (QFunctionPointer) ::glGetTexParameterIuiv },
796 {
"glSamplerParameterIiv", (QFunctionPointer) ::glSamplerParameterIiv },
797 {
"glSamplerParameterIuiv", (QFunctionPointer) ::glSamplerParameterIuiv },
798 {
"glGetSamplerParameterIiv", (QFunctionPointer) ::glGetSamplerParameterIiv },
799 {
"glGetSamplerParameterIuiv", (QFunctionPointer) ::glGetSamplerParameterIuiv },
800 {
"glTexBuffer", (QFunctionPointer) ::glTexBuffer },
801 {
"glTexBufferRange", (QFunctionPointer) ::glTexBufferRange },
802 {
"glTexStorage3DMultisample", (QFunctionPointer) ::glTexStorage3DMultisample },
806 for (
size_t i = 0;
i <
sizeof(standardFuncs) /
sizeof(StdFunc); ++
i) {
808 proc = standardFuncs[
i].func;
int toInt(bool *ok=nullptr, int base=10) const
Returns the byte array converted to an int using base base, which is ten by default.
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
Reimplement in subclass to native swap buffers calls.
EGLContext eglContext() const
QFunctionPointer getProcAddress(const char *procName) override
Reimplement in subclass to allow dynamic querying of OpenGL symbols.
bool makeCurrent(QPlatformSurface *surface) override
void initialize() override
Called after a new instance is constructed.
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)
The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
QOpenGLContext * context() const
static bool parseOpenGLVersion(const QByteArray &versionString, int &major, int &minor)
bool supportsOpenGL() const
Returns true if the surface is OpenGL compatible and can be used in conjunction with QOpenGLContext; ...
struct wl_display * display
Combined button and popup list for selecting options.
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)
#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
[5]
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))))
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept