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

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: add missing code 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
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 finished_running_tasks_pending_(false),
94 finished_running_tasks_required_for_activation_pending_(false) {
92 } 95 }
93 96
94 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { 97 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() {
95 DCHECK(shutdown_); 98 DCHECK(shutdown_);
96 DCHECK(!check_for_completed_raster_tasks_pending_); 99 DCHECK(!check_for_completed_raster_tasks_pending_);
97 DCHECK_EQ(0u, pixel_buffer_tasks_.size()); 100 DCHECK_EQ(0u, pixel_buffer_tasks_.size());
98 DCHECK_EQ(0u, tasks_with_pending_upload_.size()); 101 DCHECK_EQ(0u, tasks_with_pending_upload_.size());
99 DCHECK_EQ(0u, completed_tasks_.size()); 102 DCHECK_EQ(0u, completed_tasks_.size());
100 } 103 }
101 104
(...skipping 12 matching lines...) Expand all
114 completed_tasks_.push_back(task); 117 completed_tasks_.push_back(task);
115 } 118 }
116 } 119 }
117 } 120 }
118 121
119 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { 122 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
120 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); 123 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks");
121 124
122 RasterWorkerPool::SetRasterTasks(queue); 125 RasterWorkerPool::SetRasterTasks(queue);
123 126
127 finished_running_tasks_pending_ = true;
128 finished_running_tasks_required_for_activation_pending_ = true;
129
124 // Build new pixel buffer task set. 130 // Build new pixel buffer task set.
125 TaskMap new_pixel_buffer_tasks; 131 TaskMap new_pixel_buffer_tasks;
126 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); 132 for (RasterTaskVector::const_iterator it = raster_tasks().begin();
127 it != raster_tasks().end(); ++it) { 133 it != raster_tasks().end(); ++it) {
128 internal::RasterWorkerPoolTask* task = it->get(); 134 internal::RasterWorkerPoolTask* task = it->get();
129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); 135 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end());
130 DCHECK(!task->HasCompleted()); 136 DCHECK(!task->HasCompleted());
131 137
132 // Use existing pixel buffer task if available. 138 // Use existing pixel buffer task if available.
133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); 139 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task);
(...skipping 19 matching lines...) Expand all
153 // Inactive task can be canceled. 159 // Inactive task can be canceled.
154 if (!pixel_buffer_task && !task->HasFinishedRunning()) { 160 if (!pixel_buffer_task && !task->HasFinishedRunning()) {
155 task->DidRun(true); 161 task->DidRun(true);
156 DCHECK(std::find(completed_tasks_.begin(), 162 DCHECK(std::find(completed_tasks_.begin(),
157 completed_tasks_.end(), 163 completed_tasks_.end(),
158 task) == completed_tasks_.end()); 164 task) == completed_tasks_.end());
159 completed_tasks_.push_back(task); 165 completed_tasks_.push_back(task);
160 } 166 }
161 } 167 }
162 168
169 tasks_required_for_activation_.clear();
170 for (TaskMap::iterator it = new_pixel_buffer_tasks.begin();
171 it != new_pixel_buffer_tasks.end(); ++it) {
172 internal::RasterWorkerPoolTask* task = it->first;
173 if (IsRasterTaskRequiredForActivation(task)) {
174 DCHECK(std::find(tasks_required_for_activation_.begin(),
vmpstr 2013/06/21 18:38:33 I don't think we need this dcheck. We already dche
reveman 2013/06/24 16:04:03 Done.
175 tasks_required_for_activation_.end(),
176 task) == tasks_required_for_activation_.end());
177 tasks_required_for_activation_.insert(task);
178 }
179 }
180
163 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); 181 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks);
164 182
165 // This will schedule more tasks after checking for completed raster 183 // This will schedule more tasks after checking for completed raster
166 // tasks. It's worth checking for completed tasks when ScheduleTasks() 184 // tasks. It's worth checking for completed tasks when ScheduleTasks()
167 // is called as priorities might have changed and this allows us to 185 // is called as priorities might have changed and this allows us to
168 // schedule as many new top priority tasks as possible. 186 // schedule as many new top priority tasks as possible.
169 CheckForCompletedRasterTasks(); 187 CheckForCompletedRasterTasks();
170 } 188 }
171 189
172 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { 190 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
(...skipping 16 matching lines...) Expand all
189 } 207 }
190 } 208 }
191 209
192 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { 210 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() {
193 // Call CheckForCompletedTasks() when we've finished running all raster 211 // Call CheckForCompletedTasks() when we've finished running all raster
194 // tasks needed since last time ScheduleMoreTasks() was called. This 212 // tasks needed since last time ScheduleMoreTasks() was called. This
195 // reduces latency when processing only a small number of raster tasks. 213 // reduces latency when processing only a small number of raster tasks.
196 CheckForCompletedRasterTasks(); 214 CheckForCompletedRasterTasks();
197 } 215 }
198 216
217 void PixelBufferRasterWorkerPool::
218 OnRasterTasksRequiredForActivationFinished() {
219 OnRasterTasksFinished();
220 }
221
199 void PixelBufferRasterWorkerPool::FlushUploads() { 222 void PixelBufferRasterWorkerPool::FlushUploads() {
200 if (!has_performed_uploads_since_last_flush_) 223 if (!has_performed_uploads_since_last_flush_)
201 return; 224 return;
202 225
203 resource_provider()->ShallowFlushIfSupported(); 226 resource_provider()->ShallowFlushIfSupported();
204 has_performed_uploads_since_last_flush_ = false; 227 has_performed_uploads_since_last_flush_ = false;
205 } 228 }
206 229
207 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { 230 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
208 TaskDeque tasks_with_completed_uploads; 231 TaskDeque tasks_with_completed_uploads;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 279
257 bytes_pending_upload_ -= task->resource()->bytes(); 280 bytes_pending_upload_ -= task->resource()->bytes();
258 281
259 task->DidRun(false); 282 task->DidRun(false);
260 283
261 DCHECK(std::find(completed_tasks_.begin(), 284 DCHECK(std::find(completed_tasks_.begin(),
262 completed_tasks_.end(), 285 completed_tasks_.end(),
263 task) == completed_tasks_.end()); 286 task) == completed_tasks_.end());
264 completed_tasks_.push_back(task); 287 completed_tasks_.push_back(task);
265 288
289 tasks_required_for_activation_.erase(task);
290
266 tasks_with_completed_uploads.pop_front(); 291 tasks_with_completed_uploads.pop_front();
267 } 292 }
268 } 293 }
269 294
270 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { 295 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() {
271 if (check_for_completed_raster_tasks_pending_) 296 if (check_for_completed_raster_tasks_pending_)
272 return; 297 return;
273 298
274 check_for_completed_raster_tasks_callback_.Reset( 299 check_for_completed_raster_tasks_callback_.Reset(
275 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks, 300 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks,
276 base::Unretained(this))); 301 base::Unretained(this)));
277 base::MessageLoopProxy::current()->PostDelayedTask( 302 base::MessageLoopProxy::current()->PostDelayedTask(
278 FROM_HERE, 303 FROM_HERE,
279 check_for_completed_raster_tasks_callback_.callback(), 304 check_for_completed_raster_tasks_callback_.callback(),
280 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs)); 305 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs));
281 check_for_completed_raster_tasks_pending_ = true; 306 check_for_completed_raster_tasks_pending_ = true;
282 } 307 }
283 308
284 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { 309 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() {
285 TRACE_EVENT0( 310 TRACE_EVENT0(
286 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); 311 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks");
287 312
288 check_for_completed_raster_tasks_callback_.Cancel(); 313 check_for_completed_raster_tasks_callback_.Cancel();
289 check_for_completed_raster_tasks_pending_ = false; 314 check_for_completed_raster_tasks_pending_ = false;
290 315
291 RasterWorkerPool::CheckForCompletedTasks(); 316 RasterWorkerPool::CheckForCompletedTasks();
292 CheckForCompletedUploads(); 317 CheckForCompletedUploads();
293 FlushUploads(); 318 FlushUploads();
294 319
295 ScheduleMoreTasks(); 320 if (NumPendingRasterTasks())
321 ScheduleMoreTasks();
296 322
297 // Make sure another check for completed uploads is scheduled 323 // Schedule another check for completed raster tasks while there are
298 // while there is still pending uploads left. 324 // pending raster tasks or pending uploads.
299 if (!tasks_with_pending_upload_.empty()) 325 if (NumPendingRasterTasks() || !tasks_with_pending_upload_.empty())
300 ScheduleCheckForCompletedRasterTasks(); 326 ScheduleCheckForCompletedRasterTasks();
327
328 CheckIfFinishedRunningTasks();
329 CheckIfFinishedRunningTasksRequiredForActivation();
301 } 330 }
302 331
303 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { 332 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
304 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); 333 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
305 334
306 size_t bytes_pending_upload = bytes_pending_upload_; 335 size_t bytes_pending_upload = bytes_pending_upload_;
307 size_t bytes_pending_raster = 0; 336 size_t bytes_pending_raster = 0;
308 337
309 RasterTaskGraph graph; 338 RasterTaskGraph graph;
310 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); 339 for (RasterTaskVector::const_iterator it = raster_tasks().begin();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 if (new_bytes_pending_raster > kMaxPendingRasterBytes) 374 if (new_bytes_pending_raster > kMaxPendingRasterBytes)
346 break; 375 break;
347 376
348 // Update both |bytes_pending_raster| and |bytes_pending_upload| 377 // Update both |bytes_pending_raster| and |bytes_pending_upload|
349 // now that task has cleared all throttling limits. 378 // now that task has cleared all throttling limits.
350 bytes_pending_raster = new_bytes_pending_raster; 379 bytes_pending_raster = new_bytes_pending_raster;
351 bytes_pending_upload = new_bytes_pending_upload; 380 bytes_pending_upload = new_bytes_pending_upload;
352 381
353 // Use existing pixel buffer task if available. 382 // Use existing pixel buffer task if available.
354 if (pixel_buffer_task) { 383 if (pixel_buffer_task) {
355 graph.InsertRasterTask(pixel_buffer_task, task->dependencies()); 384 graph.InsertRasterTask(pixel_buffer_task,
385 task->dependencies(),
386 IsRasterTaskRequiredForActivation(task));
356 continue; 387 continue;
357 } 388 }
358 389
359 // Request a pixel buffer. This will reserve shared memory. 390 // Request a pixel buffer. This will reserve shared memory.
360 resource_provider()->AcquirePixelBuffer(task->resource()->id()); 391 resource_provider()->AcquirePixelBuffer(task->resource()->id());
361 392
362 // MapPixelBuffer() returns NULL if context was lost at the time 393 // MapPixelBuffer() returns NULL if context was lost at the time
363 // AcquirePixelBuffer() was called. For simplicity we still post 394 // AcquirePixelBuffer() was called. For simplicity we still post
364 // a raster task that is essentially a noop in these situations. 395 // a raster task that is essentially a noop in these situations.
365 uint8* buffer = resource_provider()->MapPixelBuffer( 396 uint8* buffer = resource_provider()->MapPixelBuffer(
366 task->resource()->id()); 397 task->resource()->id());
367 398
368 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task( 399 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task(
369 new PixelBufferWorkerPoolTaskImpl( 400 new PixelBufferWorkerPoolTaskImpl(
370 task, 401 task,
371 buffer, 402 buffer,
372 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted, 403 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted,
373 base::Unretained(this), 404 base::Unretained(this),
374 make_scoped_refptr(task)))); 405 make_scoped_refptr(task))));
375 pixel_buffer_tasks_[task] = new_pixel_buffer_task; 406 pixel_buffer_tasks_[task] = new_pixel_buffer_task;
376 graph.InsertRasterTask(new_pixel_buffer_task.get(), task->dependencies()); 407 graph.InsertRasterTask(new_pixel_buffer_task.get(),
408 task->dependencies(),
409 IsRasterTaskRequiredForActivation(task));
377 } 410 }
378 411
379 SetRasterTaskGraph(&graph); 412 SetRasterTaskGraph(&graph);
380
381 // At least one task that could need an upload is now pending, schedule
382 // a check for completed raster tasks to ensure this upload is dispatched
383 // without too much latency.
384 if (bytes_pending_raster)
385 ScheduleCheckForCompletedRasterTasks();
386 } 413 }
387 414
388 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( 415 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted(
389 scoped_refptr<internal::RasterWorkerPoolTask> task, 416 scoped_refptr<internal::RasterWorkerPoolTask> task,
390 bool was_canceled, 417 bool was_canceled,
391 bool needs_upload) { 418 bool needs_upload) {
392 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", 419 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted",
393 "was_canceled", was_canceled, 420 "was_canceled", was_canceled,
394 "needs_upload", needs_upload); 421 "needs_upload", needs_upload);
395 422
396 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); 423 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end());
397 424
398 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). 425 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks().
399 resource_provider()->UnmapPixelBuffer(task->resource()->id()); 426 resource_provider()->UnmapPixelBuffer(task->resource()->id());
400 427
401 if (!needs_upload) { 428 if (!needs_upload) {
402 resource_provider()->ReleasePixelBuffer(task->resource()->id()); 429 resource_provider()->ReleasePixelBuffer(task->resource()->id());
403 task->DidRun(was_canceled); 430 task->DidRun(was_canceled);
404 DCHECK(std::find(completed_tasks_.begin(), 431 DCHECK(std::find(completed_tasks_.begin(),
405 completed_tasks_.end(), 432 completed_tasks_.end(),
406 task) == completed_tasks_.end()); 433 task) == completed_tasks_.end());
407 completed_tasks_.push_back(task); 434 completed_tasks_.push_back(task);
435 tasks_required_for_activation_.erase(task);
408 return; 436 return;
409 } 437 }
410 438
411 resource_provider()->BeginSetPixels(task->resource()->id()); 439 resource_provider()->BeginSetPixels(task->resource()->id());
412 has_performed_uploads_since_last_flush_ = true; 440 has_performed_uploads_since_last_flush_ = true;
413 441
414 bytes_pending_upload_ += task->resource()->bytes(); 442 bytes_pending_upload_ += task->resource()->bytes();
415 tasks_with_pending_upload_.push_back(task); 443 tasks_with_pending_upload_.push_back(task);
416 } 444 }
417 445
446 unsigned PixelBufferRasterWorkerPool::NumPendingRasterTasks() const {
vmpstr 2013/06/21 18:38:33 nit: I prefer PendingRasterTaskCount
reveman 2013/06/24 16:04:03 Done.
447 DCHECK_GE(pixel_buffer_tasks_.size(), completed_tasks_.size());
448 return pixel_buffer_tasks_.size() - completed_tasks_.size();
449 }
450
451 void PixelBufferRasterWorkerPool::CheckIfFinishedRunningTasks() {
vmpstr 2013/06/21 18:38:33 Maybe something like NotifyClientIfFinishedRunning
reveman 2013/06/24 16:04:03 Done.
452 if (!finished_running_tasks_pending_)
453 return;
454
455 if (NumPendingRasterTasks())
456 return;
457
458 if (tasks_with_pending_upload_.empty())
459 return;
460
461 client()->DidFinishedRunningTasks();
462 finished_running_tasks_pending_ = false;
463 }
464
465 void PixelBufferRasterWorkerPool::
466 CheckIfFinishedRunningTasksRequiredForActivation() {
vmpstr 2013/06/21 18:38:33 NotifyClient... The function name gets to be a bit
reveman 2013/06/24 16:04:03 Done.
467 if (!finished_running_tasks_required_for_activation_pending_)
468 return;
469
470 if (!tasks_required_for_activation_.empty())
471 return;
472
473 client()->DidFinishedRunningTasksRequiredForActivation();
474 finished_running_tasks_required_for_activation_pending_ = false;
475 }
476
418 } // namespace cc 477 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698