| Index: webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
|
| ===================================================================
|
| --- webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc (revision 86168)
|
| +++ webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc (working copy)
|
| @@ -133,13 +133,29 @@
|
| // and from there to the window, and WebViewImpl::paint already
|
| // correctly handles the case where the compositor is active but
|
| // the output needs to go to a WebCanvas.
|
| - scoped_ptr<gfx::GLSurface> surface(gfx::GLSurface::CreateOffscreenGLSurface(
|
| - gfx::Size(1, 1)));
|
| - if (!surface->Initialize())
|
| - return false;
|
| + gl_surface_.reset(gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
|
|
|
| - gl_context_.reset(gfx::GLContext::CreateGLContext(surface.release(),
|
| - share_context));
|
| + if (!gl_surface_.get()) {
|
| + if (!is_gles2_)
|
| + return false;
|
| +
|
| + // Embedded systems have smaller limit on number of GL contexts. Sometimes
|
| + // failure of GL context creation is because of existing GL contexts
|
| + // referenced by JavaScript garbages. Collect garbage and try again.
|
| + // TODO: Besides this solution, kbr@chromium.org suggested: upon receiving
|
| + // a page unload event, iterate down any live WebGraphicsContext3D instances
|
| + // and force them to drop their contexts, sending a context lost event if
|
| + // necessary.
|
| + webView->mainFrame()->collectGarbage();
|
| +
|
| + gl_surface_.reset(gfx::GLSurface::CreateOffscreenGLSurface(
|
| + gfx::Size(1, 1)));
|
| + if (!gl_surface_.get())
|
| + return false;
|
| + }
|
| +
|
| + gl_context_.reset(gfx::GLContext::CreateGLContext(share_context,
|
| + gl_surface_.get()));
|
| if (!gl_context_.get()) {
|
| if (!is_gles2_)
|
| return false;
|
| @@ -153,11 +169,8 @@
|
| // necessary.
|
| webView->mainFrame()->collectGarbage();
|
|
|
| - surface.reset(gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
|
| -
|
| - gl_context_.reset(gfx::GLContext::CreateGLContext(
|
| - surface.release(),
|
| - share_context));
|
| + gl_context_.reset(gfx::GLContext::CreateGLContext(share_context,
|
| + gl_surface_.get()));
|
| if (!gl_context_.get())
|
| return false;
|
| }
|
| @@ -175,7 +188,7 @@
|
| if (render_directly_to_web_view)
|
| attributes_.antialias = false;
|
|
|
| - if (!gl_context_->MakeCurrent()) {
|
| + if (!gl_context_->MakeCurrent(gl_surface_.get())) {
|
| gl_context_.reset();
|
| return false;
|
| }
|
| @@ -270,7 +283,7 @@
|
| }
|
|
|
| bool WebGraphicsContext3DInProcessCommandBufferImpl::makeContextCurrent() {
|
| - return gl_context_->MakeCurrent();
|
| + return gl_context_->MakeCurrent(gl_surface_.get());
|
| }
|
|
|
| int WebGraphicsContext3DInProcessCommandBufferImpl::width() {
|
|
|