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

Side by Side Diff: cc/resources/raster_worker_pool.cc

Issue 523243002: cc: Generalize raster task notifications (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/raster_worker_pool.h" 5 #include "cc/resources/raster_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/debug/trace_event_synthetic_delay.h" 9 #include "base/debug/trace_event_synthetic_delay.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "base/threading/simple_thread.h" 12 #include "base/threading/simple_thread.h"
13 #include "cc/base/scoped_ptr_deque.h" 13 #include "cc/base/scoped_ptr_deque.h"
14 14
15 namespace cc { 15 namespace cc {
16 namespace { 16 namespace {
17 17
18 class RasterTaskGraphRunner : public TaskGraphRunner, 18 class RasterTaskGraphRunner : public TaskGraphRunner,
19 public base::DelegateSimpleThread::Delegate { 19 public base::DelegateSimpleThread::Delegate {
20 public: 20 public:
21 RasterTaskGraphRunner() 21 RasterTaskGraphRunner() {
22 : synthetic_delay_(base::debug::TraceEventSyntheticDelay::Lookup(
23 "cc.RasterRequiredForActivation")) {
24 size_t num_threads = RasterWorkerPool::GetNumRasterThreads(); 22 size_t num_threads = RasterWorkerPool::GetNumRasterThreads();
25 while (workers_.size() < num_threads) { 23 while (workers_.size() < num_threads) {
26 scoped_ptr<base::DelegateSimpleThread> worker = 24 scoped_ptr<base::DelegateSimpleThread> worker =
27 make_scoped_ptr(new base::DelegateSimpleThread( 25 make_scoped_ptr(new base::DelegateSimpleThread(
28 this, 26 this,
29 base::StringPrintf("CompositorRasterWorker%u", 27 base::StringPrintf("CompositorRasterWorker%u",
30 static_cast<unsigned>(workers_.size() + 1)) 28 static_cast<unsigned>(workers_.size() + 1))
31 .c_str())); 29 .c_str()));
32 worker->Start(); 30 worker->Start();
33 #if defined(OS_ANDROID) || defined(OS_LINUX) 31 #if defined(OS_ANDROID) || defined(OS_LINUX)
34 worker->SetThreadPriority(base::kThreadPriority_Background); 32 worker->SetThreadPriority(base::kThreadPriority_Background);
35 #endif 33 #endif
36 workers_.push_back(worker.Pass()); 34 workers_.push_back(worker.Pass());
37 } 35 }
38 } 36 }
39 37
40 virtual ~RasterTaskGraphRunner() { NOTREACHED(); } 38 virtual ~RasterTaskGraphRunner() { NOTREACHED(); }
41 39
42 base::debug::TraceEventSyntheticDelay* synthetic_delay() {
43 return synthetic_delay_;
44 }
45
46 private: 40 private:
47 // Overridden from base::DelegateSimpleThread::Delegate: 41 // Overridden from base::DelegateSimpleThread::Delegate:
48 virtual void Run() OVERRIDE { 42 virtual void Run() OVERRIDE {
49 TaskGraphRunner::Run(); 43 TaskGraphRunner::Run();
50 } 44 }
51 45
52 ScopedPtrDeque<base::DelegateSimpleThread> workers_; 46 ScopedPtrDeque<base::DelegateSimpleThread> workers_;
53 base::debug::TraceEventSyntheticDelay* synthetic_delay_;
54 }; 47 };
55 48
56 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = 49 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner =
57 LAZY_INSTANCE_INITIALIZER; 50 LAZY_INSTANCE_INITIALIZER;
58 51
59 const int kDefaultNumRasterThreads = 1; 52 const int kDefaultNumRasterThreads = 1;
60 53
61 int g_num_raster_threads = 0; 54 int g_num_raster_threads = 0;
62 55
63 class RasterFinishedTaskImpl : public RasterizerTask { 56 class RasterFinishedTaskImpl : public RasterizerTask {
64 public: 57 public:
65 explicit RasterFinishedTaskImpl( 58 explicit RasterFinishedTaskImpl(
66 base::SequencedTaskRunner* task_runner, 59 base::SequencedTaskRunner* task_runner,
67 const base::Closure& on_raster_finished_callback) 60 const base::Closure& on_raster_finished_callback,
61 base::debug::TraceEventSyntheticDelay* synthetic_delay)
68 : task_runner_(task_runner), 62 : task_runner_(task_runner),
69 on_raster_finished_callback_(on_raster_finished_callback) {} 63 on_raster_finished_callback_(on_raster_finished_callback),
64 synthetic_delay_(synthetic_delay) {
65 if (synthetic_delay_)
66 synthetic_delay_->BeginParallel(&activation_delay_end_time_);
67 }
70 68
71 // Overridden from Task: 69 // Overridden from Task:
72 virtual void RunOnWorkerThread() OVERRIDE { 70 virtual void RunOnWorkerThread() OVERRIDE {
73 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread"); 71 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread");
72
73 if (synthetic_delay_)
74 synthetic_delay_->EndParallel(activation_delay_end_time_);
74 RasterFinished(); 75 RasterFinished();
75 } 76 }
76 77
77 // Overridden from RasterizerTask: 78 // Overridden from RasterizerTask:
78 virtual void ScheduleOnOriginThread(RasterizerTaskClient* client) OVERRIDE {} 79 virtual void ScheduleOnOriginThread(RasterizerTaskClient* client) OVERRIDE {}
79 virtual void CompleteOnOriginThread(RasterizerTaskClient* client) OVERRIDE {} 80 virtual void CompleteOnOriginThread(RasterizerTaskClient* client) OVERRIDE {}
80 virtual void RunReplyOnOriginThread() OVERRIDE {} 81 virtual void RunReplyOnOriginThread() OVERRIDE {}
81 82
82 protected: 83 protected:
83 virtual ~RasterFinishedTaskImpl() {} 84 virtual ~RasterFinishedTaskImpl() {}
84 85
85 void RasterFinished() { 86 void RasterFinished() {
86 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_); 87 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_);
87 } 88 }
88 89
89 private: 90 private:
90 scoped_refptr<base::SequencedTaskRunner> task_runner_; 91 scoped_refptr<base::SequencedTaskRunner> task_runner_;
91 const base::Closure on_raster_finished_callback_; 92 const base::Closure on_raster_finished_callback_;
93 base::debug::TraceEventSyntheticDelay* synthetic_delay_;
94 base::TimeTicks activation_delay_end_time_;
92 95
93 DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl); 96 DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl);
94 }; 97 };
95 98
96 class RasterRequiredForActivationFinishedTaskImpl
97 : public RasterFinishedTaskImpl {
98 public:
99 RasterRequiredForActivationFinishedTaskImpl(
100 base::SequencedTaskRunner* task_runner,
101 const base::Closure& on_raster_finished_callback,
102 size_t tasks_required_for_activation_count)
103 : RasterFinishedTaskImpl(task_runner, on_raster_finished_callback),
104 tasks_required_for_activation_count_(
105 tasks_required_for_activation_count) {
106 if (tasks_required_for_activation_count_) {
107 g_task_graph_runner.Get().synthetic_delay()->BeginParallel(
108 &activation_delay_end_time_);
109 }
110 }
111
112 // Overridden from Task:
113 virtual void RunOnWorkerThread() OVERRIDE {
114 TRACE_EVENT0(
115 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnWorkerThread");
116
117 if (tasks_required_for_activation_count_) {
118 g_task_graph_runner.Get().synthetic_delay()->EndParallel(
119 activation_delay_end_time_);
120 }
121 RasterFinished();
122 }
123
124 private:
125 virtual ~RasterRequiredForActivationFinishedTaskImpl() {}
126
127 base::TimeTicks activation_delay_end_time_;
128 const size_t tasks_required_for_activation_count_;
129
130 DISALLOW_COPY_AND_ASSIGN(RasterRequiredForActivationFinishedTaskImpl);
131 };
132
133 } // namespace 99 } // namespace
134 100
135 // This allows an external rasterize on-demand system to run raster tasks 101 // This allows an external rasterize on-demand system to run raster tasks
136 // with highest priority using the same task graph runner instance. 102 // with highest priority using the same task graph runner instance.
137 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; 103 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u;
138 // This allows a micro benchmark system to run tasks with highest priority, 104 // This allows a micro benchmark system to run tasks with highest priority,
139 // since it should finish as quickly as possible. 105 // since it should finish as quickly as possible.
140 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u; 106 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u;
141 // Task priorities that make sure raster finished tasks run before any 107 // Task priorities that make sure raster finished tasks run before any
142 // remaining raster tasks. 108 // remaining raster tasks.
143 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; 109 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u;
144 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = 110 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority =
reveman 2014/09/05 08:38:59 remove
ernstm 2014/09/05 21:36:11 Done.
145 1u; 111 1u;
112 unsigned RasterWorkerPool::kRasterTaskSetFinishedTaskPriority = 1u;
146 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; 113 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u;
147 114
148 RasterWorkerPool::RasterWorkerPool() {} 115 RasterWorkerPool::RasterWorkerPool() {}
149 116
150 RasterWorkerPool::~RasterWorkerPool() {} 117 RasterWorkerPool::~RasterWorkerPool() {}
151 118
152 // static 119 // static
153 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { 120 void RasterWorkerPool::SetNumRasterThreads(int num_threads) {
154 DCHECK_LT(0, num_threads); 121 DCHECK_LT(0, num_threads);
155 DCHECK_EQ(0, g_num_raster_threads); 122 DCHECK_EQ(0, g_num_raster_threads);
(...skipping 10 matching lines...) Expand all
166 } 133 }
167 134
168 // static 135 // static
169 TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { 136 TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() {
170 return g_task_graph_runner.Pointer(); 137 return g_task_graph_runner.Pointer();
171 } 138 }
172 139
173 // static 140 // static
174 scoped_refptr<RasterizerTask> RasterWorkerPool::CreateRasterFinishedTask( 141 scoped_refptr<RasterizerTask> RasterWorkerPool::CreateRasterFinishedTask(
175 base::SequencedTaskRunner* task_runner, 142 base::SequencedTaskRunner* task_runner,
176 const base::Closure& on_raster_finished_callback) { 143 const base::Closure& on_raster_finished_callback,
177 return make_scoped_refptr( 144 base::debug::TraceEventSyntheticDelay* synthetic_delay) {
178 new RasterFinishedTaskImpl(task_runner, on_raster_finished_callback)); 145 return make_scoped_refptr(new RasterFinishedTaskImpl(
146 task_runner, on_raster_finished_callback, synthetic_delay));
179 } 147 }
180 148
181 // static 149 // static
182 scoped_refptr<RasterizerTask>
183 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask(
184 size_t tasks_required_for_activation_count,
185 base::SequencedTaskRunner* task_runner,
186 const base::Closure& on_raster_finished_callback) {
187 return make_scoped_refptr(new RasterRequiredForActivationFinishedTaskImpl(
188 task_runner,
189 on_raster_finished_callback,
190 tasks_required_for_activation_count));
191 }
192
193 // static
194 void RasterWorkerPool::ScheduleTasksOnOriginThread(RasterizerTaskClient* client, 150 void RasterWorkerPool::ScheduleTasksOnOriginThread(RasterizerTaskClient* client,
195 TaskGraph* graph) { 151 TaskGraph* graph) {
196 TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread"); 152 TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread");
197 153
198 for (TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); 154 for (TaskGraph::Node::Vector::iterator it = graph->nodes.begin();
199 it != graph->nodes.end(); 155 it != graph->nodes.end();
200 ++it) { 156 ++it) {
201 TaskGraph::Node& node = *it; 157 TaskGraph::Node& node = *it;
202 RasterizerTask* task = static_cast<RasterizerTask*>(node.task); 158 RasterizerTask* task = static_cast<RasterizerTask*>(node.task);
203 159
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 if (decode_it == graph->nodes.end()) 205 if (decode_it == graph->nodes.end())
250 InsertNodeForTask(graph, decode_task, priority, 0u); 206 InsertNodeForTask(graph, decode_task, priority, 0u);
251 207
252 graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task)); 208 graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task));
253 } 209 }
254 210
255 InsertNodeForTask(graph, raster_task, priority, dependencies); 211 InsertNodeForTask(graph, raster_task, priority, dependencies);
256 } 212 }
257 213
258 } // namespace cc 214 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698