Index: ui/gl/gl_context_egl.cc |
diff --git a/ui/gl/gl_context_egl.cc b/ui/gl/gl_context_egl.cc |
index 52c60e25e8902889995328672bd866fee7a2cdee..196438cc3bc0f5608bfe6011618416f2c2c6e684 100644 |
--- a/ui/gl/gl_context_egl.cc |
+++ b/ui/gl/gl_context_egl.cc |
@@ -28,7 +28,8 @@ GLContextEGL::GLContextEGL(GLShareGroup* share_group) |
: GLContext(share_group), |
context_(NULL), |
display_(NULL), |
- config_(NULL) { |
+ config_(NULL), |
+ recreate_surface_on_makecurrent_(false) { |
} |
bool GLContextEGL::Initialize( |
@@ -112,6 +113,11 @@ bool GLContextEGL::MakeCurrent(GLSurface* surface) { |
return false; |
} |
+#if defined(OS_ANDROID) |
+ if (!RecreateSurfaceIfNeeded(surface)) |
+ return false; |
+#endif |
+ |
if (!surface->OnMakeCurrent(this)) { |
LOG(ERROR) << "Could not make current."; |
return false; |
@@ -121,6 +127,46 @@ bool GLContextEGL::MakeCurrent(GLSurface* surface) { |
return true; |
} |
+void GLContextEGL::SetRecreateSurfaceOnMakeCurrent() { |
+ recreate_surface_on_makecurrent_ = true; |
+} |
+ |
+bool GLContextEGL::RecreateSurfaceIfNeeded(GLSurface* surface) { |
+ if (!recreate_surface_on_makecurrent_ || |
+ !surface || |
+ surface->IsOffscreen() || |
+ surface->GetBackingFrameBufferObject()) |
+ return true; |
+ |
+ // This is specifically needed for Vivante GPU's on Android. |
+ // A native view surface will not be configured correctly |
+ // unless we do all of the following steps after making the |
+ // surface current. |
+ GLint fbo = 0; |
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo); |
+ glBindFramebufferEXT(GL_FRAMEBUFFER, 0); |
+ |
+ eglMakeCurrent(display_, |
+ EGL_NO_SURFACE, |
+ EGL_NO_SURFACE, |
+ EGL_NO_CONTEXT); |
+ if (!surface->Recreate()) { |
+ LOG(ERROR) << "Failed to recreate surface"; |
+ return false; |
+ } |
+ if (!eglMakeCurrent(display_, |
+ surface->GetHandle(), |
+ surface->GetHandle(), |
+ context_)) { |
+ LOG(ERROR) << "eglMakeCurrent failed with error " |
+ << GetLastEGLErrorString(); |
+ return false; |
+ } |
+ |
+ glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); |
+ return true; |
+} |
+ |
void GLContextEGL::ReleaseCurrent(GLSurface* surface) { |
if (!IsCurrent(surface)) |
return; |