| OLD | NEW |
| 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/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
| 10 #include "base/debug/trace_event_synthetic_delay.h" | 10 #include "base/debug/trace_event_synthetic_delay.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 base::ThreadLocalPointer<ThreadLocalState> current_tls_; | 78 base::ThreadLocalPointer<ThreadLocalState> current_tls_; |
| 79 }; | 79 }; |
| 80 | 80 |
| 81 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = | 81 base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner = |
| 82 LAZY_INSTANCE_INITIALIZER; | 82 LAZY_INSTANCE_INITIALIZER; |
| 83 | 83 |
| 84 const int kDefaultNumRasterThreads = 1; | 84 const int kDefaultNumRasterThreads = 1; |
| 85 | 85 |
| 86 int g_num_raster_threads = 0; | 86 int g_num_raster_threads = 0; |
| 87 | 87 |
| 88 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 88 class RasterFinishedTaskImpl : public internal::RasterizerTask { |
| 89 public: | 89 public: |
| 90 explicit RasterFinishedWorkerPoolTaskImpl( | 90 explicit RasterFinishedTaskImpl( |
| 91 base::SequencedTaskRunner* task_runner, | 91 base::SequencedTaskRunner* task_runner, |
| 92 const base::Closure& on_raster_finished_callback) | 92 const base::Closure& on_raster_finished_callback) |
| 93 : task_runner_(task_runner), | 93 : task_runner_(task_runner), |
| 94 on_raster_finished_callback_(on_raster_finished_callback) {} | 94 on_raster_finished_callback_(on_raster_finished_callback) {} |
| 95 | 95 |
| 96 // Overridden from internal::Task: | 96 // Overridden from internal::Task: |
| 97 virtual void RunOnWorkerThread() OVERRIDE { | 97 virtual void RunOnWorkerThread() OVERRIDE { |
| 98 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); | 98 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread"); |
| 99 RasterFinished(); | 99 RasterFinished(); |
| 100 } | 100 } |
| 101 | 101 |
| 102 // Overridden from internal::WorkerPoolTask: | 102 // Overridden from internal::RasterizerTask: |
| 103 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 103 virtual void ScheduleOnOriginThread(internal::RasterizerTaskClient* client) |
| 104 OVERRIDE {} | 104 OVERRIDE {} |
| 105 virtual void RunOnOriginThread() OVERRIDE { | 105 virtual void RunOnOriginThread() OVERRIDE { |
| 106 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread"); | 106 TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnOriginThread"); |
| 107 RasterFinished(); | 107 RasterFinished(); |
| 108 } | 108 } |
| 109 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 109 virtual void CompleteOnOriginThread(internal::RasterizerTaskClient* client) |
| 110 OVERRIDE {} | 110 OVERRIDE {} |
| 111 virtual void RunReplyOnOriginThread() OVERRIDE {} | 111 virtual void RunReplyOnOriginThread() OVERRIDE {} |
| 112 | 112 |
| 113 protected: | 113 protected: |
| 114 virtual ~RasterFinishedWorkerPoolTaskImpl() {} | 114 virtual ~RasterFinishedTaskImpl() {} |
| 115 | 115 |
| 116 void RasterFinished() { | 116 void RasterFinished() { |
| 117 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_); | 117 task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_); |
| 118 } | 118 } |
| 119 | 119 |
| 120 private: | 120 private: |
| 121 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 121 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| 122 const base::Closure on_raster_finished_callback_; | 122 const base::Closure on_raster_finished_callback_; |
| 123 | 123 |
| 124 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); | 124 DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl); |
| 125 }; | 125 }; |
| 126 | 126 |
| 127 class RasterRequiredForActivationFinishedWorkerPoolTaskImpl | 127 class RasterRequiredForActivationFinishedTaskImpl |
| 128 : public RasterFinishedWorkerPoolTaskImpl { | 128 : public RasterFinishedTaskImpl { |
| 129 public: | 129 public: |
| 130 RasterRequiredForActivationFinishedWorkerPoolTaskImpl( | 130 RasterRequiredForActivationFinishedTaskImpl( |
| 131 base::SequencedTaskRunner* task_runner, | 131 base::SequencedTaskRunner* task_runner, |
| 132 const base::Closure& on_raster_finished_callback, | 132 const base::Closure& on_raster_finished_callback, |
| 133 size_t tasks_required_for_activation_count) | 133 size_t tasks_required_for_activation_count) |
| 134 : RasterFinishedWorkerPoolTaskImpl(task_runner, | 134 : RasterFinishedTaskImpl(task_runner, on_raster_finished_callback), |
| 135 on_raster_finished_callback), | |
| 136 tasks_required_for_activation_count_( | 135 tasks_required_for_activation_count_( |
| 137 tasks_required_for_activation_count) { | 136 tasks_required_for_activation_count) { |
| 138 if (tasks_required_for_activation_count_) { | 137 if (tasks_required_for_activation_count_) { |
| 139 g_raster_required_for_activation_delay.Get().delay->BeginParallel( | 138 g_raster_required_for_activation_delay.Get().delay->BeginParallel( |
| 140 &activation_delay_end_time_); | 139 &activation_delay_end_time_); |
| 141 } | 140 } |
| 142 } | 141 } |
| 143 | 142 |
| 144 // Overridden from internal::Task: | 143 // Overridden from internal::Task: |
| 145 virtual void RunOnWorkerThread() OVERRIDE { | 144 virtual void RunOnWorkerThread() OVERRIDE { |
| 146 TRACE_EVENT0("cc", | 145 TRACE_EVENT0( |
| 147 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::" | 146 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnWorkerThread"); |
| 148 "RunOnWorkerThread"); | |
| 149 RunRasterFinished(); | 147 RunRasterFinished(); |
| 150 } | 148 } |
| 151 | 149 |
| 152 // Overridden from internal::WorkerPoolTask: | 150 // Overridden from internal::RasterizerTask: |
| 153 virtual void RunOnOriginThread() OVERRIDE { | 151 virtual void RunOnOriginThread() OVERRIDE { |
| 154 TRACE_EVENT0("cc", | 152 TRACE_EVENT0( |
| 155 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::" | 153 "cc", "RasterRequiredForActivationFinishedTaskImpl::RunOnOriginThread"); |
| 156 "RunOnOriginThread"); | |
| 157 RunRasterFinished(); | 154 RunRasterFinished(); |
| 158 } | 155 } |
| 159 | 156 |
| 160 private: | 157 private: |
| 161 virtual ~RasterRequiredForActivationFinishedWorkerPoolTaskImpl() {} | 158 virtual ~RasterRequiredForActivationFinishedTaskImpl() {} |
| 162 | 159 |
| 163 void RunRasterFinished() { | 160 void RunRasterFinished() { |
| 164 if (tasks_required_for_activation_count_) { | 161 if (tasks_required_for_activation_count_) { |
| 165 g_raster_required_for_activation_delay.Get().delay->EndParallel( | 162 g_raster_required_for_activation_delay.Get().delay->EndParallel( |
| 166 activation_delay_end_time_); | 163 activation_delay_end_time_); |
| 167 } | 164 } |
| 168 RasterFinished(); | 165 RasterFinished(); |
| 169 } | 166 } |
| 170 | 167 |
| 171 base::TimeTicks activation_delay_end_time_; | 168 base::TimeTicks activation_delay_end_time_; |
| 172 const size_t tasks_required_for_activation_count_; | 169 const size_t tasks_required_for_activation_count_; |
| 173 | 170 |
| 174 DISALLOW_COPY_AND_ASSIGN( | 171 DISALLOW_COPY_AND_ASSIGN(RasterRequiredForActivationFinishedTaskImpl); |
| 175 RasterRequiredForActivationFinishedWorkerPoolTaskImpl); | |
| 176 }; | 172 }; |
| 177 | 173 |
| 178 } // namespace | 174 } // namespace |
| 179 | 175 |
| 180 namespace internal { | |
| 181 | |
| 182 WorkerPoolTask::WorkerPoolTask() : did_schedule_(false), did_complete_(false) {} | |
| 183 | |
| 184 WorkerPoolTask::~WorkerPoolTask() { | |
| 185 DCHECK(!did_schedule_); | |
| 186 DCHECK(!did_run_ || did_complete_); | |
| 187 } | |
| 188 | |
| 189 void WorkerPoolTask::WillSchedule() { DCHECK(!did_schedule_); } | |
| 190 | |
| 191 void WorkerPoolTask::DidSchedule() { | |
| 192 did_schedule_ = true; | |
| 193 did_complete_ = false; | |
| 194 } | |
| 195 | |
| 196 bool WorkerPoolTask::HasBeenScheduled() const { return did_schedule_; } | |
| 197 | |
| 198 void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); } | |
| 199 | |
| 200 void WorkerPoolTask::DidComplete() { | |
| 201 DCHECK(did_schedule_); | |
| 202 DCHECK(!did_complete_); | |
| 203 did_schedule_ = false; | |
| 204 did_complete_ = true; | |
| 205 } | |
| 206 | |
| 207 bool WorkerPoolTask::HasCompleted() const { return did_complete_; } | |
| 208 | |
| 209 RasterWorkerPoolTask::RasterWorkerPoolTask( | |
| 210 const Resource* resource, | |
| 211 internal::WorkerPoolTask::Vector* dependencies) | |
| 212 : resource_(resource) { | |
| 213 dependencies_.swap(*dependencies); | |
| 214 } | |
| 215 | |
| 216 RasterWorkerPoolTask::~RasterWorkerPoolTask() {} | |
| 217 | |
| 218 } // namespace internal | |
| 219 | |
| 220 RasterTaskQueue::Item::Item(internal::RasterWorkerPoolTask* task, | |
| 221 bool required_for_activation) | |
| 222 : task(task), required_for_activation(required_for_activation) {} | |
| 223 | |
| 224 RasterTaskQueue::Item::~Item() {} | |
| 225 | |
| 226 RasterTaskQueue::RasterTaskQueue() : required_for_activation_count(0u) {} | |
| 227 | |
| 228 RasterTaskQueue::~RasterTaskQueue() {} | |
| 229 | |
| 230 void RasterTaskQueue::Swap(RasterTaskQueue* other) { | |
| 231 items.swap(other->items); | |
| 232 std::swap(required_for_activation_count, | |
| 233 other->required_for_activation_count); | |
| 234 } | |
| 235 | |
| 236 void RasterTaskQueue::Reset() { | |
| 237 required_for_activation_count = 0u; | |
| 238 items.clear(); | |
| 239 } | |
| 240 | |
| 241 // This allows an external rasterize on-demand system to run raster tasks | 176 // This allows an external rasterize on-demand system to run raster tasks |
| 242 // with highest priority using the same task graph runner instance. | 177 // with highest priority using the same task graph runner instance. |
| 243 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; | 178 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; |
| 244 // This allows a micro benchmark system to run tasks with highest priority, | 179 // This allows a micro benchmark system to run tasks with highest priority, |
| 245 // since it should finish as quickly as possible. | 180 // since it should finish as quickly as possible. |
| 246 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u; | 181 unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u; |
| 247 // Task priorities that make sure raster finished tasks run before any | 182 // Task priorities that make sure raster finished tasks run before any |
| 248 // remaining raster tasks. | 183 // remaining raster tasks. |
| 249 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; | 184 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; |
| 250 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = | 185 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = |
| 251 1u; | 186 1u; |
| 252 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; | 187 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; |
| 253 | 188 |
| 189 RasterWorkerPool::RasterWorkerPool() {} |
| 190 |
| 191 RasterWorkerPool::~RasterWorkerPool() {} |
| 192 |
| 254 // static | 193 // static |
| 255 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { | 194 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { |
| 256 DCHECK_LT(0, num_threads); | 195 DCHECK_LT(0, num_threads); |
| 257 DCHECK_EQ(0, g_num_raster_threads); | 196 DCHECK_EQ(0, g_num_raster_threads); |
| 258 | 197 |
| 259 g_num_raster_threads = num_threads; | 198 g_num_raster_threads = num_threads; |
| 260 } | 199 } |
| 261 | 200 |
| 262 // static | 201 // static |
| 263 int RasterWorkerPool::GetNumRasterThreads() { | 202 int RasterWorkerPool::GetNumRasterThreads() { |
| 264 if (!g_num_raster_threads) | 203 if (!g_num_raster_threads) |
| 265 g_num_raster_threads = kDefaultNumRasterThreads; | 204 g_num_raster_threads = kDefaultNumRasterThreads; |
| 266 | 205 |
| 267 return g_num_raster_threads; | 206 return g_num_raster_threads; |
| 268 } | 207 } |
| 269 | 208 |
| 270 // static | 209 // static |
| 271 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { | 210 internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { |
| 272 return g_task_graph_runner.Pointer(); | 211 return g_task_graph_runner.Pointer(); |
| 273 } | 212 } |
| 274 | 213 |
| 275 // static | 214 // static |
| 276 size_t RasterWorkerPool::GetPictureCloneIndexForCurrentThread() { | 215 size_t RasterWorkerPool::GetPictureCloneIndexForCurrentThread() { |
| 277 return g_task_graph_runner.Pointer()->GetPictureCloneIndexForCurrentThread(); | 216 return g_task_graph_runner.Pointer()->GetPictureCloneIndexForCurrentThread(); |
| 278 } | 217 } |
| 279 | 218 |
| 280 // static | 219 // static |
| 281 scoped_refptr<internal::WorkerPoolTask> | 220 scoped_refptr<internal::RasterizerTask> |
| 282 RasterWorkerPool::CreateRasterFinishedTask( | 221 RasterWorkerPool::CreateRasterFinishedTask( |
| 283 base::SequencedTaskRunner* task_runner, | 222 base::SequencedTaskRunner* task_runner, |
| 284 const base::Closure& on_raster_finished_callback) { | 223 const base::Closure& on_raster_finished_callback) { |
| 285 return make_scoped_refptr(new RasterFinishedWorkerPoolTaskImpl( | 224 return make_scoped_refptr( |
| 286 task_runner, on_raster_finished_callback)); | 225 new RasterFinishedTaskImpl(task_runner, on_raster_finished_callback)); |
| 287 } | 226 } |
| 288 | 227 |
| 289 // static | 228 // static |
| 290 scoped_refptr<internal::WorkerPoolTask> | 229 scoped_refptr<internal::RasterizerTask> |
| 291 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( | 230 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( |
| 292 size_t tasks_required_for_activation_count, | 231 size_t tasks_required_for_activation_count, |
| 293 base::SequencedTaskRunner* task_runner, | 232 base::SequencedTaskRunner* task_runner, |
| 294 const base::Closure& on_raster_finished_callback) { | 233 const base::Closure& on_raster_finished_callback) { |
| 295 return make_scoped_refptr( | 234 return make_scoped_refptr(new RasterRequiredForActivationFinishedTaskImpl( |
| 296 new RasterRequiredForActivationFinishedWorkerPoolTaskImpl( | 235 task_runner, |
| 297 task_runner, | 236 on_raster_finished_callback, |
| 298 on_raster_finished_callback, | 237 tasks_required_for_activation_count)); |
| 299 tasks_required_for_activation_count)); | |
| 300 } | 238 } |
| 301 | 239 |
| 302 // static | 240 // static |
| 303 void RasterWorkerPool::ScheduleTasksOnOriginThread( | 241 void RasterWorkerPool::ScheduleTasksOnOriginThread( |
| 304 internal::WorkerPoolTaskClient* client, | 242 internal::RasterizerTaskClient* client, |
| 305 internal::TaskGraph* graph) { | 243 internal::TaskGraph* graph) { |
| 306 TRACE_EVENT0("cc", "RasterWorkerPool::ScheduleTasksOnOriginThread"); | 244 TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread"); |
| 307 | 245 |
| 308 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); | 246 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); |
| 309 it != graph->nodes.end(); | 247 it != graph->nodes.end(); |
| 310 ++it) { | 248 ++it) { |
| 311 internal::TaskGraph::Node& node = *it; | 249 internal::TaskGraph::Node& node = *it; |
| 312 internal::WorkerPoolTask* task = | 250 internal::RasterizerTask* task = |
| 313 static_cast<internal::WorkerPoolTask*>(node.task); | 251 static_cast<internal::RasterizerTask*>(node.task); |
| 314 | 252 |
| 315 if (!task->HasBeenScheduled()) { | 253 if (!task->HasBeenScheduled()) { |
| 316 task->WillSchedule(); | 254 task->WillSchedule(); |
| 317 task->ScheduleOnOriginThread(client); | 255 task->ScheduleOnOriginThread(client); |
| 318 task->DidSchedule(); | 256 task->DidSchedule(); |
| 319 } | 257 } |
| 320 } | 258 } |
| 321 } | 259 } |
| 322 | 260 |
| 323 // static | 261 // static |
| 324 void RasterWorkerPool::InsertNodeForTask(internal::TaskGraph* graph, | 262 void RasterWorkerPool::InsertNodeForTask(internal::TaskGraph* graph, |
| 325 internal::WorkerPoolTask* task, | 263 internal::RasterizerTask* task, |
| 326 unsigned priority, | 264 unsigned priority, |
| 327 size_t dependencies) { | 265 size_t dependencies) { |
| 328 DCHECK(std::find_if(graph->nodes.begin(), | 266 DCHECK(std::find_if(graph->nodes.begin(), |
| 329 graph->nodes.end(), | 267 graph->nodes.end(), |
| 330 internal::TaskGraph::Node::TaskComparator(task)) == | 268 internal::TaskGraph::Node::TaskComparator(task)) == |
| 331 graph->nodes.end()); | 269 graph->nodes.end()); |
| 332 graph->nodes.push_back( | 270 graph->nodes.push_back( |
| 333 internal::TaskGraph::Node(task, priority, dependencies)); | 271 internal::TaskGraph::Node(task, priority, dependencies)); |
| 334 } | 272 } |
| 335 | 273 |
| 336 // static | 274 // static |
| 337 void RasterWorkerPool::InsertNodesForRasterTask( | 275 void RasterWorkerPool::InsertNodesForRasterTask( |
| 338 internal::TaskGraph* graph, | 276 internal::TaskGraph* graph, |
| 339 internal::WorkerPoolTask* raster_task, | 277 internal::RasterTask* raster_task, |
| 340 const internal::WorkerPoolTask::Vector& decode_tasks, | 278 const internal::ImageDecodeTask::Vector& decode_tasks, |
| 341 unsigned priority) { | 279 unsigned priority) { |
| 342 size_t dependencies = 0u; | 280 size_t dependencies = 0u; |
| 343 | 281 |
| 344 // Insert image decode tasks. | 282 // Insert image decode tasks. |
| 345 for (internal::WorkerPoolTask::Vector::const_iterator it = | 283 for (internal::ImageDecodeTask::Vector::const_iterator it = |
| 346 decode_tasks.begin(); | 284 decode_tasks.begin(); |
| 347 it != decode_tasks.end(); | 285 it != decode_tasks.end(); |
| 348 ++it) { | 286 ++it) { |
| 349 internal::WorkerPoolTask* decode_task = it->get(); | 287 internal::ImageDecodeTask* decode_task = it->get(); |
| 350 | 288 |
| 351 // Skip if already decoded. | 289 // Skip if already decoded. |
| 352 if (decode_task->HasCompleted()) | 290 if (decode_task->HasCompleted()) |
| 353 continue; | 291 continue; |
| 354 | 292 |
| 355 dependencies++; | 293 dependencies++; |
| 356 | 294 |
| 357 // Add decode task if it doesn't already exists in graph. | 295 // Add decode task if it doesn't already exists in graph. |
| 358 internal::TaskGraph::Node::Vector::iterator decode_it = | 296 internal::TaskGraph::Node::Vector::iterator decode_it = |
| 359 std::find_if(graph->nodes.begin(), | 297 std::find_if(graph->nodes.begin(), |
| 360 graph->nodes.end(), | 298 graph->nodes.end(), |
| 361 internal::TaskGraph::Node::TaskComparator(decode_task)); | 299 internal::TaskGraph::Node::TaskComparator(decode_task)); |
| 362 if (decode_it == graph->nodes.end()) | 300 if (decode_it == graph->nodes.end()) |
| 363 InsertNodeForTask(graph, decode_task, priority, 0u); | 301 InsertNodeForTask(graph, decode_task, priority, 0u); |
| 364 | 302 |
| 365 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); | 303 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); |
| 366 } | 304 } |
| 367 | 305 |
| 368 InsertNodeForTask(graph, raster_task, priority, dependencies); | 306 InsertNodeForTask(graph, raster_task, priority, dependencies); |
| 369 } | 307 } |
| 370 | 308 |
| 371 } // namespace cc | 309 } // namespace cc |
| OLD | NEW |