Chromium Code Reviews| Index: cc/trees/thread_proxy.cc |
| diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc |
| index a757a82bae40db9b42012094aab6469165b8289b..f3941a7ec2c28bfb31c9dae2a75fe63da1f97558 100644 |
| --- a/cc/trees/thread_proxy.cc |
| +++ b/cc/trees/thread_proxy.cc |
| @@ -335,18 +335,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( |
| @@ -408,6 +415,19 @@ void ThreadProxy::SetNeedsCommit() { |
| SendCommitRequestToImplThreadIfNeeded(); |
| } |
| +void ThreadProxy::UpdateRendererCapabilitiesOnImplThread() { |
| + DCHECK(IsImplThread()); |
| + // We don't clear PrioritizedResourceManager. |
| + 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()); |
| @@ -959,7 +979,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 = |
| @@ -976,7 +997,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"); |
| @@ -992,6 +1014,17 @@ void ThreadProxy::StartCommitOnImplThread( |
| return; |
| } |
| + const RendererCapabilitiesImpl& impl_caps = |
| + impl().layer_tree_host_impl->GetRendererCapabilities(); |
| + if (!impl_caps.Equals(main_frame_renderer_caps)) { |
| + TRACE_EVENT_INSTANT0( |
| + "cc", "EarlyOut_StaleRendererCaps", TRACE_EVENT_SCOPE_THREAD); |
|
boliu
2014/02/07 04:29:55
TEST!
|
| + completion->Signal(); |
| + bool did_handle = true; |
| + BeginMainFrameAbortedOnImplThread(did_handle); |
| + return; |
| + } |
| + |
| if (offscreen_context_provider.get()) |
| offscreen_context_provider->BindToCurrentThread(); |
| impl().layer_tree_host_impl->SetOffscreenContextProvider( |