Chromium Code Reviews| Index: content/browser/renderer_host/compositor_impl_android.cc |
| diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc |
| index bcdf99cde87f7a8fd4b56515e98c63a8958cfec9..14ed730d421c4dc07046f76f8befa38f79f5543a 100644 |
| --- a/content/browser/renderer_host/compositor_impl_android.cc |
| +++ b/content/browser/renderer_host/compositor_impl_android.cc |
| @@ -185,6 +185,7 @@ CompositorImpl::CompositorImpl(CompositorClient* client, |
| will_composite_immediately_(false), |
| composite_on_vsync_trigger_(DO_NOT_COMPOSITE), |
| pending_swapbuffers_(0U), |
| + defer_composite_for_gpu_channel_(false), |
| weak_factory_(this) { |
| DCHECK(client); |
| DCHECK(root_window); |
| @@ -203,7 +204,7 @@ void CompositorImpl::PostComposite(CompositingTrigger trigger) { |
| DCHECK(needs_composite_); |
| DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY); |
| - if (will_composite_immediately_ || |
| + if (defer_composite_for_gpu_channel_ || will_composite_immediately_ || |
| (trigger == COMPOSITE_EVENTUALLY && WillComposite())) { |
| // We will already composite soon enough. |
| DCHECK(WillComposite()); |
| @@ -259,15 +260,27 @@ void CompositorImpl::PostComposite(CompositingTrigger trigger) { |
| FROM_HERE, current_composite_task_->callback(), delay); |
| } |
| +void CompositorImpl::OnGpuChannelEstablished() { |
| + defer_composite_for_gpu_channel_ = false; |
| + |
| + if (host_) |
| + PostComposite(COMPOSITE_IMMEDIATELY); |
| +} |
| + |
| void CompositorImpl::Composite(CompositingTrigger trigger) { |
| + if (trigger == COMPOSITE_IMMEDIATELY) |
| + will_composite_immediately_ = false; |
| + |
| BrowserGpuChannelHostFactory* factory = |
| BrowserGpuChannelHostFactory::instance(); |
| if (!factory->GetGpuChannel() || factory->GetGpuChannel()->IsLost()) { |
| CauseForGpuLaunch cause = |
| CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE; |
| - factory->EstablishGpuChannel(cause, |
| - base::Bind(&CompositorImpl::ScheduleComposite, |
| - weak_factory_.GetWeakPtr())); |
| + factory->EstablishGpuChannel( |
| + cause, base::Bind(&CompositorImpl::OnGpuChannelEstablished, |
| + weak_factory_.GetWeakPtr())); |
|
jdduke (slow)
2014/11/21 21:16:34
Maybe |DCHECK(!defer_composite_for_gpu_channel_);|
no sievers
2014/11/21 21:19:19
Done.
|
| + defer_composite_for_gpu_channel_ = true; |
| + current_composite_task_.reset(); |
| return; |
| } |
| @@ -276,9 +289,6 @@ void CompositorImpl::Composite(CompositingTrigger trigger) { |
| DCHECK(needs_composite_); |
| DCHECK(!DidCompositeThisFrame()); |
| - if (trigger == COMPOSITE_IMMEDIATELY) |
| - will_composite_immediately_ = false; |
| - |
| DCHECK_LE(pending_swapbuffers_, kMaxSwapBuffers); |
| if (pending_swapbuffers_ == kMaxSwapBuffers) { |
| TRACE_EVENT0("compositor", "CompositorImpl_SwapLimit"); |
| @@ -409,6 +419,7 @@ void CompositorImpl::SetVisible(bool visible) { |
| } else if (!host_) { |
| DCHECK(!WillComposite()); |
| needs_composite_ = false; |
| + defer_composite_for_gpu_channel_ = false; |
| pending_swapbuffers_ = 0; |
| cc::LayerTreeSettings settings; |
| settings.refresh_rate = 60.0; |