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

Unified Diff: cc/trees/thread_proxy.cc

Issue 299233002: Revert of cc: Stop blocking the main thread in CreateAndInitializeOutputSurface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 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();
« 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