Index: cc/trees/thread_proxy.cc |
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc |
index dbbc77995c422d5cc5fbf86e702e269890463aaf..d727ace7569bd495b4ae9ece9d60feac28f0fecf 100644 |
--- a/cc/trees/thread_proxy.cc |
+++ b/cc/trees/thread_proxy.cc |
@@ -194,59 +194,40 @@ |
impl().animations_frozen_until_next_draw = false; |
} |
-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() { |
+void ThreadProxy::DoCreateAndInitializeOutputSurface() { |
TRACE_EVENT0("cc", "ThreadProxy::DoCreateAndInitializeOutputSurface"); |
DCHECK(IsMainThread()); |
scoped_ptr<OutputSurface> output_surface = |
layer_tree_host()->CreateOutputSurface(); |
- if (output_surface) { |
+ 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); |
+ |
Proxy::ImplThreadTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&ThreadProxy::InitializeOutputSurfaceOnImplThread, |
impl_thread_weak_ptr_, |
- base::Passed(&output_surface))); |
- return; |
- } |
- |
- DidInitializeOutputSurface(false, RendererCapabilities()); |
-} |
- |
-void ThreadProxy::DidInitializeOutputSurface( |
- bool success, |
- const RendererCapabilities& capabilities) { |
- TRACE_EVENT0("cc", "ThreadProxy::DidInitializeOutputSurface"); |
- DCHECK(IsMainThread()); |
+ &completion, |
+ base::Passed(&output_surface), |
+ &success, |
+ &capabilities)); |
+ completion.Wait(); |
+ } |
main().renderer_capabilities_main_thread_copy = capabilities; |
layer_tree_host()->OnCreateAndInitializeOutputSurfaceAttempted(success); |
- if (!success) { |
+ if (success) { |
+ main().output_surface_creation_callback.Cancel(); |
+ } else if (!main().output_surface_creation_callback.IsCancelled()) { |
Proxy::MainThreadTaskRunner()->PostTask( |
- FROM_HERE, |
- base::Bind(&ThreadProxy::CreateAndInitializeOutputSurface, |
- main_thread_weak_ptr_)); |
+ FROM_HERE, main().output_surface_creation_callback.callback()); |
} |
} |
@@ -327,9 +308,6 @@ |
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(); |
} |
@@ -1211,6 +1189,42 @@ |
TRACE_EVENT0("cc", "ThreadProxy::SetAnimationEvents"); |
DCHECK(IsMainThread()); |
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) { |
@@ -1245,38 +1259,31 @@ |
completion->Signal(); |
} |
-void ThreadProxy::DeleteContentsTexturesOnImplThread( |
- CompletionEvent* completion) { |
- TRACE_EVENT0("cc", "ThreadProxy::DeleteContentsTexturesOnImplThread"); |
+void ThreadProxy::InitializeOutputSurfaceOnImplThread( |
+ CompletionEvent* completion, |
+ scoped_ptr<OutputSurface> output_surface, |
+ bool* success, |
+ RendererCapabilities* capabilities) { |
+ TRACE_EVENT0("cc", "ThreadProxy::InitializeOutputSurfaceOnImplThread"); |
DCHECK(IsImplThread()); |
DCHECK(IsMainThreadBlocked()); |
+ DCHECK(success); |
+ DCHECK(capabilities); |
+ |
layer_tree_host()->DeleteContentsTexturesOnImplThread( |
impl().layer_tree_host_impl->resource_provider()); |
+ |
+ *success = |
+ impl().layer_tree_host_impl->InitializeRenderer(output_surface.Pass()); |
+ |
+ if (*success) { |
+ *capabilities = impl() |
+ .layer_tree_host_impl->GetRendererCapabilities() |
+ .MainThreadCapabilities(); |
+ impl().scheduler->DidCreateAndInitializeOutputSurface(); |
+ } |
+ |
completion->Signal(); |
-} |
- |
-void ThreadProxy::InitializeOutputSurfaceOnImplThread( |
- scoped_ptr<OutputSurface> output_surface) { |
- TRACE_EVENT0("cc", "ThreadProxy::InitializeOutputSurfaceOnImplThread"); |
- DCHECK(IsImplThread()); |
- |
- 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(); |
- } |
- |
- 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) { |
@@ -1290,7 +1297,6 @@ |
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(); |