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.

