Chromium Code Reviews| Index: content/renderer/render_thread_impl.cc |
| diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
| index bf5b570c840af3fed38a5e152db7a250475ababd..610aabb504127767de0a31363c0fe3153bed8fcb 100644 |
| --- a/content/renderer/render_thread_impl.cc |
| +++ b/content/renderer/render_thread_impl.cc |
| @@ -26,6 +26,7 @@ |
| #include "base/strings/string_tokenizer.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "base/strings/utf_string_conversions.h" |
| +#include "base/synchronization/waitable_event.h" |
| #include "base/thread_task_runner_handle.h" |
| #include "base/threading/simple_thread.h" |
| #include "base/threading/thread_local.h" |
| @@ -39,7 +40,9 @@ |
| #include "cc/blink/web_layer_impl.h" |
| #include "cc/layers/layer_settings.h" |
| #include "cc/raster/task_graph_runner.h" |
| +#include "cc/trees/layer_tree_host_common.h" |
| #include "cc/trees/layer_tree_settings.h" |
| +#include "components/scheduler/child/webthread_base.h" |
| #include "components/scheduler/renderer/renderer_scheduler.h" |
| #include "content/child/appcache/appcache_dispatcher.h" |
| #include "content/child/appcache/appcache_frontend_impl.h" |
| @@ -846,6 +849,8 @@ void RenderThreadImpl::Shutdown() { |
| media_thread_.reset(); |
| + blink_platform_impl_->set_compositor_thread(nullptr); |
| + |
| compositor_thread_.reset(); |
| // AudioMessageFilter may be accessed on |media_thread_|, so shutdown after. |
| @@ -1052,6 +1057,70 @@ void RenderThreadImpl::SetResourceDispatchTaskQueue( |
| resource_dispatcher()->SetMainThreadTaskRunner(resource_task_queue); |
| } |
| +void RenderThreadImpl::InitializeCompositorThread() { |
| +#if defined(OS_ANDROID) |
| + SynchronousCompositorFactory* sync_compositor_factory = |
| + SynchronousCompositorFactory::GetInstance(); |
| + bool using_ipc_sync_compositing = |
| + base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kIPCSyncCompositing); |
| + DCHECK(!sync_compositor_factory || !using_ipc_sync_compositing); |
| + |
| + if (sync_compositor_factory) { |
| + compositor_task_runner_ = |
| + sync_compositor_factory->GetCompositorTaskRunner(); |
| + } |
| +#endif |
| + if (!compositor_task_runner_.get()) { |
| + base::Thread::Options options; |
| +#if defined(OS_ANDROID) |
| + options.priority = base::ThreadPriority::DISPLAY; |
| +#endif |
| + compositor_thread_.reset(static_cast<scheduler::WebThreadBase*>( |
| + blink_platform_impl_->createThreadWithOptions("Compositor", options))); |
| + compositor_task_runner_ = compositor_thread_->TaskRunner(); |
| + compositor_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(base::IgnoreResult(&ThreadRestrictions::SetIOAllowed), |
| + false)); |
| + // Need to ensure that we finish initializing the compositor thread before |
| + // setting it on |blink_platform_impl_|. This prevents the unfortunate |
| + // situation where the platform is torn down before initialization (which |
| + // depends on the platform) is done. |
| + base::WaitableEvent event(false, false); |
| + compositor_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event))); |
| + event.Wait(); |
|
piman
2015/12/01 23:44:41
Really sorry to be a pain, but can we move this lo
Ian Vollick
2015/12/02 00:26:40
Good point. Done.
|
| + |
| + blink_platform_impl_->set_compositor_thread(compositor_thread_.get()); |
| + } |
| + |
| + InputHandlerManagerClient* input_handler_manager_client = NULL; |
| +#if defined(OS_ANDROID) |
| + if (using_ipc_sync_compositing) { |
| + sync_compositor_message_filter_ = |
| + new SynchronousCompositorFilter(compositor_task_runner_); |
| + AddFilter(sync_compositor_message_filter_.get()); |
| + input_handler_manager_client = sync_compositor_message_filter_.get(); |
| + } else if (sync_compositor_factory) { |
| + input_handler_manager_client = |
| + sync_compositor_factory->GetInputHandlerManagerClient(); |
| + } |
| +#endif |
| + if (!input_handler_manager_client) { |
| + scoped_refptr<InputEventFilter> compositor_input_event_filter( |
| + new InputEventFilter(main_input_callback_.callback(), |
| + main_thread_compositor_task_runner_, |
| + compositor_task_runner_)); |
| + input_handler_manager_client = compositor_input_event_filter.get(); |
| + input_event_filter_ = compositor_input_event_filter; |
| + } |
| + input_handler_manager_.reset(new InputHandlerManager( |
| + compositor_task_runner_, input_handler_manager_client, |
| + renderer_scheduler_.get())); |
| +} |
| + |
| void RenderThreadImpl::EnsureWebKitInitialized() { |
| if (blink_platform_impl_) |
| return; |
| @@ -1082,60 +1151,8 @@ void RenderThreadImpl::EnsureWebKitInitialized() { |
| base::Unretained(this))); |
| SetResourceDispatchTaskQueue(renderer_scheduler_->LoadingTaskRunner()); |
| - |
| - bool enable = !command_line.HasSwitch(switches::kDisableThreadedCompositing); |
| - if (enable) { |
| -#if defined(OS_ANDROID) |
| - SynchronousCompositorFactory* sync_compositor_factory = |
| - SynchronousCompositorFactory::GetInstance(); |
| - bool using_ipc_sync_compositing = |
| - base::CommandLine::ForCurrentProcess()->HasSwitch( |
| - switches::kIPCSyncCompositing); |
| - DCHECK(!sync_compositor_factory || !using_ipc_sync_compositing); |
| - |
| - if (sync_compositor_factory) { |
| - compositor_task_runner_ = |
| - sync_compositor_factory->GetCompositorTaskRunner(); |
| - } |
| -#endif |
| - if (!compositor_task_runner_) { |
| - compositor_thread_.reset(new base::Thread("Compositor")); |
| - base::Thread::Options compositor_thread_options; |
| -#if defined(OS_ANDROID) |
| - compositor_thread_options.priority = base::ThreadPriority::DISPLAY; |
| -#endif |
| - compositor_thread_->StartWithOptions(compositor_thread_options); |
| - compositor_task_runner_ = compositor_thread_->task_runner(); |
| - compositor_task_runner_->PostTask( |
| - FROM_HERE, |
| - base::Bind(base::IgnoreResult(&ThreadRestrictions::SetIOAllowed), |
| - false)); |
| - } |
| - |
| - InputHandlerManagerClient* input_handler_manager_client = NULL; |
| -#if defined(OS_ANDROID) |
| - if (using_ipc_sync_compositing) { |
| - sync_compositor_message_filter_ = |
| - new SynchronousCompositorFilter(compositor_task_runner_); |
| - AddFilter(sync_compositor_message_filter_.get()); |
| - input_handler_manager_client = sync_compositor_message_filter_.get(); |
| - } else if (sync_compositor_factory) { |
| - input_handler_manager_client = |
| - sync_compositor_factory->GetInputHandlerManagerClient(); |
| - } |
| -#endif |
| - if (!input_handler_manager_client) { |
| - scoped_refptr<InputEventFilter> compositor_input_event_filter( |
| - new InputEventFilter(main_input_callback_.callback(), |
| - main_thread_compositor_task_runner_, |
| - compositor_task_runner_)); |
| - input_handler_manager_client = compositor_input_event_filter.get(); |
| - input_event_filter_ = compositor_input_event_filter; |
| - } |
| - input_handler_manager_.reset(new InputHandlerManager( |
| - compositor_task_runner_, input_handler_manager_client, |
| - renderer_scheduler_.get())); |
| - } |
| + if (!command_line.HasSwitch(switches::kDisableThreadedCompositing)) |
| + InitializeCompositorThread(); |
| if (!input_event_filter_.get()) { |
| // Always provide an input event filter implementation to ensure consistent |
| @@ -1148,7 +1165,7 @@ void RenderThreadImpl::EnsureWebKitInitialized() { |
| AddFilter(input_event_filter_.get()); |
| scoped_refptr<base::SingleThreadTaskRunner> compositor_impl_side_task_runner; |
| - if (enable) |
| + if (compositor_task_runner_) |
| compositor_impl_side_task_runner = compositor_task_runner_; |
| else |
| compositor_impl_side_task_runner = base::ThreadTaskRunnerHandle::Get(); |