Chromium Code Reviews| Index: cc/trees/thread_proxy.cc |
| diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc |
| index cdf05c01db9d9506caf135323b967cf6855be1f7..878b55dbab9901059dd3dcaba4092d69c321ceab 100644 |
| --- a/cc/trees/thread_proxy.cc |
| +++ b/cc/trees/thread_proxy.cc |
| @@ -338,18 +338,25 @@ void ThreadProxy::DoCreateAndInitializeOutputSurface() { |
| OnOutputSurfaceInitializeAttempted(success, capabilities); |
| } |
| +void ThreadProxy::SetRendererCapabilitiesMainThreadCopy( |
| + const RendererCapabilities& capabilities) { |
| + DCHECK(IsMainThread()); |
| + main().renderer_capabilities_main_thread_copy = capabilities; |
| + layer_tree_host()->RendererCapabilitiesChanged(); |
| +} |
| + |
| void ThreadProxy::OnOutputSurfaceInitializeAttempted( |
| bool success, |
| const RendererCapabilities& capabilities) { |
| DCHECK(IsMainThread()); |
| DCHECK(layer_tree_host()); |
| + LayerTreeHost::CreateResult result = |
| + layer_tree_host()->OnCreateAndInitializeOutputSurfaceAttempted(success); |
| if (success) { |
| - main().renderer_capabilities_main_thread_copy = capabilities; |
| + SetRendererCapabilitiesMainThreadCopy(capabilities); |
| } |
| - LayerTreeHost::CreateResult result = |
| - layer_tree_host()->OnCreateAndInitializeOutputSurfaceAttempted(success); |
| if (result == LayerTreeHost::CreateFailedButTryAgain) { |
| if (!main().output_surface_creation_callback.callback().is_null()) { |
| Proxy::MainThreadTaskRunner()->PostTask( |
| @@ -411,6 +418,22 @@ void ThreadProxy::SetNeedsCommit() { |
| SendCommitRequestToImplThreadIfNeeded(); |
| } |
| +void ThreadProxy::UpdateRendererCapabilitiesOnImplThread() { |
| + DCHECK(IsImplThread()); |
| + // PrioritizedResourceManager is not cleared, so this won't yet work with |
| + // ContentLayer or ImageLayer, which are only used when impl_side_painting is |
| + // off. |
| + DCHECK(impl().layer_tree_host_impl->settings().impl_side_painting); |
| + |
| + Proxy::MainThreadTaskRunner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&ThreadProxy::SetRendererCapabilitiesMainThreadCopy, |
| + main_thread_weak_ptr_, |
| + impl() |
| + .layer_tree_host_impl->GetRendererCapabilities() |
| + .MainThreadCapabilities())); |
| +} |
| + |
| void ThreadProxy::DidLoseOutputSurfaceOnImplThread() { |
| TRACE_EVENT0("cc", "ThreadProxy::DidLoseOutputSurfaceOnImplThread"); |
| DCHECK(IsImplThread()); |
| @@ -962,7 +985,8 @@ void ThreadProxy::BeginMainFrame( |
| impl_thread_weak_ptr_, |
| &completion, |
| queue.release(), |
| - offscreen_context_provider)); |
| + offscreen_context_provider, |
| + main().renderer_capabilities_main_thread_copy)); |
| completion.Wait(); |
| RenderingStatsInstrumentation* stats_instrumentation = |
| @@ -979,7 +1003,8 @@ void ThreadProxy::BeginMainFrame( |
| void ThreadProxy::StartCommitOnImplThread( |
| CompletionEvent* completion, |
| ResourceUpdateQueue* raw_queue, |
| - scoped_refptr<ContextProvider> offscreen_context_provider) { |
| + scoped_refptr<ContextProvider> offscreen_context_provider, |
| + const RendererCapabilities& main_frame_renderer_caps) { |
| scoped_ptr<ResourceUpdateQueue> queue(raw_queue); |
| TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread"); |
| @@ -1022,6 +1047,7 @@ void ThreadProxy::StartCommitOnImplThread( |
| impl().contents_texture_manager->PushTexturePrioritiesToBackings(); |
| } |
| + impl().renderer_capabilities_for_commit = main_frame_renderer_caps; |
| impl().commit_completion_event = completion; |
| impl().current_resource_update_controller = ResourceUpdateController::Create( |
| this, |
| @@ -1384,7 +1410,22 @@ void ThreadProxy::DidBeginImplFrameDeadline() { |
| void ThreadProxy::ReadyToFinalizeTextureUpdates() { |
| DCHECK(IsImplThread()); |
| - impl().scheduler->FinishCommit(); |
| + |
| + const RendererCapabilitiesImpl& impl_caps = |
|
enne (OOO)
2014/02/14 20:21:48
I don't quite follow what sorts of caps aren't sup
boliu
2014/02/14 20:45:42
I thought it might be a problem. But I don't know
|
| + impl().layer_tree_host_impl->GetRendererCapabilities(); |
| + if (impl_caps.MainThreadCapabilities() == |
| + impl().renderer_capabilities_for_commit) { |
| + impl().scheduler->FinishCommit(); |
| + } else { |
| + TRACE_EVENT_INSTANT0( |
| + "cc", "EarlyOut_StaleRendererCaps", TRACE_EVENT_SCOPE_THREAD); |
| + if (impl().commit_completion_event) { |
| + impl().commit_completion_event->Signal(); |
| + impl().commit_completion_event = NULL; |
| + bool did_handle = true; |
| + BeginMainFrameAbortedOnImplThread(did_handle); |
| + } |
| + } |
| } |
| void ThreadProxy::DidCommitAndDrawFrame() { |