Index: ui/gl/gl_context_egl.cc |
diff --git a/ui/gl/gl_context_egl.cc b/ui/gl/gl_context_egl.cc |
index b1ea4e6a77040716cc441e2287edb1267613fd76..eabc455e3f54c6c845c53abbc5bbb9b213904c22 100644 |
--- a/ui/gl/gl_context_egl.cc |
+++ b/ui/gl/gl_context_egl.cc |
@@ -22,6 +22,16 @@ extern "C" { |
} |
#endif |
+#ifndef EGL_CHROMIUM_create_context_bind_generates_resource |
+#define EGL_CHROMIUM_create_context_bind_generates_resource 1 |
+#define EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM 0x3AAD |
+#endif /* EGL_CHROMIUM_create_context_bind_generates_resource */ |
+ |
+#ifndef EGL_ANGLE_create_context_webgl_compatibility |
+#define EGL_ANGLE_create_context_webgl_compatibility 1 |
+#define EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE 0x3AAC |
+#endif /* EGL_ANGLE_create_context_webgl_compatibility */ |
+ |
using ui::GetLastEGLErrorString; |
namespace gl { |
@@ -35,8 +45,8 @@ GLContextEGL::GLContextEGL(GLShareGroup* share_group) |
swap_interval_(1) { |
} |
-bool GLContextEGL::Initialize( |
- GLSurface* compatible_surface, GpuPreference gpu_preference) { |
+bool GLContextEGL::Initialize(GLSurface* compatible_surface, |
+ const GLContextAttribs& attribs) { |
DCHECK(compatible_surface); |
DCHECK(!context_); |
@@ -58,26 +68,19 @@ bool GLContextEGL::Initialize( |
context_client_version = 3; |
} |
- const EGLint kContextAttributes[] = { |
- EGL_CONTEXT_CLIENT_VERSION, context_client_version, |
- EGL_NONE |
- }; |
- const EGLint kContextRobustnessAttributes[] = { |
- EGL_CONTEXT_CLIENT_VERSION, context_client_version, |
- EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, |
- EGL_LOSE_CONTEXT_ON_RESET_EXT, |
- EGL_NONE |
- }; |
- |
- const EGLint* context_attributes = nullptr; |
+ std::vector<EGLint> context_attributes; |
+ context_attributes.push_back(EGL_CONTEXT_CLIENT_VERSION); |
+ context_attributes.push_back(context_client_version); |
+ |
if (GLSurfaceEGL::IsCreateContextRobustnessSupported()) { |
DVLOG(1) << "EGL_EXT_create_context_robustness supported."; |
- context_attributes = kContextRobustnessAttributes; |
} else { |
// At some point we should require the presence of the robustness |
// extension and remove this code path. |
DVLOG(1) << "EGL_EXT_create_context_robustness NOT supported."; |
- context_attributes = kContextAttributes; |
+ context_attributes.push_back( |
+ EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT); |
+ context_attributes.push_back(EGL_LOSE_CONTEXT_ON_RESET_EXT); |
} |
if (!eglBindAPI(EGL_OPENGL_ES_API)) { |
@@ -86,11 +89,25 @@ bool GLContextEGL::Initialize( |
return false; |
} |
+ if (GLSurfaceEGL::IsCreateContextBindGeneratesResourceSupported()) { |
+ context_attributes.push_back(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM); |
+ context_attributes.push_back(attribs.bind_generates_resource ? EGL_TRUE |
+ : EGL_FALSE); |
+ } |
+ |
+ if (GLSurfaceEGL::IsCreateContextWebGLCompatabilitySupported()) { |
+ context_attributes.push_back(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE); |
+ context_attributes.push_back( |
+ attribs.webgl_compatibility_context ? EGL_TRUE : EGL_FALSE); |
+ } |
+ |
+ // Append final EGL_NONE to signal the context attributes are finished |
+ context_attributes.push_back(EGL_NONE); |
+ context_attributes.push_back(EGL_NONE); |
+ |
context_ = eglCreateContext( |
- display_, |
- config_, |
- share_group() ? share_group()->GetHandle() : nullptr, |
- context_attributes); |
+ display_, config_, share_group() ? share_group()->GetHandle() : nullptr, |
+ context_attributes.data()); |
if (!context_) { |
LOG(ERROR) << "eglCreateContext failed with error " |