diff --git a/src/glcontext_egl.cpp b/src/glcontext_egl.cpp index c47bff66c..505a967f9 100644 --- a/src/glcontext_egl.cpp +++ b/src/glcontext_egl.cpp @@ -176,6 +176,20 @@ EGL_IMPORT EGLBoolean success = eglInitialize(m_display, &major, &minor); BGFX_FATAL(success && major >= 1 && minor >= 3, Fatal::UnableToInitialize, "Failed to initialize %d.%d", major, minor); + BX_TRACE("EGL info:"); + const char* clientApis = eglQueryString(m_display, EGL_CLIENT_APIS); + BX_TRACE(" APIs: %s", clientApis); + + const char* vendor = eglQueryString(m_display, EGL_VENDOR); + BX_TRACE(" Vendor: %s", vendor); + + const char* version = eglQueryString(m_display, EGL_VERSION); + BX_TRACE("Version: %s", version); + + const char* extensions = eglQueryString(m_display, EGL_EXTENSIONS); + BX_TRACE("Supported EGL extensions:"); + dumpExtensions(extensions); + EGLint attrs[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, @@ -230,6 +244,9 @@ EGL_IMPORT m_surface = eglCreateWindowSurface(m_display, m_config, nwh, NULL); BGFX_FATAL(m_surface != EGL_NO_SURFACE, Fatal::UnableToInitialize, "Failed to create surface."); + const bool hasEglKhrCreateContext = !!bx::findIdentifierMatch(extensions, "EGL_KHR_create_context"); + + for (uint32_t ii = 0; ii < 2; ++ii) { bx::StaticMemoryBlockWriter writer(s_contextAttrs, sizeof(s_contextAttrs) ); @@ -239,19 +256,32 @@ EGL_IMPORT bx::write(&writer, EGLint(EGL_CONTEXT_MINOR_VERSION_KHR) ); bx::write(&writer, EGLint(BGFX_CONFIG_RENDERER_OPENGLES % 10) ); - bx::write(&writer, EGLint(EGL_CONTEXT_FLAGS_KHR) ); + EGLint flags = 0; - EGLint flags = BGFX_CONFIG_DEBUG ? 0 - | EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR -// | EGL_OPENGL_ES3_BIT_KHR - : 0 - ; - bx::write(&writer, flags); + if (hasEglKhrCreateContext + && 0 == ii) + { + flags = BGFX_CONFIG_DEBUG ? 0 + | EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR +// | EGL_OPENGL_ES3_BIT_KHR + : 0 + ; + + bx::write(&writer, EGLint(EGL_CONTEXT_FLAGS_KHR) ); + bx::write(&writer, flags); + } bx::write(&writer, EGLint(EGL_NONE) ); + + m_context = eglCreateContext(m_display, m_config, EGL_NO_CONTEXT, s_contextAttrs); + if (NULL != m_context) + { + break; + } + + BX_TRACE("Failed to create EGL context with EGL_CONTEXT_FLAGS_KHR (%08x).", flags); } - m_context = eglCreateContext(m_display, m_config, EGL_NO_CONTEXT, s_contextAttrs); BGFX_FATAL(m_context != EGL_NO_CONTEXT, Fatal::UnableToInitialize, "Failed to create context."); success = eglMakeCurrent(m_display, m_surface, m_surface, m_context);