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

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

Issue 17351017: Re-land: cc: Add raster finished signals to RasterWorkerPool. (Closed) Base URL: http://git.chromium.org/chromium/src.git@new-graph-build
Patch Set: hybrid approach Created 7 years, 5 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
« no previous file with comments | « cc/resources/pixel_buffer_raster_worker_pool.h ('k') | cc/resources/raster_worker_pool.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/pixel_buffer_raster_worker_pool.h" 5 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
6 6
7 #include <vector>
8
7 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
8 #include "cc/resources/resource.h" 10 #include "cc/resources/resource.h"
9 #include "third_party/skia/include/core/SkDevice.h" 11 #include "third_party/skia/include/core/SkDevice.h"
10 12
11 namespace cc { 13 namespace cc {
12 14
13 namespace { 15 namespace {
14 16
15 class PixelBufferWorkerPoolTaskImpl : public internal::WorkerPoolTask { 17 class PixelBufferWorkerPoolTaskImpl : public internal::WorkerPoolTask {
16 public: 18 public:
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 79
78 const int kCheckForCompletedRasterTasksDelayMs = 6; 80 const int kCheckForCompletedRasterTasksDelayMs = 6;
79 81
80 const size_t kMaxPendingRasterBytes = 82 const size_t kMaxPendingRasterBytes =
81 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs; 83 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs;
82 84
83 } // namespace 85 } // namespace
84 86
85 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( 87 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool(
86 ResourceProvider* resource_provider, 88 ResourceProvider* resource_provider,
87 size_t num_threads) : RasterWorkerPool(resource_provider, num_threads), 89 size_t num_threads)
88 shutdown_(false), 90 : RasterWorkerPool(resource_provider, num_threads),
89 bytes_pending_upload_(0), 91 shutdown_(false),
90 has_performed_uploads_since_last_flush_(false), 92 bytes_pending_upload_(0),
91 check_for_completed_raster_tasks_pending_(false) { 93 has_performed_uploads_since_last_flush_(false),
94 check_for_completed_raster_tasks_pending_(false),
95 finished_running_tasks_pending_(false),
96 finished_running_tasks_required_for_activation_pending_(false) {
92 } 97 }
93 98
94 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { 99 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() {
95 DCHECK(shutdown_); 100 DCHECK(shutdown_);
96 DCHECK(!check_for_completed_raster_tasks_pending_); 101 DCHECK(!check_for_completed_raster_tasks_pending_);
97 DCHECK_EQ(0u, pixel_buffer_tasks_.size()); 102 DCHECK_EQ(0u, pixel_buffer_tasks_.size());
98 DCHECK_EQ(0u, tasks_with_pending_upload_.size()); 103 DCHECK_EQ(0u, tasks_with_pending_upload_.size());
99 DCHECK_EQ(0u, completed_tasks_.size()); 104 DCHECK_EQ(0u, completed_tasks_.size());
100 } 105 }
101 106
102 void PixelBufferRasterWorkerPool::Shutdown() { 107 void PixelBufferRasterWorkerPool::Shutdown() {
103 shutdown_ = true; 108 shutdown_ = true;
104 RasterWorkerPool::Shutdown(); 109 RasterWorkerPool::Shutdown();
105 CheckForCompletedRasterTasks(); 110 RasterWorkerPool::CheckForCompletedTasks();
111 CheckForCompletedUploads();
112 check_for_completed_raster_tasks_callback_.Cancel();
113 check_for_completed_raster_tasks_pending_ = false;
106 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); 114 for (TaskMap::iterator it = pixel_buffer_tasks_.begin();
107 it != pixel_buffer_tasks_.end(); ++it) { 115 it != pixel_buffer_tasks_.end(); ++it) {
108 internal::RasterWorkerPoolTask* task = it->first; 116 internal::RasterWorkerPoolTask* task = it->first;
109 internal::WorkerPoolTask* pixel_buffer_task = it->second.get(); 117 internal::WorkerPoolTask* pixel_buffer_task = it->second.get();
110 118
111 // All inactive tasks needs to be canceled. 119 // All inactive tasks needs to be canceled.
112 if (!pixel_buffer_task && !task->HasFinishedRunning()) { 120 if (!pixel_buffer_task && !task->HasFinishedRunning()) {
113 task->DidRun(true); 121 task->DidRun(true);
114 completed_tasks_.push_back(task); 122 completed_tasks_.push_back(task);
115 } 123 }
116 } 124 }
125 DCHECK_EQ(completed_tasks_.size(), pixel_buffer_tasks_.size());
117 } 126 }
118 127
119 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { 128 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
120 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); 129 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks");
121 130
122 RasterWorkerPool::SetRasterTasks(queue); 131 RasterWorkerPool::SetRasterTasks(queue);
123 132
133 finished_running_tasks_pending_ = true;
134 finished_running_tasks_required_for_activation_pending_ = true;
135
124 // Build new pixel buffer task set. 136 // Build new pixel buffer task set.
125 TaskMap new_pixel_buffer_tasks; 137 TaskMap new_pixel_buffer_tasks;
126 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); 138 for (RasterTaskVector::const_iterator it = raster_tasks().begin();
127 it != raster_tasks().end(); ++it) { 139 it != raster_tasks().end(); ++it) {
128 internal::RasterWorkerPoolTask* task = it->get(); 140 internal::RasterWorkerPoolTask* task = it->get();
129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); 141 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end());
130 DCHECK(!task->HasCompleted()); 142 DCHECK(!task->HasCompleted());
131 143
132 // Use existing pixel buffer task if available. 144 // Use existing pixel buffer task if available.
133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); 145 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task);
(...skipping 19 matching lines...) Expand all
153 // Inactive task can be canceled. 165 // Inactive task can be canceled.
154 if (!pixel_buffer_task && !task->HasFinishedRunning()) { 166 if (!pixel_buffer_task && !task->HasFinishedRunning()) {
155 task->DidRun(true); 167 task->DidRun(true);
156 DCHECK(std::find(completed_tasks_.begin(), 168 DCHECK(std::find(completed_tasks_.begin(),
157 completed_tasks_.end(), 169 completed_tasks_.end(),
158 task) == completed_tasks_.end()); 170 task) == completed_tasks_.end());
159 completed_tasks_.push_back(task); 171 completed_tasks_.push_back(task);
160 } 172 }
161 } 173 }
162 174
175 tasks_required_for_activation_.clear();
176 for (TaskMap::iterator it = new_pixel_buffer_tasks.begin();
177 it != new_pixel_buffer_tasks.end(); ++it) {
178 internal::RasterWorkerPoolTask* task = it->first;
179 if (IsRasterTaskRequiredForActivation(task))
180 tasks_required_for_activation_.insert(task);
181 }
182
163 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); 183 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks);
164 184
165 // This will schedule more tasks after checking for completed raster 185 // Check for completed tasks when ScheduleTasks() is called as
166 // tasks. It's worth checking for completed tasks when ScheduleTasks() 186 // priorities might have changed and this maximizes the number
167 // is called as priorities might have changed and this allows us to 187 // of top priority tasks that are scheduled.
168 // schedule as many new top priority tasks as possible. 188 RasterWorkerPool::CheckForCompletedTasks();
169 CheckForCompletedRasterTasks(); 189 CheckForCompletedUploads();
190 FlushUploads();
191
192 // Schedule new tasks.
193 ScheduleMoreTasks();
194
195 // Cancel any pending check for completed raster tasks and schedule
196 // another check.
197 check_for_completed_raster_tasks_callback_.Cancel();
198 check_for_completed_raster_tasks_pending_ = false;
199 ScheduleCheckForCompletedRasterTasks();
170 } 200 }
171 201
172 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { 202 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
173 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); 203 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks");
174 204
175 RasterWorkerPool::CheckForCompletedTasks(); 205 RasterWorkerPool::CheckForCompletedTasks();
176 CheckForCompletedUploads(); 206 CheckForCompletedUploads();
177 FlushUploads(); 207 FlushUploads();
178 208
179 while (!completed_tasks_.empty()) { 209 TaskDeque completed_tasks;
180 internal::RasterWorkerPoolTask* task = completed_tasks_.front().get(); 210 completed_tasks_.swap(completed_tasks);
211
212 while (!completed_tasks.empty()) {
213 internal::RasterWorkerPoolTask* task = completed_tasks.front().get();
181 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); 214 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end());
182 215
183 pixel_buffer_tasks_.erase(task); 216 pixel_buffer_tasks_.erase(task);
184 217
185 task->WillComplete(); 218 task->WillComplete();
186 task->CompleteOnOriginThread(); 219 task->CompleteOnOriginThread();
187 task->DidComplete(); 220 task->DidComplete();
188 221
189 completed_tasks_.pop_front(); 222 completed_tasks.pop_front();
190 } 223 }
191 } 224 }
192 225
193 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { 226 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() {
194 // Call CheckForCompletedTasks() when we've finished running all raster 227 // Call CheckForCompletedRasterTasks() when we've finished running all
195 // tasks needed since last time ScheduleMoreTasks() was called. This 228 // raster tasks needed since last time ScheduleTasks() was called. This
196 // reduces latency when processing only a small number of raster tasks. 229 // reduces latency when processing only a small number of raster tasks.
197 CheckForCompletedRasterTasks(); 230 CheckForCompletedRasterTasks();
198 } 231 }
199 232
233 void PixelBufferRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
234 // Handle this the same way as when finished running all raster tasks.
235 OnRasterTasksFinished();
236 }
237
200 void PixelBufferRasterWorkerPool::FlushUploads() { 238 void PixelBufferRasterWorkerPool::FlushUploads() {
201 if (!has_performed_uploads_since_last_flush_) 239 if (!has_performed_uploads_since_last_flush_)
202 return; 240 return;
203 241
204 resource_provider()->ShallowFlushIfSupported(); 242 resource_provider()->ShallowFlushIfSupported();
205 has_performed_uploads_since_last_flush_ = false; 243 has_performed_uploads_since_last_flush_ = false;
206 } 244 }
207 245
208 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { 246 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
209 TaskDeque tasks_with_completed_uploads; 247 TaskDeque tasks_with_completed_uploads;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 303
266 bytes_pending_upload_ -= task->resource()->bytes(); 304 bytes_pending_upload_ -= task->resource()->bytes();
267 305
268 task->DidRun(false); 306 task->DidRun(false);
269 307
270 DCHECK(std::find(completed_tasks_.begin(), 308 DCHECK(std::find(completed_tasks_.begin(),
271 completed_tasks_.end(), 309 completed_tasks_.end(),
272 task) == completed_tasks_.end()); 310 task) == completed_tasks_.end());
273 completed_tasks_.push_back(task); 311 completed_tasks_.push_back(task);
274 312
313 tasks_required_for_activation_.erase(task);
314
275 tasks_with_completed_uploads.pop_front(); 315 tasks_with_completed_uploads.pop_front();
276 } 316 }
277 } 317 }
278 318
279 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { 319 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() {
280 if (check_for_completed_raster_tasks_pending_) 320 if (check_for_completed_raster_tasks_pending_)
281 return; 321 return;
282 322
283 check_for_completed_raster_tasks_callback_.Reset( 323 check_for_completed_raster_tasks_callback_.Reset(
284 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks, 324 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks,
285 base::Unretained(this))); 325 base::Unretained(this)));
286 base::MessageLoopProxy::current()->PostDelayedTask( 326 base::MessageLoopProxy::current()->PostDelayedTask(
287 FROM_HERE, 327 FROM_HERE,
288 check_for_completed_raster_tasks_callback_.callback(), 328 check_for_completed_raster_tasks_callback_.callback(),
289 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs)); 329 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs));
290 check_for_completed_raster_tasks_pending_ = true; 330 check_for_completed_raster_tasks_pending_ = true;
291 } 331 }
292 332
293 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { 333 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() {
294 TRACE_EVENT0( 334 TRACE_EVENT0(
295 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); 335 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks");
296 336
297 check_for_completed_raster_tasks_callback_.Cancel(); 337 check_for_completed_raster_tasks_callback_.Cancel();
298 check_for_completed_raster_tasks_pending_ = false; 338 check_for_completed_raster_tasks_pending_ = false;
299 339
300 RasterWorkerPool::CheckForCompletedTasks(); 340 RasterWorkerPool::CheckForCompletedTasks();
301 CheckForCompletedUploads(); 341 CheckForCompletedUploads();
302 FlushUploads(); 342 FlushUploads();
303 343
304 ScheduleMoreTasks(); 344 // Determine if client should be notified and update pending notification
345 // status before scheduling more raster tasks.
346 bool notify_client_that_finished_running_tasks_required_for_activation =
347 NotifyClientThatFinishedRunningTasksRequiredForActivation();
vmpstr 2013/06/28 18:12:35 Maybe something like AreTaskRequiredForActivationF
reveman 2013/06/28 20:18:41 Cleaned this up a bit in latest patch. Let me know
348 bool notify_client_that_finished_running_tasks =
349 NotifyClientThatFinishedRunningTasks();
305 350
306 // Make sure another check for completed uploads is scheduled 351 if (PendingRasterTaskCount())
307 // while there is still pending uploads left. 352 ScheduleMoreTasks();
308 if (!tasks_with_pending_upload_.empty()) 353
354 // Schedule another check for completed raster tasks while there are
355 // pending raster tasks or pending uploads.
356 if (PendingRasterTaskCount() || !tasks_with_pending_upload_.empty())
309 ScheduleCheckForCompletedRasterTasks(); 357 ScheduleCheckForCompletedRasterTasks();
358
359 if (notify_client_that_finished_running_tasks_required_for_activation)
360 client()->DidFinishedRunningTasksRequiredForActivation();
361 if (notify_client_that_finished_running_tasks)
362 client()->DidFinishedRunningTasks();
310 } 363 }
311 364
312 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { 365 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
313 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); 366 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
314 367
368 enum RasterTaskType {
369 PREPAINT_TYPE = 0,
370 REQUIRED_FOR_ACTIVATION_TYPE = 1,
371 NUM_TYPES = 2
372 };
373 // TODO(reveman): Use StackVector instead.
374 std::vector<GraphNode*> tasks[NUM_TYPES];
375 unsigned priority = 2u; // 0-1 reserved for RasterFinished tasks.
376 TaskGraph graph;
377
315 size_t bytes_pending_upload = bytes_pending_upload_; 378 size_t bytes_pending_upload = bytes_pending_upload_;
316 size_t bytes_pending_raster = 0; 379 size_t bytes_pending_raster = 0;
317 380
318 RasterTaskGraph graph;
319 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); 381 for (RasterTaskVector::const_iterator it = raster_tasks().begin();
320 it != raster_tasks().end(); ++it) { 382 it != raster_tasks().end(); ++it) {
321 internal::RasterWorkerPoolTask* task = it->get(); 383 internal::RasterWorkerPoolTask* task = it->get();
322 384
323 // |pixel_buffer_tasks_| contains all tasks that have not yet completed. 385 // |pixel_buffer_tasks_| contains all tasks that have not yet completed.
324 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); 386 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task);
325 if (pixel_buffer_it == pixel_buffer_tasks_.end()) 387 if (pixel_buffer_it == pixel_buffer_tasks_.end())
326 continue; 388 continue;
327 389
328 // HasFinishedRunning() will return true when set pixels has completed. 390 // HasFinishedRunning() will return true when set pixels has completed.
(...skipping 23 matching lines...) Expand all
352 size_t new_bytes_pending_raster = bytes_pending_raster; 414 size_t new_bytes_pending_raster = bytes_pending_raster;
353 new_bytes_pending_raster += task->resource()->bytes(); 415 new_bytes_pending_raster += task->resource()->bytes();
354 if (new_bytes_pending_raster > kMaxPendingRasterBytes) 416 if (new_bytes_pending_raster > kMaxPendingRasterBytes)
355 break; 417 break;
356 418
357 // Update both |bytes_pending_raster| and |bytes_pending_upload| 419 // Update both |bytes_pending_raster| and |bytes_pending_upload|
358 // now that task has cleared all throttling limits. 420 // now that task has cleared all throttling limits.
359 bytes_pending_raster = new_bytes_pending_raster; 421 bytes_pending_raster = new_bytes_pending_raster;
360 bytes_pending_upload = new_bytes_pending_upload; 422 bytes_pending_upload = new_bytes_pending_upload;
361 423
424 RasterTaskType type = IsRasterTaskRequiredForActivation(task) ?
425 REQUIRED_FOR_ACTIVATION_TYPE :
426 PREPAINT_TYPE;
427
362 // Use existing pixel buffer task if available. 428 // Use existing pixel buffer task if available.
363 if (pixel_buffer_task) { 429 if (pixel_buffer_task) {
364 graph.InsertRasterTask(pixel_buffer_task, task->dependencies()); 430 tasks[type].push_back(
431 CreateGraphNodeForRasterTask(pixel_buffer_task,
432 task->dependencies(),
433 priority++,
434 &graph));
365 continue; 435 continue;
366 } 436 }
367 437
368 // Request a pixel buffer. This will reserve shared memory. 438 // Request a pixel buffer. This will reserve shared memory.
369 resource_provider()->AcquirePixelBuffer(task->resource()->id()); 439 resource_provider()->AcquirePixelBuffer(task->resource()->id());
370 440
371 // MapPixelBuffer() returns NULL if context was lost at the time 441 // MapPixelBuffer() returns NULL if context was lost at the time
372 // AcquirePixelBuffer() was called. For simplicity we still post 442 // AcquirePixelBuffer() was called. For simplicity we still post
373 // a raster task that is essentially a noop in these situations. 443 // a raster task that is essentially a noop in these situations.
374 uint8* buffer = resource_provider()->MapPixelBuffer( 444 uint8* buffer = resource_provider()->MapPixelBuffer(
375 task->resource()->id()); 445 task->resource()->id());
376 446
377 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task( 447 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task(
378 new PixelBufferWorkerPoolTaskImpl( 448 new PixelBufferWorkerPoolTaskImpl(
379 task, 449 task,
380 buffer, 450 buffer,
381 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted, 451 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted,
382 base::Unretained(this), 452 base::Unretained(this),
383 make_scoped_refptr(task)))); 453 make_scoped_refptr(task))));
384 pixel_buffer_tasks_[task] = new_pixel_buffer_task; 454 pixel_buffer_tasks_[task] = new_pixel_buffer_task;
385 graph.InsertRasterTask(new_pixel_buffer_task.get(), task->dependencies()); 455 tasks[type].push_back(
456 CreateGraphNodeForRasterTask(new_pixel_buffer_task.get(),
457 task->dependencies(),
458 priority++,
459 &graph));
386 } 460 }
387 461
388 SetRasterTaskGraph(&graph); 462 scoped_refptr<internal::WorkerPoolTask>
463 new_raster_required_for_activation_finished_task;
389 464
390 // At least one task that could need an upload is now pending, schedule 465 DCHECK_LE(tasks[REQUIRED_FOR_ACTIVATION_TYPE].size(),
391 // a check for completed raster tasks to ensure this upload is dispatched 466 tasks_required_for_activation_.size());
392 // without too much latency. 467 // Schedule OnRasterTasksRequiredForActivationFinished call when
vmpstr 2013/06/28 18:12:35 nit: Schedule OnRaster.. call only when
reveman 2013/06/28 20:18:41 Done.
393 if (bytes_pending_raster) 468 // notification is pending and throttling is not preventing
394 ScheduleCheckForCompletedRasterTasks(); 469 // all pending tasks required for activation from being scheduled.
470 if (tasks[REQUIRED_FOR_ACTIVATION_TYPE].size() ==
471 tasks_required_for_activation_.size() &&
472 finished_running_tasks_required_for_activation_pending_) {
473 new_raster_required_for_activation_finished_task =
474 CreateRasterRequiredForActivationFinishedTask();
475 GraphNode* raster_required_for_activation_finished_node =
476 CreateGraphNodeForTask(
477 new_raster_required_for_activation_finished_task.get(),
478 0u, // Priority 0
479 &graph);
480 for (unsigned j = 0;
vmpstr 2013/06/28 18:12:35 I still think this loop, and the inner loop around
reveman 2013/06/28 20:18:41 Move inner loop to a separate function.
481 j < tasks[REQUIRED_FOR_ACTIVATION_TYPE].size();
482 ++j) {
483 raster_required_for_activation_finished_node->add_dependency();
484 tasks[REQUIRED_FOR_ACTIVATION_TYPE][j]->add_dependent(
485 raster_required_for_activation_finished_node);
486 }
487 }
488
489 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task;
490
491 DCHECK_LE(tasks[PREPAINT_TYPE].size() +
492 tasks[REQUIRED_FOR_ACTIVATION_TYPE].size(),
493 PendingRasterTaskCount());
494 // Schedule OnRasterTasksFinished call when notification is pending
vmpstr 2013/06/28 18:12:35 nit: ... only when ...
reveman 2013/06/28 20:18:41 Done.
495 // and throttling is not preventing all pending tasks from being
496 // scheduled.
497 if ((tasks[PREPAINT_TYPE].size() +
498 tasks[REQUIRED_FOR_ACTIVATION_TYPE].size()) ==
499 PendingRasterTaskCount() &&
500 finished_running_tasks_pending_) {
501 new_raster_finished_task = CreateRasterFinishedTask();
502 GraphNode* raster_finished_node =
503 CreateGraphNodeForTask(new_raster_finished_task.get(),
504 1u, // Priority 1
505 &graph);
506 for (unsigned type = 0; type < NUM_TYPES; ++type) {
507 for (unsigned i = 0; i < tasks[type].size(); ++i) {
508 raster_finished_node->add_dependency();
509 tasks[type][i]->add_dependent(raster_finished_node);
510 }
511 }
512 }
513
514 SetTaskGraph(&graph);
515
516 set_raster_finished_task(new_raster_finished_task);
517 set_raster_required_for_activation_finished_task(
518 new_raster_required_for_activation_finished_task);
395 } 519 }
396 520
397 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( 521 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted(
398 scoped_refptr<internal::RasterWorkerPoolTask> task, 522 scoped_refptr<internal::RasterWorkerPoolTask> task,
399 bool was_canceled, 523 bool was_canceled,
400 bool needs_upload) { 524 bool needs_upload) {
401 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", 525 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted",
402 "was_canceled", was_canceled, 526 "was_canceled", was_canceled,
403 "needs_upload", needs_upload); 527 "needs_upload", needs_upload);
404 528
405 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); 529 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end());
406 530
407 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). 531 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks().
408 resource_provider()->UnmapPixelBuffer(task->resource()->id()); 532 resource_provider()->UnmapPixelBuffer(task->resource()->id());
409 533
410 if (!needs_upload) { 534 if (!needs_upload) {
411 resource_provider()->ReleasePixelBuffer(task->resource()->id()); 535 resource_provider()->ReleasePixelBuffer(task->resource()->id());
412 task->DidRun(was_canceled); 536 task->DidRun(was_canceled);
413 DCHECK(std::find(completed_tasks_.begin(), 537 DCHECK(std::find(completed_tasks_.begin(),
414 completed_tasks_.end(), 538 completed_tasks_.end(),
415 task) == completed_tasks_.end()); 539 task) == completed_tasks_.end());
416 completed_tasks_.push_back(task); 540 completed_tasks_.push_back(task);
541 tasks_required_for_activation_.erase(task);
417 return; 542 return;
418 } 543 }
419 544
420 resource_provider()->BeginSetPixels(task->resource()->id()); 545 resource_provider()->BeginSetPixels(task->resource()->id());
421 has_performed_uploads_since_last_flush_ = true; 546 has_performed_uploads_since_last_flush_ = true;
422 547
423 bytes_pending_upload_ += task->resource()->bytes(); 548 bytes_pending_upload_ += task->resource()->bytes();
424 tasks_with_pending_upload_.push_back(task); 549 tasks_with_pending_upload_.push_back(task);
425 } 550 }
426 551
552 unsigned PixelBufferRasterWorkerPool::PendingRasterTaskCount() const {
553 unsigned num_completed_raster_tasks =
554 tasks_with_pending_upload_.size() + completed_tasks_.size();
555 DCHECK_GE(pixel_buffer_tasks_.size(), num_completed_raster_tasks);
556 return pixel_buffer_tasks_.size() - num_completed_raster_tasks;
557 }
558
559 bool PixelBufferRasterWorkerPool::
560 NotifyClientThatFinishedRunningTasksRequiredForActivation() {
561 if (!finished_running_tasks_required_for_activation_pending_)
562 return false;
563
564 if (!tasks_required_for_activation_.empty())
565 return false;
566
567 finished_running_tasks_required_for_activation_pending_ = false;
568 return true;
569 }
570
571 bool PixelBufferRasterWorkerPool::NotifyClientThatFinishedRunningTasks() {
572 if (!finished_running_tasks_pending_)
573 return false;
574
575 if (PendingRasterTaskCount())
576 return false;
577
578 if (!tasks_with_pending_upload_.empty())
579 return false;
580
581 finished_running_tasks_pending_ = false;
582 return true;
583 }
584
427 } // namespace cc 585 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/pixel_buffer_raster_worker_pool.h ('k') | cc/resources/raster_worker_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698