| 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 |