Chromium Code Reviews| Index: content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc |
| =================================================================== |
| --- content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc (revision 104937) |
| +++ content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc (working copy) |
| @@ -50,6 +50,7 @@ |
| context_lost_callback_(0), |
| context_lost_reason_(GL_NO_ERROR), |
| swapbuffers_complete_callback_(0), |
| + gpu_preference_(gfx::PreferIntegratedGpu), |
| cached_width_(0), |
| cached_height_(0), |
| bound_fbo_(0), |
| @@ -58,6 +59,12 @@ |
| WebGraphicsContext3DCommandBufferImpl:: |
| ~WebGraphicsContext3DCommandBufferImpl() { |
| + if (host_) { |
| + if (host_->WillGpuSwitchOccur(false, gpu_preference_)) { |
| + host_->ForciblyCloseChannel(); |
| + } |
| + } |
| + |
| { |
| base::AutoLock lock(g_all_shared_contexts_lock.Get()); |
| g_all_shared_contexts.Pointer()->erase(this); |
| @@ -74,13 +81,36 @@ |
| RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
| if (!render_thread) |
| return false; |
| - host_ = render_thread->EstablishGpuChannelSync( |
| - content:: |
| - CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE); |
| - if (!host_) |
| - return false; |
| - DCHECK(host_->state() == GpuChannelHost::kConnected); |
| + // The noExtensions and canRecoverFromContextLoss flags are |
| + // currently used as hints that we are creating a context on |
| + // behalf of WebGL or accelerated 2D canvas, respectively. |
| + if (attributes.noExtensions || !attributes.canRecoverFromContextLoss) |
|
apatrick_chromium
2011/10/12 19:01:28
It can't all be done in this CL but it might be re
Ken Russell (switch to Gerrit)
2011/10/12 22:39:42
Agreed, but yes, this requires back-and-forth comm
|
| + gpu_preference_ = gfx::PreferDiscreteGpu; |
| + |
| + bool retry = false; |
| + |
| + do { |
| + host_ = render_thread->EstablishGpuChannelSync( |
| + content:: |
| + CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE); |
| + if (!host_) |
| + return false; |
| + DCHECK(host_->state() == GpuChannelHost::kConnected); |
| + |
| + if (!retry) { |
| + // If the creation of this context requires all contexts for this |
| + // renderer to be destroyed on the GPU process side, then drop the |
| + // channel and recreate it. |
| + if (host_->WillGpuSwitchOccur(true, gpu_preference_)) { |
| + host_->ForciblyCloseChannel(); |
| + retry = true; |
| + } |
| + } else { |
| + retry = false; |
| + } |
| + } while (retry); |
| + |
| const GPUInfo& gpu_info = host_->gpu_info(); |
| UMA_HISTOGRAM_ENUMERATION( |
| "GPU.WebGraphicsContext3D_Init_CanLoseContext", |
| @@ -152,7 +182,8 @@ |
| share_group, |
| preferred_extensions, |
| attribs, |
| - active_url_); |
| + active_url_, |
| + gpu_preference_); |
| } else { |
| context_ = RendererGLContext::CreateOffscreenContext( |
| host_, |
| @@ -160,7 +191,8 @@ |
| share_group, |
| preferred_extensions, |
| attribs, |
| - active_url_); |
| + active_url_, |
| + gpu_preference_); |
| } |
| } |