OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/one_copy_raster_worker_pool.h" | 5 #include "cc/resources/one_copy_raster_worker_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
80 | 80 |
81 // Flush interval when performing copy operations. | 81 // Flush interval when performing copy operations. |
82 const int kCopyFlushPeriod = 4; | 82 const int kCopyFlushPeriod = 4; |
83 | 83 |
84 // Number of in-flight copy operations to allow. | 84 // Number of in-flight copy operations to allow. |
85 const int kMaxCopyOperations = 16; | 85 const int kMaxCopyOperations = 16; |
86 | 86 |
87 // Delay been checking for copy operations to complete. | 87 // Delay been checking for copy operations to complete. |
88 const int kCheckForCompletedCopyOperationsTickRateMs = 1; | 88 const int kCheckForCompletedCopyOperationsTickRateMs = 1; |
89 | 89 |
90 // Number of failed attempts to allow before we perform a check that will | |
91 // wait for copy operations to complete if needed. | |
92 const int kFailedAttemptsBeforeWaitIfNeeded = 256; | |
vmpstr
2014/10/29 17:36:25
Is there any way we can eliminate some of these co
reveman
2014/10/29 18:42:48
Not sure. This last constant is just to detect dri
| |
93 | |
90 } // namespace | 94 } // namespace |
91 | 95 |
92 OneCopyRasterWorkerPool::CopyOperation::CopyOperation( | 96 OneCopyRasterWorkerPool::CopyOperation::CopyOperation( |
93 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, | 97 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, |
94 scoped_ptr<ScopedResource> src, | 98 scoped_ptr<ScopedResource> src, |
95 const Resource* dst) | 99 const Resource* dst) |
96 : write_lock(write_lock.Pass()), src(src.Pass()), dst(dst) { | 100 : write_lock(write_lock.Pass()), src(src.Pass()), dst(dst) { |
97 } | 101 } |
98 | 102 |
99 OneCopyRasterWorkerPool::CopyOperation::~CopyOperation() { | 103 OneCopyRasterWorkerPool::CopyOperation::~CopyOperation() { |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
188 size_t task_count[kNumberOfTaskSets] = {0}; | 192 size_t task_count[kNumberOfTaskSets] = {0}; |
189 | 193 |
190 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 194 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
191 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 195 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( |
192 task_runner_.get(), | 196 task_runner_.get(), |
193 base::Bind(&OneCopyRasterWorkerPool::OnRasterFinished, | 197 base::Bind(&OneCopyRasterWorkerPool::OnRasterFinished, |
194 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 198 raster_finished_weak_ptr_factory_.GetWeakPtr(), |
195 task_set)); | 199 task_set)); |
196 } | 200 } |
197 | 201 |
198 resource_pool_->CheckBusyResources(); | 202 resource_pool_->CheckBusyResources(false); |
199 | 203 |
200 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 204 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
201 it != queue->items.end(); | 205 it != queue->items.end(); |
202 ++it) { | 206 ++it) { |
203 const RasterTaskQueue::Item& item = *it; | 207 const RasterTaskQueue::Item& item = *it; |
204 RasterTask* task = item.task; | 208 RasterTask* task = item.task; |
205 DCHECK(!task->HasCompleted()); | 209 DCHECK(!task->HasCompleted()); |
206 | 210 |
207 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 211 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
208 if (!item.task_sets[task_set]) | 212 if (!item.task_sets[task_set]) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
276 const Resource* dst, | 280 const Resource* dst, |
277 const RasterSource* raster_source, | 281 const RasterSource* raster_source, |
278 const gfx::Rect& rect, | 282 const gfx::Rect& rect, |
279 float scale, | 283 float scale, |
280 RenderingStatsInstrumentation* stats) { | 284 RenderingStatsInstrumentation* stats) { |
281 CopySequenceNumber sequence; | 285 CopySequenceNumber sequence; |
282 | 286 |
283 { | 287 { |
284 base::AutoLock lock(lock_); | 288 base::AutoLock lock(lock_); |
285 | 289 |
290 int failed_attempts = 0; | |
286 while ((scheduled_copy_operation_count_ + issued_copy_operation_count_) >= | 291 while ((scheduled_copy_operation_count_ + issued_copy_operation_count_) >= |
287 kMaxCopyOperations) { | 292 kMaxCopyOperations) { |
288 // Ignore limit when shutdown is set. | 293 // Ignore limit when shutdown is set. |
289 if (shutdown_) | 294 if (shutdown_) |
290 break; | 295 break; |
291 | 296 |
297 ++failed_attempts; | |
298 | |
299 // Schedule a check that will also wait for operations to complete | |
300 // after too many failed attempts. | |
301 bool wait_if_needed = failed_attempts > kFailedAttemptsBeforeWaitIfNeeded; | |
302 | |
292 // Schedule a check for completed copy operations if too many operations | 303 // Schedule a check for completed copy operations if too many operations |
293 // are currently in-flight. | 304 // are currently in-flight. |
294 ScheduleCheckForCompletedCopyOperationsWithLockAcquired(); | 305 ScheduleCheckForCompletedCopyOperationsWithLockAcquired(wait_if_needed); |
295 | 306 |
296 { | 307 { |
297 TRACE_EVENT0("cc", "WaitingForCopyOperationsToComplete"); | 308 TRACE_EVENT0("cc", "WaitingForCopyOperationsToComplete"); |
298 | 309 |
299 // Wait for in-flight copy operations to drop below limit. | 310 // Wait for in-flight copy operations to drop below limit. |
300 copy_operation_count_cv_.Wait(); | 311 copy_operation_count_cv_.Wait(); |
301 } | 312 } |
302 } | 313 } |
303 | 314 |
304 // Increment |scheduled_copy_operation_count_| before releasing |lock_|. | 315 // Increment |scheduled_copy_operation_count_| before releasing |lock_|. |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
382 } | 393 } |
383 | 394 |
384 void OneCopyRasterWorkerPool::IssueCopyOperations(int64 count) { | 395 void OneCopyRasterWorkerPool::IssueCopyOperations(int64 count) { |
385 TRACE_EVENT1( | 396 TRACE_EVENT1( |
386 "cc", "OneCopyRasterWorkerPool::IssueCopyOperations", "count", count); | 397 "cc", "OneCopyRasterWorkerPool::IssueCopyOperations", "count", count); |
387 | 398 |
388 CopyOperation::Deque copy_operations; | 399 CopyOperation::Deque copy_operations; |
389 | 400 |
390 // This is a good time to check for completed copy operations as | 401 // This is a good time to check for completed copy operations as |
391 // |issued_copy_operation_count_| need to be updated below. | 402 // |issued_copy_operation_count_| need to be updated below. |
392 resource_pool_->CheckBusyResources(); | 403 resource_pool_->CheckBusyResources(false); |
393 | 404 |
394 { | 405 { |
395 base::AutoLock lock(lock_); | 406 base::AutoLock lock(lock_); |
396 | 407 |
397 for (int64 i = 0; i < count; ++i) { | 408 for (int64 i = 0; i < count; ++i) { |
398 DCHECK(!pending_copy_operations_.empty()); | 409 DCHECK(!pending_copy_operations_.empty()); |
399 copy_operations.push_back(pending_copy_operations_.take_front()); | 410 copy_operations.push_back(pending_copy_operations_.take_front()); |
400 } | 411 } |
401 | 412 |
402 // Decrement |scheduled_copy_operation_count_| and increment | 413 // Decrement |scheduled_copy_operation_count_| and increment |
(...skipping 16 matching lines...) Expand all Loading... | |
419 resource_provider_->CopyResource(copy_operation->src->id(), | 430 resource_provider_->CopyResource(copy_operation->src->id(), |
420 copy_operation->dst->id()); | 431 copy_operation->dst->id()); |
421 | 432 |
422 // Return source resource to pool where it can be reused once copy | 433 // Return source resource to pool where it can be reused once copy |
423 // operation has completed and resource is no longer busy. | 434 // operation has completed and resource is no longer busy. |
424 resource_pool_->ReleaseResource(copy_operation->src.Pass()); | 435 resource_pool_->ReleaseResource(copy_operation->src.Pass()); |
425 } | 436 } |
426 } | 437 } |
427 | 438 |
428 void OneCopyRasterWorkerPool:: | 439 void OneCopyRasterWorkerPool:: |
429 ScheduleCheckForCompletedCopyOperationsWithLockAcquired() { | 440 ScheduleCheckForCompletedCopyOperationsWithLockAcquired( |
441 bool wait_if_needed) { | |
430 lock_.AssertAcquired(); | 442 lock_.AssertAcquired(); |
431 | 443 |
432 if (check_for_completed_copy_operations_pending_) | 444 if (check_for_completed_copy_operations_pending_) |
433 return; | 445 return; |
434 | 446 |
435 base::TimeTicks now = base::TimeTicks::Now(); | 447 base::TimeTicks now = base::TimeTicks::Now(); |
436 | 448 |
437 // Schedule a check for completed copy operations as soon as possible but | 449 // Schedule a check for completed copy operations as soon as possible but |
438 // don't allow two consecutive checks to be scheduled to run less than the | 450 // don't allow two consecutive checks to be scheduled to run less than the |
439 // tick rate apart. | 451 // tick rate apart. |
440 base::TimeTicks next_check_for_completed_copy_operations_time = | 452 base::TimeTicks next_check_for_completed_copy_operations_time = |
441 std::max(last_check_for_completed_copy_operations_time_ + | 453 std::max(last_check_for_completed_copy_operations_time_ + |
442 base::TimeDelta::FromMilliseconds( | 454 base::TimeDelta::FromMilliseconds( |
443 kCheckForCompletedCopyOperationsTickRateMs), | 455 kCheckForCompletedCopyOperationsTickRateMs), |
444 now); | 456 now); |
445 | 457 |
446 task_runner_->PostDelayedTask( | 458 task_runner_->PostDelayedTask( |
447 FROM_HERE, | 459 FROM_HERE, |
448 base::Bind(&OneCopyRasterWorkerPool::CheckForCompletedCopyOperations, | 460 base::Bind(&OneCopyRasterWorkerPool::CheckForCompletedCopyOperations, |
449 weak_ptr_factory_.GetWeakPtr()), | 461 weak_ptr_factory_.GetWeakPtr(), |
462 wait_if_needed), | |
450 next_check_for_completed_copy_operations_time - now); | 463 next_check_for_completed_copy_operations_time - now); |
451 | 464 |
452 last_check_for_completed_copy_operations_time_ = | 465 last_check_for_completed_copy_operations_time_ = |
453 next_check_for_completed_copy_operations_time; | 466 next_check_for_completed_copy_operations_time; |
454 check_for_completed_copy_operations_pending_ = true; | 467 check_for_completed_copy_operations_pending_ = true; |
455 } | 468 } |
456 | 469 |
457 void OneCopyRasterWorkerPool::CheckForCompletedCopyOperations() { | 470 void OneCopyRasterWorkerPool::CheckForCompletedCopyOperations( |
458 TRACE_EVENT0("cc", | 471 bool wait_if_needed) { |
459 "OneCopyRasterWorkerPool::CheckForCompletedCopyOperations"); | 472 TRACE_EVENT1("cc", |
473 "OneCopyRasterWorkerPool::CheckForCompletedCopyOperations", | |
474 "wait_if_needed", | |
475 wait_if_needed); | |
460 | 476 |
461 resource_pool_->CheckBusyResources(); | 477 resource_pool_->CheckBusyResources(wait_if_needed); |
462 | 478 |
463 { | 479 { |
464 base::AutoLock lock(lock_); | 480 base::AutoLock lock(lock_); |
465 | 481 |
466 DCHECK(check_for_completed_copy_operations_pending_); | 482 DCHECK(check_for_completed_copy_operations_pending_); |
467 check_for_completed_copy_operations_pending_ = false; | 483 check_for_completed_copy_operations_pending_ = false; |
468 | 484 |
469 // The number of busy resources in the pool reflects the number of issued | 485 // The number of busy resources in the pool reflects the number of issued |
470 // copy operations that have not yet completed. | 486 // copy operations that have not yet completed. |
471 issued_copy_operation_count_ = resource_pool_->busy_resource_count(); | 487 issued_copy_operation_count_ = resource_pool_->busy_resource_count(); |
(...skipping 28 matching lines...) Expand all Loading... | |
500 resource_pool_->total_memory_usage_bytes()); | 516 resource_pool_->total_memory_usage_bytes()); |
501 staging_state->SetInteger("pending_copy_count", | 517 staging_state->SetInteger("pending_copy_count", |
502 resource_pool_->total_resource_count() - | 518 resource_pool_->total_resource_count() - |
503 resource_pool_->acquired_resource_count()); | 519 resource_pool_->acquired_resource_count()); |
504 staging_state->SetInteger("bytes_pending_copy", | 520 staging_state->SetInteger("bytes_pending_copy", |
505 resource_pool_->total_memory_usage_bytes() - | 521 resource_pool_->total_memory_usage_bytes() - |
506 resource_pool_->acquired_memory_usage_bytes()); | 522 resource_pool_->acquired_memory_usage_bytes()); |
507 } | 523 } |
508 | 524 |
509 } // namespace cc | 525 } // namespace cc |
OLD | NEW |