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

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: Use "ready to activate" signal for activation in LTHI and fix task scheduling problems in pixel buf… Created 7 years, 6 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 "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/resources/resource.h" 8 #include "cc/resources/resource.h"
9 #include "third_party/skia/include/core/SkDevice.h" 9 #include "third_party/skia/include/core/SkDevice.h"
10 10
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 77
78 const int kCheckForCompletedRasterTasksDelayMs = 6; 78 const int kCheckForCompletedRasterTasksDelayMs = 6;
79 79
80 const size_t kMaxPendingRasterBytes = 80 const size_t kMaxPendingRasterBytes =
81 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs; 81 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs;
82 82
83 } // namespace 83 } // namespace
84 84
85 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( 85 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool(
86 ResourceProvider* resource_provider, 86 ResourceProvider* resource_provider,
87 size_t num_threads) : RasterWorkerPool(resource_provider, num_threads), 87 size_t num_threads)
88 shutdown_(false), 88 : RasterWorkerPool(resource_provider, num_threads),
89 bytes_pending_upload_(0), 89 shutdown_(false),
90 has_performed_uploads_since_last_flush_(false), 90 bytes_pending_upload_(0),
91 check_for_completed_raster_tasks_pending_(false) { 91 has_performed_uploads_since_last_flush_(false),
92 check_for_completed_raster_tasks_pending_(false),
93 num_scheduled_raster_tasks_(0),
94 num_scheduled_raster_tasks_required_for_activation_(0),
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 raster_tasks_required_for_activation_.clear();
177 for (TaskMap::iterator it = new_pixel_buffer_tasks.begin();
178 it != new_pixel_buffer_tasks.end(); ++it) {
179 internal::RasterWorkerPoolTask* task = it->first;
180 if (IsRasterTaskRequiredForActivation(task)) {
181 internal::WorkerPoolTask* pixel_buffer_task = it->second.get();
182
183 tasks_required_for_activation_.insert(task);
184 if (!pixel_buffer_task || !pixel_buffer_task->HasCompleted())
185 raster_tasks_required_for_activation_.insert(task);
186 }
187 }
188
163 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); 189 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks);
164 190
165 // This will schedule more tasks after checking for completed raster 191 // Check for completed tasks when ScheduleTasks() is called as
166 // tasks. It's worth checking for completed tasks when ScheduleTasks() 192 // priorities might have changed and this maximizes the number
167 // is called as priorities might have changed and this allows us to 193 // of top priority tasks that are scheduled.
168 // schedule as many new top priority tasks as possible. 194 RasterWorkerPool::CheckForCompletedTasks();
169 CheckForCompletedRasterTasks(); 195 CheckForCompletedUploads();
196 FlushUploads();
197
198 // Schedule new tasks.
199 ScheduleMoreTasks();
200
201 // Cancel any pending check for completed raster tasks and schedule
202 // another check.
203 check_for_completed_raster_tasks_callback_.Cancel();
204 check_for_completed_raster_tasks_pending_ = false;
205 ScheduleCheckForCompletedRasterTasks();
170 } 206 }
171 207
172 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { 208 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
173 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); 209 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks");
174 210
175 RasterWorkerPool::CheckForCompletedTasks(); 211 RasterWorkerPool::CheckForCompletedTasks();
176 CheckForCompletedUploads(); 212 CheckForCompletedUploads();
177 FlushUploads(); 213 FlushUploads();
178 214
179 while (!completed_tasks_.empty()) { 215 TaskDeque completed_tasks;
180 internal::RasterWorkerPoolTask* task = completed_tasks_.front().get(); 216 completed_tasks_.swap(completed_tasks);
217
218 while (!completed_tasks.empty()) {
219 internal::RasterWorkerPoolTask* task = completed_tasks.front().get();
181 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); 220 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end());
182 221
183 pixel_buffer_tasks_.erase(task); 222 pixel_buffer_tasks_.erase(task);
184 223
185 task->DidComplete(); 224 task->DidComplete();
186 task->DispatchCompletionCallback(); 225 task->DispatchCompletionCallback();
187 226
188 completed_tasks_.pop_front(); 227 completed_tasks.pop_front();
189 } 228 }
190 } 229 }
191 230
192 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { 231 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() {
232 // Early out when more raster tasks are pending.
233 if (num_scheduled_raster_tasks_ != PendingRasterTaskCount())
vmpstr 2013/06/26 18:05:07 I don't understand this check. Shouldn't this be i
reveman 2013/06/27 09:06:58 They will be the same if we're not throttled in an
234 return;
235
193 // Call CheckForCompletedTasks() when we've finished running all raster 236 // Call CheckForCompletedTasks() when we've finished running all raster
194 // tasks needed since last time ScheduleMoreTasks() was called. This 237 // tasks needed since last time ScheduleTasks() was called. This
195 // reduces latency when processing only a small number of raster tasks. 238 // reduces latency when processing only a small number of raster tasks.
196 CheckForCompletedRasterTasks(); 239 CheckForCompletedRasterTasks();
197 } 240 }
198 241
242 void PixelBufferRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
243 if (raster_tasks_required_for_activation_.empty())
244 return;
245
246 // Early out when more raster tasks required for activation are pending.
247 if (raster_tasks_required_for_activation_.size() !=
vmpstr 2013/06/26 18:05:07 I guess I'm missing something, since I have the sa
reveman 2013/06/27 09:06:58 Not sure what you mean by "first time". These func
vmpstr 2013/06/27 16:32:12 What I mean is that, in the case where we schedule
reveman 2013/06/27 22:33:18 hm, OnRasterTaskCompleted is usually not called be
248 num_scheduled_raster_tasks_required_for_activation_)
249 return;
250
251 OnRasterTasksFinished();
252 }
253
199 void PixelBufferRasterWorkerPool::FlushUploads() { 254 void PixelBufferRasterWorkerPool::FlushUploads() {
200 if (!has_performed_uploads_since_last_flush_) 255 if (!has_performed_uploads_since_last_flush_)
201 return; 256 return;
202 257
203 resource_provider()->ShallowFlushIfSupported(); 258 resource_provider()->ShallowFlushIfSupported();
204 has_performed_uploads_since_last_flush_ = false; 259 has_performed_uploads_since_last_flush_ = false;
205 } 260 }
206 261
207 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { 262 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
208 TaskDeque tasks_with_completed_uploads; 263 TaskDeque tasks_with_completed_uploads;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 319
265 bytes_pending_upload_ -= task->resource()->bytes(); 320 bytes_pending_upload_ -= task->resource()->bytes();
266 321
267 task->DidRun(false); 322 task->DidRun(false);
268 323
269 DCHECK(std::find(completed_tasks_.begin(), 324 DCHECK(std::find(completed_tasks_.begin(),
270 completed_tasks_.end(), 325 completed_tasks_.end(),
271 task) == completed_tasks_.end()); 326 task) == completed_tasks_.end());
272 completed_tasks_.push_back(task); 327 completed_tasks_.push_back(task);
273 328
329 tasks_required_for_activation_.erase(task);
330
274 tasks_with_completed_uploads.pop_front(); 331 tasks_with_completed_uploads.pop_front();
275 } 332 }
276 } 333 }
277 334
278 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { 335 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() {
279 if (check_for_completed_raster_tasks_pending_) 336 if (check_for_completed_raster_tasks_pending_)
280 return; 337 return;
281 338
282 check_for_completed_raster_tasks_callback_.Reset( 339 check_for_completed_raster_tasks_callback_.Reset(
283 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks, 340 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks,
284 base::Unretained(this))); 341 base::Unretained(this)));
285 base::MessageLoopProxy::current()->PostDelayedTask( 342 base::MessageLoopProxy::current()->PostDelayedTask(
286 FROM_HERE, 343 FROM_HERE,
287 check_for_completed_raster_tasks_callback_.callback(), 344 check_for_completed_raster_tasks_callback_.callback(),
288 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs)); 345 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs));
289 check_for_completed_raster_tasks_pending_ = true; 346 check_for_completed_raster_tasks_pending_ = true;
290 } 347 }
291 348
292 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { 349 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() {
293 TRACE_EVENT0( 350 TRACE_EVENT0(
294 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); 351 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks");
295 352
296 check_for_completed_raster_tasks_callback_.Cancel(); 353 check_for_completed_raster_tasks_callback_.Cancel();
297 check_for_completed_raster_tasks_pending_ = false; 354 check_for_completed_raster_tasks_pending_ = false;
298 355
299 RasterWorkerPool::CheckForCompletedTasks(); 356 RasterWorkerPool::CheckForCompletedTasks();
300 CheckForCompletedUploads(); 357 CheckForCompletedUploads();
301 FlushUploads(); 358 FlushUploads();
302 359
303 ScheduleMoreTasks(); 360 if (PendingRasterTaskCount())
361 ScheduleMoreTasks();
304 362
305 // Make sure another check for completed uploads is scheduled 363 // Schedule another check for completed raster tasks while there are
306 // while there is still pending uploads left. 364 // pending raster tasks or pending uploads.
307 if (!tasks_with_pending_upload_.empty()) 365 if (PendingRasterTaskCount() || !tasks_with_pending_upload_.empty())
308 ScheduleCheckForCompletedRasterTasks(); 366 ScheduleCheckForCompletedRasterTasks();
367
368 NotifyClientIfFinishedRunningTasksRequiredForActivation();
369 NotifyClientIfFinishedRunningTasks();
309 } 370 }
310 371
311 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { 372 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
312 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); 373 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
313 374
314 size_t bytes_pending_upload = bytes_pending_upload_; 375 size_t bytes_pending_upload = bytes_pending_upload_;
315 size_t bytes_pending_raster = 0; 376 size_t bytes_pending_raster = 0;
316 377
378 num_scheduled_raster_tasks_ = 0;
379 num_scheduled_raster_tasks_required_for_activation_ = 0;
380
317 RasterTaskGraph graph; 381 RasterTaskGraph graph;
318 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); 382 for (RasterTaskVector::const_iterator it = raster_tasks().begin();
319 it != raster_tasks().end(); ++it) { 383 it != raster_tasks().end(); ++it) {
320 internal::RasterWorkerPoolTask* task = it->get(); 384 internal::RasterWorkerPoolTask* task = it->get();
321 385
322 // |pixel_buffer_tasks_| contains all tasks that have not yet completed. 386 // |pixel_buffer_tasks_| contains all tasks that have not yet completed.
323 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); 387 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task);
324 if (pixel_buffer_it == pixel_buffer_tasks_.end()) 388 if (pixel_buffer_it == pixel_buffer_tasks_.end())
325 continue; 389 continue;
326 390
(...skipping 24 matching lines...) Expand all
351 size_t new_bytes_pending_raster = bytes_pending_raster; 415 size_t new_bytes_pending_raster = bytes_pending_raster;
352 new_bytes_pending_raster += task->resource()->bytes(); 416 new_bytes_pending_raster += task->resource()->bytes();
353 if (new_bytes_pending_raster > kMaxPendingRasterBytes) 417 if (new_bytes_pending_raster > kMaxPendingRasterBytes)
354 break; 418 break;
355 419
356 // Update both |bytes_pending_raster| and |bytes_pending_upload| 420 // Update both |bytes_pending_raster| and |bytes_pending_upload|
357 // now that task has cleared all throttling limits. 421 // now that task has cleared all throttling limits.
358 bytes_pending_raster = new_bytes_pending_raster; 422 bytes_pending_raster = new_bytes_pending_raster;
359 bytes_pending_upload = new_bytes_pending_upload; 423 bytes_pending_upload = new_bytes_pending_upload;
360 424
425 ++num_scheduled_raster_tasks_;
426 if (IsRasterTaskRequiredForActivation(task))
427 ++num_scheduled_raster_tasks_required_for_activation_;
428
361 // Use existing pixel buffer task if available. 429 // Use existing pixel buffer task if available.
362 if (pixel_buffer_task) { 430 if (pixel_buffer_task) {
363 graph.InsertRasterTask(pixel_buffer_task, task->dependencies()); 431 graph.InsertRasterTask(pixel_buffer_task,
432 task->dependencies(),
433 IsRasterTaskRequiredForActivation(task));
364 continue; 434 continue;
365 } 435 }
366 436
367 // Request a pixel buffer. This will reserve shared memory. 437 // Request a pixel buffer. This will reserve shared memory.
368 resource_provider()->AcquirePixelBuffer(task->resource()->id()); 438 resource_provider()->AcquirePixelBuffer(task->resource()->id());
369 439
370 // MapPixelBuffer() returns NULL if context was lost at the time 440 // MapPixelBuffer() returns NULL if context was lost at the time
371 // AcquirePixelBuffer() was called. For simplicity we still post 441 // AcquirePixelBuffer() was called. For simplicity we still post
372 // a raster task that is essentially a noop in these situations. 442 // a raster task that is essentially a noop in these situations.
373 uint8* buffer = resource_provider()->MapPixelBuffer( 443 uint8* buffer = resource_provider()->MapPixelBuffer(
374 task->resource()->id()); 444 task->resource()->id());
375 445
376 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task( 446 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task(
377 new PixelBufferWorkerPoolTaskImpl( 447 new PixelBufferWorkerPoolTaskImpl(
378 task, 448 task,
379 buffer, 449 buffer,
380 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted, 450 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted,
381 base::Unretained(this), 451 base::Unretained(this),
382 make_scoped_refptr(task)))); 452 make_scoped_refptr(task))));
383 pixel_buffer_tasks_[task] = new_pixel_buffer_task; 453 pixel_buffer_tasks_[task] = new_pixel_buffer_task;
384 graph.InsertRasterTask(new_pixel_buffer_task.get(), task->dependencies()); 454 graph.InsertRasterTask(new_pixel_buffer_task.get(),
455 task->dependencies(),
456 IsRasterTaskRequiredForActivation(task));
385 } 457 }
386 458
459 // We might fail to schedule pending raster tasks when upload bound.
460 if (!bytes_pending_raster)
461 return;
462
387 SetRasterTaskGraph(&graph); 463 SetRasterTaskGraph(&graph);
388
389 // At least one task that could need an upload is now pending, schedule
390 // a check for completed raster tasks to ensure this upload is dispatched
391 // without too much latency.
392 if (bytes_pending_raster)
393 ScheduleCheckForCompletedRasterTasks();
394 } 464 }
395 465
396 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( 466 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted(
397 scoped_refptr<internal::RasterWorkerPoolTask> task, 467 scoped_refptr<internal::RasterWorkerPoolTask> task,
398 bool was_canceled, 468 bool was_canceled,
399 bool needs_upload) { 469 bool needs_upload) {
400 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", 470 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted",
401 "was_canceled", was_canceled, 471 "was_canceled", was_canceled,
402 "needs_upload", needs_upload); 472 "needs_upload", needs_upload);
403 473
404 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); 474 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end());
405 475
406 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). 476 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks().
407 resource_provider()->UnmapPixelBuffer(task->resource()->id()); 477 resource_provider()->UnmapPixelBuffer(task->resource()->id());
408 478
479 raster_tasks_required_for_activation_.erase(task);
480
409 if (!needs_upload) { 481 if (!needs_upload) {
410 resource_provider()->ReleasePixelBuffer(task->resource()->id()); 482 resource_provider()->ReleasePixelBuffer(task->resource()->id());
411 task->DidRun(was_canceled); 483 task->DidRun(was_canceled);
412 DCHECK(std::find(completed_tasks_.begin(), 484 DCHECK(std::find(completed_tasks_.begin(),
413 completed_tasks_.end(), 485 completed_tasks_.end(),
414 task) == completed_tasks_.end()); 486 task) == completed_tasks_.end());
415 completed_tasks_.push_back(task); 487 completed_tasks_.push_back(task);
488 tasks_required_for_activation_.erase(task);
416 return; 489 return;
417 } 490 }
418 491
419 resource_provider()->BeginSetPixels(task->resource()->id()); 492 resource_provider()->BeginSetPixels(task->resource()->id());
420 has_performed_uploads_since_last_flush_ = true; 493 has_performed_uploads_since_last_flush_ = true;
421 494
422 bytes_pending_upload_ += task->resource()->bytes(); 495 bytes_pending_upload_ += task->resource()->bytes();
423 tasks_with_pending_upload_.push_back(task); 496 tasks_with_pending_upload_.push_back(task);
424 } 497 }
425 498
499 unsigned PixelBufferRasterWorkerPool::PendingRasterTaskCount() const {
500 unsigned num_completed_raster_tasks =
501 tasks_with_pending_upload_.size() + completed_tasks_.size();
502 DCHECK_GE(pixel_buffer_tasks_.size(), num_completed_raster_tasks);
503 return pixel_buffer_tasks_.size() - num_completed_raster_tasks;
504 }
505
506 void PixelBufferRasterWorkerPool::
507 NotifyClientIfFinishedRunningTasksRequiredForActivation() {
508 if (!finished_running_tasks_required_for_activation_pending_)
509 return;
510
511 if (!tasks_required_for_activation_.empty())
512 return;
513
514 client()->DidFinishedRunningTasksRequiredForActivation();
515 finished_running_tasks_required_for_activation_pending_ = false;
516 }
517
518 void PixelBufferRasterWorkerPool::NotifyClientIfFinishedRunningTasks() {
519 if (!finished_running_tasks_pending_)
520 return;
521
522 if (PendingRasterTaskCount())
523 return;
524
525 if (!tasks_with_pending_upload_.empty())
526 return;
527
528 client()->DidFinishedRunningTasks();
529 finished_running_tasks_pending_ = false;
530 }
531
426 } // namespace cc 532 } // 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