Typically ANGLE library is used with OpenGL 2.0, but I successfully tried to enable OpenGL 3.0:
const EGLint contextAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };
and used some OpenGL 3.0 features in my Universal Windows App. But today I tried to compile my application with the new version of ANGLE library and got EGL_BAD_CONFIG error while creating the OpenGL context. The source code that returns this error checks some EGL_OPENGL_ES3_BIT_KHR that is not set in the new version:
if (clientMajorVersion == 3 && !(configuration->conformant & EGL_OPENGL_ES3_BIT_KHR)) { return Error(EGL_BAD_CONFIG); }
some new flag mUseDirectRendering, that is not used here in the previous version prevents it from being set:
config.conformant = (!mUseDirectRendering && mRenderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0) ? (EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR) : 0;
mUseDirectRendering in its turn is set with the following code:
mUseDirectRendering = !!(attributes.get(EGL_PLATFORM_ANGLE_EXPERIMENTAL_DIRECT_RENDERING, defaultDirectRendering));
where attributes is the display attributes that I pass to eglGetPlatformDisplayEXT. Obviously the first solution is to set EGL_PLATFORM_ANGLE_EXPERIMENTAL_DIRECT_RENDERING to EGL_FALSE, but it is not enough because new ANGLE redirects EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER to EGL_PLATFORM_ANGLE_EXPERIMENTAL_DIRECT_RENDERING with the following code:
if (foundRenderToBackbuffer) { // Redirect EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER to // EGL_PLATFORM_ANGLE_EXPERIMENTAL_DIRECT_RENDERING for backcompat attribMap.insert(EGL_PLATFORM_ANGLE_EXPERIMENTAL_DIRECT_RENDERING, requestedAllowRenderToBackBuffer); }
So the new version of ANGLE works only with the following display attributes:
const EGLint defaultDisplayAttributes[] = { // These are the default display attributes, used to request ANGLE's D3D11 renderer. // eglInitialize will only succeed with these attributes if the hardware supports D3D11 Feature Level 10_0+. EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, // EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER is an optimization that can have large performance benefits on mobile devices. // Its syntax is subject to change, though. Please update your Visual Studio templates if you experience compilation issues with it. //EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE, // EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE is an option that enables ANGLE to automatically call // the IDXGIDevice3::Trim method on behalf of the application when it gets suspended. // Calling IDXGIDevice3::Trim when an application is suspended is a Windows Store application certification requirement. EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, EGL_PLATFORM_ANGLE_EXPERIMENTAL_DIRECT_RENDERING, EGL_FALSE, EGL_NONE, };
The ANGLE documentation says that this EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER is a big performance win, and commenting it out can reduce performance on some mobile devices, so probably it does not make a sense to upgrade to the new version until this optimization is supported with OpenGL 3.0.