OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/tile_manager.h" | 5 #include "cc/resources/tile_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 state->SetInteger("canceled_count", stats.canceled_count); | 196 state->SetInteger("canceled_count", stats.canceled_count); |
197 return state; | 197 return state; |
198 } | 198 } |
199 | 199 |
200 // static | 200 // static |
201 scoped_ptr<TileManager> TileManager::Create( | 201 scoped_ptr<TileManager> TileManager::Create( |
202 TileManagerClient* client, | 202 TileManagerClient* client, |
203 base::SequencedTaskRunner* task_runner, | 203 base::SequencedTaskRunner* task_runner, |
204 ResourcePool* resource_pool, | 204 ResourcePool* resource_pool, |
205 TileTaskRunner* tile_task_runner, | 205 TileTaskRunner* tile_task_runner, |
| 206 Rasterizer* rasterizer, |
206 size_t scheduled_raster_task_limit) { | 207 size_t scheduled_raster_task_limit) { |
207 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, | 208 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, |
208 tile_task_runner, | 209 tile_task_runner, rasterizer, |
209 scheduled_raster_task_limit)); | 210 scheduled_raster_task_limit)); |
210 } | 211 } |
211 | 212 |
212 TileManager::TileManager( | 213 TileManager::TileManager( |
213 TileManagerClient* client, | 214 TileManagerClient* client, |
214 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | 215 const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
215 ResourcePool* resource_pool, | 216 ResourcePool* resource_pool, |
216 TileTaskRunner* tile_task_runner, | 217 TileTaskRunner* tile_task_runner, |
| 218 Rasterizer* rasterizer, |
217 size_t scheduled_raster_task_limit) | 219 size_t scheduled_raster_task_limit) |
218 : client_(client), | 220 : client_(client), |
219 task_runner_(task_runner), | 221 task_runner_(task_runner), |
220 resource_pool_(resource_pool), | 222 resource_pool_(resource_pool), |
221 tile_task_runner_(tile_task_runner), | 223 tile_task_runner_(tile_task_runner), |
| 224 rasterizer_(rasterizer), |
222 scheduled_raster_task_limit_(scheduled_raster_task_limit), | 225 scheduled_raster_task_limit_(scheduled_raster_task_limit), |
223 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), | 226 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), |
224 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 227 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
225 did_oom_on_last_assign_(false), | 228 did_oom_on_last_assign_(false), |
| 229 ready_to_activate_notifier_( |
| 230 task_runner_.get(), |
| 231 base::Bind(&TileManager::NotifyReadyToActivate, |
| 232 base::Unretained(this))), |
| 233 ready_to_draw_notifier_( |
| 234 task_runner_.get(), |
| 235 base::Bind(&TileManager::NotifyReadyToDraw, base::Unretained(this))), |
226 ready_to_activate_check_notifier_( | 236 ready_to_activate_check_notifier_( |
227 task_runner_.get(), | 237 task_runner_.get(), |
228 base::Bind(&TileManager::CheckIfReadyToActivate, | 238 base::Bind(&TileManager::CheckIfReadyToActivate, |
229 base::Unretained(this))), | 239 base::Unretained(this))), |
230 ready_to_draw_check_notifier_( | 240 ready_to_draw_check_notifier_( |
231 task_runner_.get(), | 241 task_runner_.get(), |
232 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), | 242 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), |
233 did_notify_ready_to_activate_(false), | 243 did_notify_ready_to_activate_(false), |
234 did_notify_ready_to_draw_(false) { | 244 did_notify_ready_to_draw_(false) { |
235 tile_task_runner_->SetClient(this); | 245 tile_task_runner_->SetClient(this); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 | 322 |
313 // When OOM, keep re-assigning memory until we reach a steady state | 323 // When OOM, keep re-assigning memory until we reach a steady state |
314 // where top-priority tiles are initialized. | 324 // where top-priority tiles are initialized. |
315 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && | 325 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && |
316 !memory_usage_above_limit) | 326 !memory_usage_above_limit) |
317 return; | 327 return; |
318 | 328 |
319 tile_task_runner_->CheckForCompletedTasks(); | 329 tile_task_runner_->CheckForCompletedTasks(); |
320 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 330 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
321 | 331 |
| 332 client_->BuildRasterQueue(&raster_priority_queue_, |
| 333 global_state_.tree_priority); |
322 TileVector tiles_that_need_to_be_rasterized; | 334 TileVector tiles_that_need_to_be_rasterized; |
323 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | 335 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 336 scheduled_raster_task_limit_, false); |
| 337 raster_priority_queue_.Reset(); |
324 | 338 |
325 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 339 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
326 // steady memory state. Keep scheduling tasks until we reach this state. | 340 // steady memory state. Keep scheduling tasks until we reach this state. |
327 if (!tiles_that_need_to_be_rasterized.empty()) { | 341 if (!tiles_that_need_to_be_rasterized.empty()) { |
328 ScheduleTasks(tiles_that_need_to_be_rasterized); | 342 ScheduleTasks(tiles_that_need_to_be_rasterized); |
329 return; | 343 return; |
330 } | 344 } |
331 | 345 |
332 FreeResourcesForReleasedTiles(); | 346 FreeResourcesForReleasedTiles(); |
333 | 347 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 | 401 |
388 NOTREACHED(); | 402 NOTREACHED(); |
389 } | 403 } |
390 | 404 |
391 void TileManager::PrepareTiles( | 405 void TileManager::PrepareTiles( |
392 const GlobalStateThatImpactsTilePriority& state) { | 406 const GlobalStateThatImpactsTilePriority& state) { |
393 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); | 407 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); |
394 | 408 |
395 global_state_ = state; | 409 global_state_ = state; |
396 | 410 |
397 // We need to call CheckForCompletedTasks() once in-between each call | 411 enum Rasterizer::PrepareTilesMode prepare_tiles_mode = |
398 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 412 rasterizer_->PrepareTilesMode(); |
399 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 413 |
400 tile_task_runner_->CheckForCompletedTasks(); | 414 if (prepare_tiles_mode != GpuRasterizer::PREPARE_NONE) { |
401 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 415 // We need to call CheckForCompletedTasks() once in-between each call |
| 416 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 417 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 418 tile_task_runner_->CheckForCompletedTasks(); |
| 419 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 420 } |
| 421 |
| 422 FreeResourcesForReleasedTiles(); |
| 423 CleanUpReleasedTiles(); |
| 424 |
| 425 client_->BuildRasterQueue(&raster_priority_queue_, |
| 426 global_state_.tree_priority); |
| 427 TileVector tiles_that_need_to_be_rasterized; |
| 428 |
| 429 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 430 scheduled_raster_task_limit_, false); |
| 431 |
| 432 raster_priority_queue_.Reset(); |
| 433 |
| 434 // Schedule tile tasks. |
| 435 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 436 |
| 437 did_notify_ready_to_activate_ = false; |
| 438 did_notify_ready_to_draw_ = false; |
| 439 } else { |
| 440 did_notify_ready_to_activate_ = false; |
| 441 did_notify_ready_to_draw_ = false; |
| 442 ready_to_activate_notifier_.Schedule(); |
| 443 ready_to_draw_notifier_.Schedule(); |
402 } | 444 } |
403 | 445 |
| 446 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
| 447 "state", BasicStateAsValue()); |
| 448 |
| 449 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
| 450 resource_pool_->total_memory_usage_bytes() - |
| 451 resource_pool_->acquired_memory_usage_bytes()); |
| 452 } |
| 453 |
| 454 void TileManager::PrepareTilesBeforeDraw( |
| 455 const GlobalStateThatImpactsTilePriority& state) { |
| 456 DCHECK(rasterizer_); |
| 457 TRACE_EVENT0("cc", "TileManager::PrepareTilesBeforeDraw"); |
| 458 |
| 459 enum Rasterizer::PrepareTilesMode prepare_tiles_mode = |
| 460 rasterizer_->PrepareTilesMode(); |
| 461 |
| 462 if (prepare_tiles_mode == GpuRasterizer::RASTERIZE_PRIORITIZED_TILES) |
| 463 return; |
| 464 |
| 465 global_state_ = state; |
| 466 |
404 FreeResourcesForReleasedTiles(); | 467 FreeResourcesForReleasedTiles(); |
405 CleanUpReleasedTiles(); | 468 CleanUpReleasedTiles(); |
406 | 469 |
| 470 client_->BuildRasterQueue(&raster_priority_queue_, |
| 471 global_state_.tree_priority); |
407 TileVector tiles_that_need_to_be_rasterized; | 472 TileVector tiles_that_need_to_be_rasterized; |
408 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | 473 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 474 std::numeric_limits<size_t>::max(), true); |
409 | 475 |
410 // Schedule tile tasks. | 476 // We must reduce the amount of unused resoruces before calling |
411 ScheduleTasks(tiles_that_need_to_be_rasterized); | 477 // RunTasks to prevent usage from rising above limits. |
| 478 resource_pool_->ReduceResourceUsage(); |
412 | 479 |
413 did_notify_ready_to_activate_ = false; | 480 // Run and complete all raster task synchronously. |
414 did_notify_ready_to_draw_ = false; | 481 rasterizer_->RasterizeTiles(tiles_that_need_to_be_rasterized, resource_pool_, |
| 482 this); |
415 | 483 |
416 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", | 484 // Use on-demand raster for any tiles that have not been been assigned |
| 485 // memory. This ensures that we draw even when OOM. |
| 486 while (!raster_priority_queue_.IsEmpty()) { |
| 487 Tile* tile = raster_priority_queue_.Top(); |
| 488 ManagedTileState& mts = tile->managed_state(); |
| 489 |
| 490 if (tile->required_for_draw() && !mts.draw_info.IsReadyToDraw()) { |
| 491 mts.draw_info.set_rasterize_on_demand(); |
| 492 client_->NotifyTileStateChanged(tile); |
| 493 } |
| 494 raster_priority_queue_.Pop(); |
| 495 } |
| 496 raster_priority_queue_.Reset(); |
| 497 |
| 498 if (IsReadyToDraw()) |
| 499 client_->NotifyReadyToDraw(); |
| 500 |
| 501 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state", |
417 BasicStateAsValue()); | 502 BasicStateAsValue()); |
418 | 503 |
419 TRACE_COUNTER_ID1("cc", | 504 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
420 "unused_memory_bytes", | |
421 this, | |
422 resource_pool_->total_memory_usage_bytes() - | 505 resource_pool_->total_memory_usage_bytes() - |
423 resource_pool_->acquired_memory_usage_bytes()); | 506 resource_pool_->acquired_memory_usage_bytes()); |
424 } | 507 } |
425 | 508 |
426 void TileManager::UpdateVisibleTiles() { | 509 void TileManager::UpdateVisibleTiles() { |
427 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); | 510 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); |
428 | 511 |
429 tile_task_runner_->CheckForCompletedTasks(); | 512 tile_task_runner_->CheckForCompletedTasks(); |
430 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 513 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
431 | 514 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 return priority.priority_bin > TilePriority::SOON; | 598 return priority.priority_bin > TilePriority::SOON; |
516 case ALLOW_ANYTHING: | 599 case ALLOW_ANYTHING: |
517 return priority.distance_to_visible == | 600 return priority.distance_to_visible == |
518 std::numeric_limits<float>::infinity(); | 601 std::numeric_limits<float>::infinity(); |
519 } | 602 } |
520 NOTREACHED(); | 603 NOTREACHED(); |
521 return true; | 604 return true; |
522 } | 605 } |
523 | 606 |
524 void TileManager::AssignGpuMemoryToTiles( | 607 void TileManager::AssignGpuMemoryToTiles( |
525 TileVector* tiles_that_need_to_be_rasterized) { | 608 TileVector* tiles_that_need_to_be_rasterized, |
| 609 size_t scheduled_raster_task_limit, |
| 610 bool required_for_draw_only) { |
526 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); | 611 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); |
527 | 612 |
528 // Maintain the list of released resources that can potentially be re-used | 613 // Maintain the list of released resources that can potentially be re-used |
529 // or deleted. | 614 // or deleted. |
530 // If this operation becomes expensive too, only do this after some | 615 // If this operation becomes expensive too, only do this after some |
531 // resource(s) was returned. Note that in that case, one also need to | 616 // resource(s) was returned. Note that in that case, one also need to |
532 // invalidate when releasing some resource from the pool. | 617 // invalidate when releasing some resource from the pool. |
533 resource_pool_->CheckBusyResources(false); | 618 resource_pool_->CheckBusyResources(false); |
534 | 619 |
535 // Now give memory out to the tiles until we're out, and build | 620 // Now give memory out to the tiles until we're out, and build |
536 // the needs-to-be-rasterized queue. | 621 // the needs-to-be-rasterized queue. |
537 unsigned schedule_priority = 1u; | 622 unsigned schedule_priority = 1u; |
538 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 623 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
539 bool had_enough_memory_to_schedule_tiles_needed_now = true; | 624 bool had_enough_memory_to_schedule_tiles_needed_now = true; |
540 | 625 |
541 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, | 626 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, |
542 global_state_.num_resources_limit); | 627 global_state_.num_resources_limit); |
543 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, | 628 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, |
544 global_state_.num_resources_limit); | 629 global_state_.num_resources_limit); |
545 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), | 630 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
546 resource_pool_->acquired_resource_count()); | 631 resource_pool_->acquired_resource_count()); |
547 | 632 |
548 eviction_priority_queue_is_up_to_date_ = false; | 633 eviction_priority_queue_is_up_to_date_ = false; |
549 client_->BuildRasterQueue(&raster_priority_queue_, | |
550 global_state_.tree_priority); | |
551 | 634 |
552 while (!raster_priority_queue_.IsEmpty()) { | 635 while (!raster_priority_queue_.IsEmpty()) { |
553 Tile* tile = raster_priority_queue_.Top(); | 636 Tile* tile = raster_priority_queue_.Top(); |
| 637 |
| 638 if (required_for_draw_only) { |
| 639 if (!tile->required_for_draw()) { |
| 640 raster_priority_queue_.Pop(); |
| 641 continue; |
| 642 } |
| 643 } |
| 644 |
554 TilePriority priority = tile->combined_priority(); | 645 TilePriority priority = tile->combined_priority(); |
555 | 646 |
556 if (TilePriorityViolatesMemoryPolicy(priority)) { | 647 if (TilePriorityViolatesMemoryPolicy(priority)) { |
557 TRACE_EVENT_INSTANT0( | 648 TRACE_EVENT_INSTANT0( |
558 "cc", | 649 "cc", "TileManager::AssignGpuMemory tile violates memory policy", |
559 "TileManager::AssignGpuMemory tile violates memory policy", | |
560 TRACE_EVENT_SCOPE_THREAD); | 650 TRACE_EVENT_SCOPE_THREAD); |
561 break; | 651 break; |
562 } | 652 } |
563 | 653 |
564 // We won't be able to schedule this tile, so break out early. | 654 // We won't be able to schedule this tile, so break out early. |
565 if (tiles_that_need_to_be_rasterized->size() >= | 655 if (tiles_that_need_to_be_rasterized->size() >= |
566 scheduled_raster_task_limit_) { | 656 scheduled_raster_task_limit) { |
567 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 657 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
568 break; | 658 break; |
569 } | 659 } |
570 | 660 |
571 ManagedTileState& mts = tile->managed_state(); | 661 ManagedTileState& mts = tile->managed_state(); |
572 mts.scheduled_priority = schedule_priority++; | 662 mts.scheduled_priority = schedule_priority++; |
573 mts.resolution = priority.resolution; | 663 mts.resolution = priority.resolution; |
574 | 664 |
575 DCHECK(mts.draw_info.mode() == | 665 DCHECK(mts.draw_info.mode() == |
576 ManagedTileState::DrawInfo::PICTURE_PILE_MODE || | 666 ManagedTileState::DrawInfo::PICTURE_PILE_MODE || |
(...skipping 12 matching lines...) Expand all Loading... |
589 | 679 |
590 // This is the memory limit that will be used by this tile. Depending on | 680 // This is the memory limit that will be used by this tile. Depending on |
591 // the tile priority, it will be one of hard_memory_limit or | 681 // the tile priority, it will be one of hard_memory_limit or |
592 // soft_memory_limit. | 682 // soft_memory_limit. |
593 MemoryUsage& tile_memory_limit = | 683 MemoryUsage& tile_memory_limit = |
594 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; | 684 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; |
595 | 685 |
596 bool memory_usage_is_within_limit = | 686 bool memory_usage_is_within_limit = |
597 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( | 687 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( |
598 tile_memory_limit - memory_required_by_tile_to_be_scheduled, | 688 tile_memory_limit - memory_required_by_tile_to_be_scheduled, |
599 priority, | 689 priority, &memory_usage); |
600 &memory_usage); | |
601 | 690 |
602 // If we couldn't fit the tile into our current memory limit, then we're | 691 // If we couldn't fit the tile into our current memory limit, then we're |
603 // done. | 692 // done. |
604 if (!memory_usage_is_within_limit) { | 693 if (!memory_usage_is_within_limit) { |
605 if (tile_is_needed_now) | 694 if (tile_is_needed_now) |
606 had_enough_memory_to_schedule_tiles_needed_now = false; | 695 had_enough_memory_to_schedule_tiles_needed_now = false; |
607 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 696 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
608 break; | 697 break; |
609 } | 698 } |
610 | 699 |
(...skipping 10 matching lines...) Expand all Loading... |
621 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", | 710 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", |
622 !had_enough_memory_to_schedule_tiles_needed_now); | 711 !had_enough_memory_to_schedule_tiles_needed_now); |
623 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; | 712 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; |
624 | 713 |
625 memory_stats_from_last_assign_.total_budget_in_bytes = | 714 memory_stats_from_last_assign_.total_budget_in_bytes = |
626 global_state_.hard_memory_limit_in_bytes; | 715 global_state_.hard_memory_limit_in_bytes; |
627 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); | 716 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); |
628 memory_stats_from_last_assign_.had_enough_memory = | 717 memory_stats_from_last_assign_.had_enough_memory = |
629 had_enough_memory_to_schedule_tiles_needed_now; | 718 had_enough_memory_to_schedule_tiles_needed_now; |
630 | 719 |
631 raster_priority_queue_.Reset(); | 720 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", |
632 | |
633 TRACE_EVENT_END2("cc", | |
634 "TileManager::AssignGpuMemoryToTiles", | |
635 "all_tiles_that_need_to_be_rasterized_are_scheduled", | 721 "all_tiles_that_need_to_be_rasterized_are_scheduled", |
636 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 722 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
637 "had_enough_memory_to_schedule_tiles_needed_now", | 723 "had_enough_memory_to_schedule_tiles_needed_now", |
638 had_enough_memory_to_schedule_tiles_needed_now); | 724 had_enough_memory_to_schedule_tiles_needed_now); |
639 } | 725 } |
640 | 726 |
641 void TileManager::FreeResourcesForTile(Tile* tile) { | 727 void TileManager::FreeResourcesForTile(Tile* tile) { |
642 ManagedTileState& mts = tile->managed_state(); | 728 ManagedTileState& mts = tile->managed_state(); |
643 if (mts.draw_info.resource_) | 729 if (mts.draw_info.resource_) |
644 resource_pool_->ReleaseResource(mts.draw_info.resource_.Pass()); | 730 resource_pool_->ReleaseResource(mts.draw_info.resource_.Pass()); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 return; | 862 return; |
777 | 863 |
778 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; | 864 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; |
779 PixelRefTaskMap::iterator task_it = | 865 PixelRefTaskMap::iterator task_it = |
780 pixel_ref_tasks.find(pixel_ref->getGenerationID()); | 866 pixel_ref_tasks.find(pixel_ref->getGenerationID()); |
781 | 867 |
782 if (task_it != pixel_ref_tasks.end()) | 868 if (task_it != pixel_ref_tasks.end()) |
783 pixel_ref_tasks.erase(task_it); | 869 pixel_ref_tasks.erase(task_it); |
784 } | 870 } |
785 | 871 |
| 872 void TileManager::CompleteRasterTask( |
| 873 Tile::Id tile_id, |
| 874 scoped_ptr<ScopedResource> resource, |
| 875 const RasterSource::SolidColorAnalysis& analysis) { |
| 876 OnRasterTaskCompleted(tile_id, resource.Pass(), analysis, false); |
| 877 } |
| 878 |
786 void TileManager::OnRasterTaskCompleted( | 879 void TileManager::OnRasterTaskCompleted( |
787 Tile::Id tile_id, | 880 Tile::Id tile_id, |
788 scoped_ptr<ScopedResource> resource, | 881 scoped_ptr<ScopedResource> resource, |
789 const RasterSource::SolidColorAnalysis& analysis, | 882 const RasterSource::SolidColorAnalysis& analysis, |
790 bool was_canceled) { | 883 bool was_canceled) { |
791 DCHECK(tiles_.find(tile_id) != tiles_.end()); | 884 DCHECK(tiles_.find(tile_id) != tiles_.end()); |
792 | 885 |
793 Tile* tile = tiles_[tile_id]; | 886 Tile* tile = tiles_[tile_id]; |
794 ManagedTileState& mts = tile->managed_state(); | 887 ManagedTileState& mts = tile->managed_state(); |
795 DCHECK(mts.raster_task.get()); | 888 if (mts.raster_task.get()) { |
796 orphan_raster_tasks_.push_back(mts.raster_task); | 889 orphan_raster_tasks_.push_back(mts.raster_task); |
797 mts.raster_task = NULL; | 890 mts.raster_task = NULL; |
| 891 } |
798 | 892 |
799 if (was_canceled) { | 893 if (was_canceled) { |
800 ++update_visible_tiles_stats_.canceled_count; | 894 ++update_visible_tiles_stats_.canceled_count; |
801 resource_pool_->ReleaseResource(resource.Pass()); | 895 resource_pool_->ReleaseResource(resource.Pass()); |
802 return; | 896 return; |
803 } | 897 } |
804 | 898 |
805 ++update_visible_tiles_stats_.completed_count; | 899 ++update_visible_tiles_stats_.completed_count; |
806 | 900 |
807 if (analysis.is_solid_color) { | 901 if (analysis.is_solid_color) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
859 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); | 953 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); |
860 | 954 |
861 for (const auto& layer : layers) { | 955 for (const auto& layer : layers) { |
862 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) | 956 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) |
863 return false; | 957 return false; |
864 } | 958 } |
865 | 959 |
866 return true; | 960 return true; |
867 } | 961 } |
868 | 962 |
| 963 void TileManager::NotifyReadyToActivate() { |
| 964 TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate"); |
| 965 if (did_notify_ready_to_activate_) |
| 966 return; |
| 967 client_->NotifyReadyToActivate(); |
| 968 did_notify_ready_to_activate_ = true; |
| 969 } |
| 970 |
| 971 void TileManager::NotifyReadyToDraw() { |
| 972 TRACE_EVENT0("cc", "TileManager::NotifyReadyToDraw"); |
| 973 if (did_notify_ready_to_draw_) |
| 974 return; |
| 975 client_->NotifyReadyToDraw(); |
| 976 did_notify_ready_to_draw_ = true; |
| 977 } |
| 978 |
869 void TileManager::CheckIfReadyToActivate() { | 979 void TileManager::CheckIfReadyToActivate() { |
870 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); | 980 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); |
871 | 981 |
872 tile_task_runner_->CheckForCompletedTasks(); | 982 tile_task_runner_->CheckForCompletedTasks(); |
873 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 983 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
874 | 984 |
875 if (did_notify_ready_to_activate_) | 985 if (did_notify_ready_to_activate_) |
876 return; | 986 return; |
877 if (!IsReadyToActivate()) | 987 if (!IsReadyToActivate()) |
878 return; | 988 return; |
879 | 989 |
880 client_->NotifyReadyToActivate(); | 990 NotifyReadyToActivate(); |
881 did_notify_ready_to_activate_ = true; | |
882 } | 991 } |
883 | 992 |
884 void TileManager::CheckIfReadyToDraw() { | 993 void TileManager::CheckIfReadyToDraw() { |
885 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); | 994 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); |
886 | 995 |
887 tile_task_runner_->CheckForCompletedTasks(); | 996 tile_task_runner_->CheckForCompletedTasks(); |
888 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 997 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
889 | 998 |
890 if (did_notify_ready_to_draw_) | 999 if (did_notify_ready_to_draw_) |
891 return; | 1000 return; |
892 if (!IsReadyToDraw()) | 1001 if (!IsReadyToDraw()) |
893 return; | 1002 return; |
894 | 1003 |
895 client_->NotifyReadyToDraw(); | 1004 NotifyReadyToDraw(); |
896 did_notify_ready_to_draw_ = true; | |
897 } | 1005 } |
898 | 1006 |
899 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { | 1007 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { |
900 } | 1008 } |
901 | 1009 |
902 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) | 1010 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) |
903 : memory_bytes_(memory_bytes), resource_count_(resource_count) { | 1011 : memory_bytes_(memory_bytes), resource_count_(resource_count) { |
904 } | 1012 } |
905 | 1013 |
906 // static | 1014 // static |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 result -= other; | 1048 result -= other; |
941 return result; | 1049 return result; |
942 } | 1050 } |
943 | 1051 |
944 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 1052 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
945 return memory_bytes_ > limit.memory_bytes_ || | 1053 return memory_bytes_ > limit.memory_bytes_ || |
946 resource_count_ > limit.resource_count_; | 1054 resource_count_ > limit.resource_count_; |
947 } | 1055 } |
948 | 1056 |
949 } // namespace cc | 1057 } // namespace cc |
OLD | NEW |