| 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();
|
|
|