| Index: content/renderer/render_thread_impl.cc
|
| diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
|
| index 00a93c53596096ac5727427ff25b1c1e0799ead4..968f56097e7893a51abeaf2d93f2d763efffb467 100644
|
| --- a/content/renderer/render_thread_impl.cc
|
| +++ b/content/renderer/render_thread_impl.cc
|
| @@ -24,6 +24,7 @@
|
| #include "base/strings/string_tokenizer.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "base/threading/simple_thread.h"
|
| #include "base/threading/thread_local.h"
|
| #include "base/threading/thread_restrictions.h"
|
| #include "base/trace_event/trace_event.h"
|
| @@ -252,6 +253,22 @@ class RenderViewZoomer : public RenderViewVisitor {
|
| DISALLOW_COPY_AND_ASSIGN(RenderViewZoomer);
|
| };
|
|
|
| +class CompositorRasterThread : public base::SimpleThread {
|
| + public:
|
| + CompositorRasterThread(cc::TaskGraphRunner* task_graph_runner,
|
| + const std::string& name_prefix)
|
| + : base::SimpleThread(name_prefix),
|
| + task_graph_runner_(task_graph_runner) {}
|
| +
|
| + // Overridden from base::SimpleThread:
|
| + void Run() override { task_graph_runner_->Run(); }
|
| +
|
| + private:
|
| + cc::TaskGraphRunner* task_graph_runner_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CompositorRasterThread);
|
| +};
|
| +
|
| std::string HostToCustomHistogramSuffix(const std::string& host) {
|
| if (host == "mail.google.com")
|
| return ".gmail";
|
| @@ -620,6 +637,10 @@ void RenderThreadImpl::Init() {
|
| memory_pressure_listener_.reset(new base::MemoryPressureListener(
|
| base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this))));
|
|
|
| + compositor_task_graph_runner_.reset(new cc::TaskGraphRunner);
|
| +
|
| + is_gather_pixel_refs_enabled_ = false;
|
| +
|
| if (is_impl_side_painting_enabled_) {
|
| int num_raster_threads = 0;
|
| std::string string_value =
|
| @@ -629,19 +650,30 @@ void RenderThreadImpl::Init() {
|
| DCHECK(parsed_num_raster_threads) << string_value;
|
| DCHECK_GT(num_raster_threads, 0);
|
|
|
| - // In single process, browser compositor already initialized and set up
|
| - // worker threads, can't change the number later for the renderer compistor
|
| - // in the same process.
|
| - if (!command_line.HasSwitch(switches::kSingleProcess))
|
| - cc::TileTaskWorkerPool::SetNumWorkerThreads(num_raster_threads);
|
| -
|
| + // Note: Currently, gathering of pixel refs when using a single
|
| + // raster thread doesn't provide any benefit. This might change
|
| + // in the future but we avoid it for now to reduce the cost of
|
| + // Picture::Create.
|
| + is_gather_pixel_refs_enabled_ = num_raster_threads > 1;
|
| +
|
| + while (compositor_raster_threads_.size() <
|
| + static_cast<size_t>(num_raster_threads)) {
|
| + scoped_ptr<CompositorRasterThread> raster_thread(
|
| + new CompositorRasterThread(
|
| + compositor_task_graph_runner_.get(),
|
| + base::StringPrintf(
|
| + "CompositorWorker%u",
|
| + static_cast<unsigned>(compositor_raster_threads_.size() + 1))
|
| + .c_str()));
|
| + raster_thread->Start();
|
| #if defined(OS_ANDROID) || defined(OS_LINUX)
|
| - if (!command_line.HasSwitch(
|
| - switches::kUseNormalPriorityForTileTaskWorkerThreads)) {
|
| - cc::TileTaskWorkerPool::SetWorkerThreadPriority(
|
| - base::kThreadPriority_Background);
|
| - }
|
| + if (!command_line.HasSwitch(
|
| + switches::kUseNormalPriorityForTileTaskWorkerThreads)) {
|
| + raster_thread->SetThreadPriority(base::kThreadPriority_Background);
|
| + }
|
| #endif
|
| + compositor_raster_threads_.push_back(raster_thread.Pass());
|
| + }
|
| }
|
|
|
| // In single process, browser main loop set up the discardable memory
|
| @@ -722,6 +754,14 @@ void RenderThreadImpl::Shutdown() {
|
|
|
| compositor_thread_.reset();
|
|
|
| + // Shutdown raster threads.
|
| + compositor_task_graph_runner_->Shutdown();
|
| + while (!compositor_raster_threads_.empty()) {
|
| + compositor_raster_threads_.back()->Join();
|
| + compositor_raster_threads_.pop_back();
|
| + }
|
| + compositor_task_graph_runner_.reset();
|
| +
|
| main_input_callback_.Cancel();
|
| input_handler_manager_.reset();
|
| if (input_event_filter_.get()) {
|
| @@ -1404,6 +1444,14 @@ RenderThreadImpl::CreateExternalBeginFrameSource(int routing_id) {
|
| compositor_message_filter_.get(), sync_message_filter(), routing_id));
|
| }
|
|
|
| +cc::TaskGraphRunner* RenderThreadImpl::GetTaskGraphRunner() {
|
| + return compositor_task_graph_runner_.get();
|
| +}
|
| +
|
| +bool RenderThreadImpl::IsGatherPixelRefsEnabled() {
|
| + return is_gather_pixel_refs_enabled_;
|
| +}
|
| +
|
| bool RenderThreadImpl::IsMainThread() {
|
| return !!current();
|
| }
|
|
|