Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2977)

Unified Diff: cc/trees/thread_proxy.cc

Issue 287193003: cc: Stop blocking the main thread in CreateAndInitializeOutputSurface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: threadproxy-nonblock-create: defer Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698