diff options
author | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-22 19:33:16 +0000 |
---|---|---|
committer | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-22 19:33:16 +0000 |
commit | 40c4518bef9af892b9c63bdf69069c58c243d89b (patch) | |
tree | ca70b98dcf090f258d6c2fdb2b653349be2dd2d9 /cc | |
parent | 4aa7fb46570f821ca444db783db3bb9f6b2779d2 (diff) | |
download | chromium_src-40c4518bef9af892b9c63bdf69069c58c243d89b.zip chromium_src-40c4518bef9af892b9c63bdf69069c58c243d89b.tar.gz chromium_src-40c4518bef9af892b9c63bdf69069c58c243d89b.tar.bz2 |
cc: Stop blocking the main thread in CreateAndInitializeOutputSurface.
The ThreadProxy does not need to block the main thread anymore, instead
have it post back DidInitializeOutputSurface() with the result of the
process.
We would delete all contents textures on the compositor thread during
OutputSurface creation, which doesn't really make sense, cuz the
ResourceProvider won't be the same one anymore, and this required
blocking the thread.
We also notified the main thread that the OutputSurface was lost when
creating the new output surface.
Instead, post a DidLoseOutputSurface() to the main thread to inform
the LayerTreeHost right away, and have that block and clean up
the contents textures immediately (to be removed when we always do
impl-side painting).
R=enne
BUG=374287
Review URL: https://codereview.chromium.org/287193003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@272276 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/scheduler/scheduler.h | 3 | ||||
-rw-r--r-- | cc/trees/thread_proxy.cc | 138 | ||||
-rw-r--r-- | cc/trees/thread_proxy.h | 13 |
3 files changed, 72 insertions, 82 deletions
diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h index a80d449..d67a017 100644 --- a/cc/scheduler/scheduler.h +++ b/cc/scheduler/scheduler.h @@ -94,9 +94,6 @@ class CC_EXPORT Scheduler { void DidManageTiles(); void DidLoseOutputSurface(); void DidCreateAndInitializeOutputSurface(); - bool HasInitializedOutputSurface() const { - return state_machine_.HasInitializedOutputSurface(); - } bool CommitPending() const { return state_machine_.CommitPending(); } bool RedrawPending() const { return state_machine_.RedrawPending(); } diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc index d727ace..dbbc779 100644 --- a/cc/trees/thread_proxy.cc +++ b/cc/trees/thread_proxy.cc @@ -194,40 +194,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_)); } } @@ -308,6 +327,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(); } @@ -1191,42 +1213,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()); @@ -1259,31 +1245,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) { @@ -1297,6 +1290,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(); diff --git a/cc/trees/thread_proxy.h b/cc/trees/thread_proxy.h index 134d5c5..cce2f33 100644 --- a/cc/trees/thread_proxy.h +++ b/cc/trees/thread_proxy.h @@ -71,7 +71,6 @@ class CC_EXPORT ThreadProxy : public Proxy, bool can_cancel_commit; bool defer_commits; - base::CancelableClosure output_surface_creation_callback; RendererCapabilities renderer_capabilities_main_thread_copy; scoped_ptr<BeginMainFrameAndCommitState> pending_deferred_commit; @@ -242,8 +241,10 @@ class CC_EXPORT ThreadProxy : public Proxy, void DidCommitAndDrawFrame(); void DidCompleteSwapBuffers(); void SetAnimationEvents(scoped_ptr<AnimationEventsVector> queue); + void DidLoseOutputSurface(); void CreateAndInitializeOutputSurface(); - void DoCreateAndInitializeOutputSurface(); + void DidInitializeOutputSurface(bool success, + const RendererCapabilities& capabilities); void SendCommitRequestToImplThreadIfNeeded(); // Called on impl thread. @@ -261,11 +262,9 @@ class CC_EXPORT ThreadProxy : public Proxy, void HasInitializedOutputSurfaceOnImplThread( CompletionEvent* completion, bool* has_initialized_output_surface); - virtual void InitializeOutputSurfaceOnImplThread( - CompletionEvent* completion, - scoped_ptr<OutputSurface> output_surface, - bool* success, - RendererCapabilities* capabilities); + void DeleteContentsTexturesOnImplThread(CompletionEvent* completion); + void InitializeOutputSurfaceOnImplThread( + scoped_ptr<OutputSurface> output_surface); void FinishGLOnImplThread(CompletionEvent* completion); void LayerTreeHostClosedOnImplThread(CompletionEvent* completion); DrawResult DrawSwapInternal(bool forced_draw); |