Index: cc/trees/thread_proxy.cc |
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc |
index f14e38b92f41602c0f22f46bf9991a29725ee8ac..583b060c37fc57bda2de7944c04b00d24778cd3b 100644 |
--- a/cc/trees/thread_proxy.cc |
+++ b/cc/trees/thread_proxy.cc |
@@ -198,40 +198,59 @@ void ThreadProxy::UpdateBackgroundAnimateTicking() { |
impl().animations_frozen_until_next_draw = false; |
} |
-void ThreadProxy::DoCreateAndInitializeOutputSurface() { |
+void ThreadProxy::DidLoseOutputSurface() { |
+ TRACE_EVENT0("cc", "ThreadProxy::DidLoseOutputSurface"); |
+ DCHECK(IsMainThread()); |
+ layer_tree_host()->DidLoseOutputSurface(); |
+ |
+ { |
+ DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
+ |
+ // Return lost resources to their owners immediately. |
+ BlockingTaskRunner::CapturePostTasks blocked; |
+ |
+ CompletionEvent completion; |
+ Proxy::ImplThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ThreadProxy::DeleteContentsTexturesOnImplThread, |
+ impl_thread_weak_ptr_, |
+ &completion)); |
+ completion.Wait(); |
+ } |
+} |
+ |
+void ThreadProxy::CreateAndInitializeOutputSurface() { |
TRACE_EVENT0("cc", "ThreadProxy::DoCreateAndInitializeOutputSurface"); |
DCHECK(IsMainThread()); |
scoped_ptr<OutputSurface> output_surface = |
layer_tree_host()->CreateOutputSurface(); |
- RendererCapabilities capabilities; |
- bool success = !!output_surface; |
- if (success) { |
- // Make a blocking call to InitializeOutputSurfaceOnImplThread. The results |
- // of that call are pushed into the success and capabilities local |
- // variables. |
- CompletionEvent completion; |
- DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
- |
+ if (output_surface) { |
Proxy::ImplThreadTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&ThreadProxy::InitializeOutputSurfaceOnImplThread, |
impl_thread_weak_ptr_, |
- &completion, |
- base::Passed(&output_surface), |
- &success, |
- &capabilities)); |
- completion.Wait(); |
+ base::Passed(&output_surface))); |
+ return; |
} |
+ |
+ DidInitializeOutputSurface(false, RendererCapabilities()); |
+} |
+ |
+void ThreadProxy::DidInitializeOutputSurface( |
+ bool success, |
+ const RendererCapabilities& capabilities) { |
+ TRACE_EVENT0("cc", "ThreadProxy::DidInitializeOutputSurface"); |
+ DCHECK(IsMainThread()); |
main().renderer_capabilities_main_thread_copy = capabilities; |
layer_tree_host()->OnCreateAndInitializeOutputSurfaceAttempted(success); |
- if (success) { |
- main().output_surface_creation_callback.Cancel(); |
- } else if (!main().output_surface_creation_callback.IsCancelled()) { |
+ if (!success) { |
Proxy::MainThreadTaskRunner()->PostTask( |
- FROM_HERE, main().output_surface_creation_callback.callback()); |
+ FROM_HERE, |
+ base::Bind(&ThreadProxy::CreateAndInitializeOutputSurface, |
+ main_thread_weak_ptr_)); |
} |
} |
@@ -312,6 +331,9 @@ void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { |
DCHECK(IsImplThread()); |
if (!impl().layer_tree_host_impl->IsContextLost()) |
return; |
+ Proxy::MainThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ThreadProxy::DidLoseOutputSurface, main_thread_weak_ptr_)); |
impl().scheduler->DidLoseOutputSurface(); |
} |
@@ -727,23 +749,11 @@ void ThreadProxy::BeginMainFrame( |
// swap promises. |
SwapPromiseChecker swap_promise_checker(layer_tree_host()); |
- // Do not notify the impl thread of commit requests that occur during |
- // the apply/animate/layout part of the BeginMainFrameAndCommit process since |
- // those commit requests will get painted immediately. Once we have done |
- // the paint, main().commit_requested will be set to false to allow new commit |
- // requests to be scheduled. |
- main().commit_requested = true; |
- main().commit_request_sent_to_impl_thread = true; |
- |
- // On the other hand, the AnimationRequested flag needs to be cleared |
- // here so that any animation requests generated by the apply or animate |
- // callbacks will trigger another frame. |
+ main().commit_requested = false; |
+ main().commit_request_sent_to_impl_thread = false; |
main().animate_requested = false; |
if (!layer_tree_host()->visible()) { |
- main().commit_requested = false; |
- main().commit_request_sent_to_impl_thread = false; |
- |
TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD); |
bool did_handle = false; |
Proxy::ImplThreadTaskRunner()->PostTask( |
@@ -754,6 +764,29 @@ void ThreadProxy::BeginMainFrame( |
return; |
} |
+ if (layer_tree_host()->output_surface_lost()) { |
+ TRACE_EVENT_INSTANT0( |
+ "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD); |
+ bool did_handle = false; |
+ Proxy::ImplThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ThreadProxy::BeginMainFrameAbortedOnImplThread, |
+ impl_thread_weak_ptr_, |
+ did_handle)); |
+ return; |
+ } |
+ |
+ // Do not notify the impl thread of commit requests that occur during |
+ // the apply/animate/layout part of the BeginMainFrameAndCommit process since |
+ // those commit requests will get painted immediately. Once we have done |
+ // the paint, main().commit_requested will be set to false to allow new commit |
+ // requests to be scheduled. |
+ // On the other hand, the animate_requested flag should remain cleared |
+ // here so that any animation requests generated by the apply or animate |
+ // callbacks will trigger another frame. |
+ main().commit_requested = true; |
+ main().commit_request_sent_to_impl_thread = true; |
+ |
layer_tree_host()->ApplyScrollAndScale(*begin_main_frame_state->scroll_info); |
layer_tree_host()->WillBeginMainFrame(); |
@@ -1195,42 +1228,6 @@ void ThreadProxy::SetAnimationEvents(scoped_ptr<AnimationEventsVector> events) { |
layer_tree_host()->SetAnimationEvents(events.Pass()); |
} |
-void ThreadProxy::CreateAndInitializeOutputSurface() { |
- TRACE_EVENT0("cc", "ThreadProxy::CreateAndInitializeOutputSurface"); |
- DCHECK(IsMainThread()); |
- |
- // Check that output surface has not been recreated by CompositeAndReadback |
- // after this task is posted but before it is run. |
- bool has_initialized_output_surface = true; |
- { |
- CompletionEvent completion; |
- Proxy::ImplThreadTaskRunner()->PostTask( |
- FROM_HERE, |
- base::Bind(&ThreadProxy::HasInitializedOutputSurfaceOnImplThread, |
- impl_thread_weak_ptr_, |
- &completion, |
- &has_initialized_output_surface)); |
- completion.Wait(); |
- } |
- if (has_initialized_output_surface) |
- return; |
- |
- layer_tree_host()->DidLoseOutputSurface(); |
- main().output_surface_creation_callback.Reset( |
- base::Bind(&ThreadProxy::DoCreateAndInitializeOutputSurface, |
- base::Unretained(this))); |
- main().output_surface_creation_callback.callback().Run(); |
-} |
- |
-void ThreadProxy::HasInitializedOutputSurfaceOnImplThread( |
- CompletionEvent* completion, |
- bool* has_initialized_output_surface) { |
- DCHECK(IsImplThread()); |
- *has_initialized_output_surface = |
- impl().scheduler->HasInitializedOutputSurface(); |
- completion->Signal(); |
-} |
- |
void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) { |
TRACE_EVENT0("cc", "ThreadProxy::InitializeImplOnImplThread"); |
DCHECK(IsImplThread()); |
@@ -1263,31 +1260,38 @@ void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) { |
completion->Signal(); |
} |
-void ThreadProxy::InitializeOutputSurfaceOnImplThread( |
- CompletionEvent* completion, |
- scoped_ptr<OutputSurface> output_surface, |
- bool* success, |
- RendererCapabilities* capabilities) { |
- TRACE_EVENT0("cc", "ThreadProxy::InitializeOutputSurfaceOnImplThread"); |
+void ThreadProxy::DeleteContentsTexturesOnImplThread( |
+ CompletionEvent* completion) { |
+ TRACE_EVENT0("cc", "ThreadProxy::DeleteContentsTexturesOnImplThread"); |
DCHECK(IsImplThread()); |
DCHECK(IsMainThreadBlocked()); |
- DCHECK(success); |
- DCHECK(capabilities); |
- |
layer_tree_host()->DeleteContentsTexturesOnImplThread( |
impl().layer_tree_host_impl->resource_provider()); |
+ completion->Signal(); |
+} |
- *success = |
- impl().layer_tree_host_impl->InitializeRenderer(output_surface.Pass()); |
+void ThreadProxy::InitializeOutputSurfaceOnImplThread( |
+ scoped_ptr<OutputSurface> output_surface) { |
+ TRACE_EVENT0("cc", "ThreadProxy::InitializeOutputSurfaceOnImplThread"); |
+ DCHECK(IsImplThread()); |
- if (*success) { |
- *capabilities = impl() |
- .layer_tree_host_impl->GetRendererCapabilities() |
- .MainThreadCapabilities(); |
- impl().scheduler->DidCreateAndInitializeOutputSurface(); |
+ LayerTreeHostImpl* host_impl = impl().layer_tree_host_impl.get(); |
+ bool success = host_impl->InitializeRenderer(output_surface.Pass()); |
+ RendererCapabilities capabilities; |
+ if (success) { |
+ capabilities = |
+ host_impl->GetRendererCapabilities().MainThreadCapabilities(); |
} |
- completion->Signal(); |
+ Proxy::MainThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ThreadProxy::DidInitializeOutputSurface, |
+ main_thread_weak_ptr_, |
+ success, |
+ capabilities)); |
+ |
+ if (success) |
+ impl().scheduler->DidCreateAndInitializeOutputSurface(); |
} |
void ThreadProxy::FinishGLOnImplThread(CompletionEvent* completion) { |
@@ -1301,6 +1305,7 @@ void ThreadProxy::FinishGLOnImplThread(CompletionEvent* completion) { |
void ThreadProxy::LayerTreeHostClosedOnImplThread(CompletionEvent* completion) { |
TRACE_EVENT0("cc", "ThreadProxy::LayerTreeHostClosedOnImplThread"); |
DCHECK(IsImplThread()); |
+ DCHECK(IsMainThreadBlocked()); |
layer_tree_host()->DeleteContentsTexturesOnImplThread( |
impl().layer_tree_host_impl->resource_provider()); |
impl().current_resource_update_controller.reset(); |