Chromium Code Reviews| 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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/debug/trace_event_argument.h" | 12 #include "base/debug/trace_event_argument.h" |
| 13 #include "base/json/json_writer.h" | 13 #include "base/json/json_writer.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
| 16 #include "cc/debug/devtools_instrumentation.h" | 16 #include "cc/debug/devtools_instrumentation.h" |
| 17 #include "cc/debug/frame_viewer_instrumentation.h" | 17 #include "cc/debug/frame_viewer_instrumentation.h" |
| 18 #include "cc/debug/traced_value.h" | 18 #include "cc/debug/traced_value.h" |
| 19 #include "cc/layers/picture_layer_impl.h" | 19 #include "cc/layers/picture_layer_impl.h" |
| 20 #include "cc/resources/raster_buffer.h" | 20 #include "cc/resources/raster_buffer.h" |
| 21 #include "cc/resources/rasterizer.h" | |
| 21 #include "cc/resources/tile.h" | 22 #include "cc/resources/tile.h" |
| 22 #include "cc/resources/tile_task_runner.h" | 23 #include "cc/resources/tile_task_runner.h" |
| 23 #include "ui/gfx/geometry/rect_conversions.h" | 24 #include "ui/gfx/geometry/rect_conversions.h" |
| 24 | 25 |
| 25 namespace cc { | 26 namespace cc { |
| 26 namespace { | 27 namespace { |
| 27 | 28 |
| 28 // Flag to indicate whether we should try and detect that | 29 // Flag to indicate whether we should try and detect that |
| 29 // a tile is of solid color. | 30 // a tile is of solid color. |
| 30 const bool kUseColorEstimator = true; | 31 const bool kUseColorEstimator = true; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 state->SetInteger("canceled_count", stats.canceled_count); | 195 state->SetInteger("canceled_count", stats.canceled_count); |
| 195 return state; | 196 return state; |
| 196 } | 197 } |
| 197 | 198 |
| 198 // static | 199 // static |
| 199 scoped_ptr<TileManager> TileManager::Create( | 200 scoped_ptr<TileManager> TileManager::Create( |
| 200 TileManagerClient* client, | 201 TileManagerClient* client, |
| 201 base::SequencedTaskRunner* task_runner, | 202 base::SequencedTaskRunner* task_runner, |
| 202 ResourcePool* resource_pool, | 203 ResourcePool* resource_pool, |
| 203 TileTaskRunner* tile_task_runner, | 204 TileTaskRunner* tile_task_runner, |
| 205 Rasterizer* rasterizer, | |
| 204 size_t scheduled_raster_task_limit) { | 206 size_t scheduled_raster_task_limit) { |
| 205 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, | 207 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, |
| 206 tile_task_runner, | 208 tile_task_runner, rasterizer, |
| 207 scheduled_raster_task_limit)); | 209 scheduled_raster_task_limit)); |
| 208 } | 210 } |
| 209 | 211 |
| 210 TileManager::TileManager( | 212 TileManager::TileManager( |
| 211 TileManagerClient* client, | 213 TileManagerClient* client, |
| 212 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | 214 const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
| 213 ResourcePool* resource_pool, | 215 ResourcePool* resource_pool, |
| 214 TileTaskRunner* tile_task_runner, | 216 TileTaskRunner* tile_task_runner, |
| 217 Rasterizer* rasterizer, | |
| 215 size_t scheduled_raster_task_limit) | 218 size_t scheduled_raster_task_limit) |
| 216 : client_(client), | 219 : client_(client), |
| 217 task_runner_(task_runner), | 220 task_runner_(task_runner), |
| 218 resource_pool_(resource_pool), | 221 resource_pool_(resource_pool), |
| 219 tile_task_runner_(tile_task_runner), | 222 tile_task_runner_(tile_task_runner), |
| 223 rasterizer_(rasterizer), | |
| 220 scheduled_raster_task_limit_(scheduled_raster_task_limit), | 224 scheduled_raster_task_limit_(scheduled_raster_task_limit), |
| 221 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), | 225 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), |
| 222 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 226 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
| 223 did_oom_on_last_assign_(false), | 227 did_oom_on_last_assign_(false), |
| 228 ready_to_activate_notifier_( | |
| 229 task_runner_.get(), | |
| 230 base::Bind(&TileManager::NotifyReadyToActivate, | |
| 231 base::Unretained(this))), | |
| 232 ready_to_draw_notifier_( | |
| 233 task_runner_.get(), | |
| 234 base::Bind(&TileManager::NotifyReadyToDraw, base::Unretained(this))), | |
| 224 ready_to_activate_check_notifier_( | 235 ready_to_activate_check_notifier_( |
| 225 task_runner_.get(), | 236 task_runner_.get(), |
| 226 base::Bind(&TileManager::CheckIfReadyToActivate, | 237 base::Bind(&TileManager::CheckIfReadyToActivate, |
| 227 base::Unretained(this))), | 238 base::Unretained(this))), |
| 228 ready_to_draw_check_notifier_( | 239 ready_to_draw_check_notifier_( |
| 229 task_runner_.get(), | 240 task_runner_.get(), |
| 230 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), | 241 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), |
| 231 did_notify_ready_to_activate_(false), | 242 did_notify_ready_to_activate_(false), |
| 232 did_notify_ready_to_draw_(false) { | 243 did_notify_ready_to_draw_(false) { |
| 233 tile_task_runner_->SetClient(this); | 244 tile_task_runner_->SetClient(this); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 310 | 321 |
| 311 // When OOM, keep re-assigning memory until we reach a steady state | 322 // When OOM, keep re-assigning memory until we reach a steady state |
| 312 // where top-priority tiles are initialized. | 323 // where top-priority tiles are initialized. |
| 313 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && | 324 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && |
| 314 !memory_usage_above_limit) | 325 !memory_usage_above_limit) |
| 315 return; | 326 return; |
| 316 | 327 |
| 317 tile_task_runner_->CheckForCompletedTasks(); | 328 tile_task_runner_->CheckForCompletedTasks(); |
| 318 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 329 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 319 | 330 |
| 331 client_->BuildRasterQueue(&raster_priority_queue_, | |
| 332 global_state_.tree_priority); | |
| 320 TileVector tiles_that_need_to_be_rasterized; | 333 TileVector tiles_that_need_to_be_rasterized; |
| 321 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | 334 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 335 scheduled_raster_task_limit_, false); | |
| 336 raster_priority_queue_.Reset(); | |
| 322 | 337 |
| 323 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 338 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
| 324 // steady memory state. Keep scheduling tasks until we reach this state. | 339 // steady memory state. Keep scheduling tasks until we reach this state. |
| 325 if (!tiles_that_need_to_be_rasterized.empty()) { | 340 if (!tiles_that_need_to_be_rasterized.empty()) { |
| 326 ScheduleTasks(tiles_that_need_to_be_rasterized); | 341 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 327 return; | 342 return; |
| 328 } | 343 } |
| 329 | 344 |
| 330 FreeResourcesForReleasedTiles(); | 345 FreeResourcesForReleasedTiles(); |
| 331 | 346 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 | 400 |
| 386 NOTREACHED(); | 401 NOTREACHED(); |
| 387 } | 402 } |
| 388 | 403 |
| 389 void TileManager::PrepareTiles( | 404 void TileManager::PrepareTiles( |
| 390 const GlobalStateThatImpactsTilePriority& state) { | 405 const GlobalStateThatImpactsTilePriority& state) { |
| 391 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); | 406 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); |
| 392 | 407 |
| 393 global_state_ = state; | 408 global_state_ = state; |
| 394 | 409 |
| 395 // We need to call CheckForCompletedTasks() once in-between each call | 410 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode(); |
| 396 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 411 |
| 397 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 412 if (prepare_tiles_mode != PrepareTilesMode::PREPARE_NONE) { |
| 398 tile_task_runner_->CheckForCompletedTasks(); | 413 // We need to call CheckForCompletedTasks() once in-between each call |
| 399 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 414 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 415 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | |
| 416 tile_task_runner_->CheckForCompletedTasks(); | |
| 417 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | |
| 418 } | |
| 419 | |
| 420 FreeResourcesForReleasedTiles(); | |
| 421 CleanUpReleasedTiles(); | |
| 422 | |
| 423 client_->BuildRasterQueue(&raster_priority_queue_, | |
| 424 global_state_.tree_priority); | |
| 425 TileVector tiles_that_need_to_be_rasterized; | |
| 426 | |
| 427 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | |
| 428 scheduled_raster_task_limit_, false); | |
| 429 | |
| 430 raster_priority_queue_.Reset(); | |
| 431 | |
| 432 // Schedule tile tasks. | |
| 433 ScheduleTasks(tiles_that_need_to_be_rasterized); | |
| 434 | |
| 435 did_notify_ready_to_activate_ = false; | |
| 436 did_notify_ready_to_draw_ = false; | |
| 437 } else { | |
| 438 did_notify_ready_to_activate_ = false; | |
| 439 did_notify_ready_to_draw_ = false; | |
| 440 ready_to_activate_notifier_.Schedule(); | |
|
vmpstr
2014/12/23 09:51:02
I'm not really a fan of these callbacks. Can we ju
hendrikw
2014/12/23 18:10:33
Nope, they must be scheduled. vmiura, can you jum
vmiura
2014/12/23 18:33:13
The client can end up recursing back into TM::Prep
| |
| 441 ready_to_draw_notifier_.Schedule(); | |
| 400 } | 442 } |
| 401 | 443 |
| 444 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, | |
| 445 "state", BasicStateAsValue()); | |
| 446 | |
| 447 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, | |
| 448 resource_pool_->total_memory_usage_bytes() - | |
| 449 resource_pool_->acquired_memory_usage_bytes()); | |
| 450 } | |
| 451 | |
| 452 void TileManager::SynchronouslyRasterizeTiles( | |
| 453 const GlobalStateThatImpactsTilePriority& state) { | |
| 454 TRACE_EVENT0("cc", "TileManager::SynchronouslyRasterizeTiles"); | |
| 455 | |
| 456 DCHECK(rasterizer_->GetPrepareTilesMode() != | |
| 457 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES); | |
| 458 | |
| 459 global_state_ = state; | |
| 460 | |
| 402 FreeResourcesForReleasedTiles(); | 461 FreeResourcesForReleasedTiles(); |
| 403 CleanUpReleasedTiles(); | 462 CleanUpReleasedTiles(); |
| 404 | 463 |
| 464 client_->BuildRasterQueue(&raster_priority_queue_, | |
|
vmpstr
2014/12/23 09:51:03
I think I've mentioned this on the original patch,
hendrikw
2014/12/23 18:10:33
I guess I'll talk with you about this when you get
| |
| 465 global_state_.tree_priority); | |
| 405 TileVector tiles_that_need_to_be_rasterized; | 466 TileVector tiles_that_need_to_be_rasterized; |
| 406 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | 467 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 468 std::numeric_limits<size_t>::max(), true); | |
| 407 | 469 |
| 408 // Schedule tile tasks. | 470 // We must reduce the amount of unused resoruces before calling |
| 409 ScheduleTasks(tiles_that_need_to_be_rasterized); | 471 // RunTasks to prevent usage from rising above limits. |
| 472 resource_pool_->ReduceResourceUsage(); | |
| 410 | 473 |
| 411 did_notify_ready_to_activate_ = false; | 474 // Run and complete all raster task synchronously. |
| 412 did_notify_ready_to_draw_ = false; | 475 rasterizer_->RasterizeTiles(tiles_that_need_to_be_rasterized, resource_pool_, |
| 476 this); | |
| 413 | 477 |
| 414 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", | 478 // Use on-demand raster for any tiles that have not been been assigned |
| 479 // memory. This ensures that we draw even when OOM. | |
| 480 while (!raster_priority_queue_.IsEmpty()) { | |
| 481 Tile* tile = raster_priority_queue_.Top(); | |
| 482 TileDrawInfo& draw_info = tile->draw_info(); | |
| 483 | |
| 484 if (tile->required_for_draw() && !draw_info.IsReadyToDraw()) { | |
| 485 draw_info.set_rasterize_on_demand(); | |
| 486 client_->NotifyTileStateChanged(tile); | |
| 487 } | |
| 488 raster_priority_queue_.Pop(); | |
| 489 } | |
| 490 raster_priority_queue_.Reset(); | |
| 491 | |
| 492 if (IsReadyToDraw()) | |
| 493 client_->NotifyReadyToDraw(); | |
| 494 | |
| 495 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state", | |
| 415 BasicStateAsValue()); | 496 BasicStateAsValue()); |
| 416 | 497 |
| 417 TRACE_COUNTER_ID1("cc", | 498 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
| 418 "unused_memory_bytes", | |
| 419 this, | |
| 420 resource_pool_->total_memory_usage_bytes() - | 499 resource_pool_->total_memory_usage_bytes() - |
| 421 resource_pool_->acquired_memory_usage_bytes()); | 500 resource_pool_->acquired_memory_usage_bytes()); |
| 422 } | 501 } |
| 423 | 502 |
| 424 void TileManager::UpdateVisibleTiles() { | 503 void TileManager::UpdateVisibleTiles( |
| 504 const GlobalStateThatImpactsTilePriority& state) { | |
| 425 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); | 505 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); |
| 426 | 506 |
| 507 DCHECK(rasterizer_); | |
| 508 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode(); | |
| 509 | |
| 510 if (prepare_tiles_mode != PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES) | |
| 511 SynchronouslyRasterizeTiles(state); | |
| 512 | |
| 427 tile_task_runner_->CheckForCompletedTasks(); | 513 tile_task_runner_->CheckForCompletedTasks(); |
| 428 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 514 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 429 | 515 |
| 430 TRACE_EVENT_INSTANT1( | 516 TRACE_EVENT_INSTANT1( |
| 431 "cc", | 517 "cc", |
| 432 "DidUpdateVisibleTiles", | 518 "DidUpdateVisibleTiles", |
| 433 TRACE_EVENT_SCOPE_THREAD, | 519 TRACE_EVENT_SCOPE_THREAD, |
| 434 "stats", | 520 "stats", |
| 435 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); | 521 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); |
| 436 update_visible_tiles_stats_ = RasterTaskCompletionStats(); | 522 update_visible_tiles_stats_ = RasterTaskCompletionStats(); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 return priority.priority_bin > TilePriority::SOON; | 599 return priority.priority_bin > TilePriority::SOON; |
| 514 case ALLOW_ANYTHING: | 600 case ALLOW_ANYTHING: |
| 515 return priority.distance_to_visible == | 601 return priority.distance_to_visible == |
| 516 std::numeric_limits<float>::infinity(); | 602 std::numeric_limits<float>::infinity(); |
| 517 } | 603 } |
| 518 NOTREACHED(); | 604 NOTREACHED(); |
| 519 return true; | 605 return true; |
| 520 } | 606 } |
| 521 | 607 |
| 522 void TileManager::AssignGpuMemoryToTiles( | 608 void TileManager::AssignGpuMemoryToTiles( |
| 523 TileVector* tiles_that_need_to_be_rasterized) { | 609 TileVector* tiles_that_need_to_be_rasterized, |
| 610 size_t scheduled_raster_task_limit, | |
| 611 bool required_for_draw_only) { | |
| 524 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); | 612 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| 525 | 613 |
| 526 // Maintain the list of released resources that can potentially be re-used | 614 // Maintain the list of released resources that can potentially be re-used |
| 527 // or deleted. | 615 // or deleted. |
| 528 // If this operation becomes expensive too, only do this after some | 616 // If this operation becomes expensive too, only do this after some |
| 529 // resource(s) was returned. Note that in that case, one also need to | 617 // resource(s) was returned. Note that in that case, one also need to |
| 530 // invalidate when releasing some resource from the pool. | 618 // invalidate when releasing some resource from the pool. |
| 531 resource_pool_->CheckBusyResources(false); | 619 resource_pool_->CheckBusyResources(false); |
| 532 | 620 |
| 533 // Now give memory out to the tiles until we're out, and build | 621 // Now give memory out to the tiles until we're out, and build |
| 534 // the needs-to-be-rasterized queue. | 622 // the needs-to-be-rasterized queue. |
| 535 unsigned schedule_priority = 1u; | 623 unsigned schedule_priority = 1u; |
| 536 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 624 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
| 537 bool had_enough_memory_to_schedule_tiles_needed_now = true; | 625 bool had_enough_memory_to_schedule_tiles_needed_now = true; |
| 538 | 626 |
| 539 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, | 627 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, |
| 540 global_state_.num_resources_limit); | 628 global_state_.num_resources_limit); |
| 541 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, | 629 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, |
| 542 global_state_.num_resources_limit); | 630 global_state_.num_resources_limit); |
| 543 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), | 631 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
| 544 resource_pool_->acquired_resource_count()); | 632 resource_pool_->acquired_resource_count()); |
| 545 | 633 |
| 546 eviction_priority_queue_is_up_to_date_ = false; | 634 eviction_priority_queue_is_up_to_date_ = false; |
| 547 client_->BuildRasterQueue(&raster_priority_queue_, | |
| 548 global_state_.tree_priority); | |
| 549 | 635 |
| 550 while (!raster_priority_queue_.IsEmpty()) { | 636 while (!raster_priority_queue_.IsEmpty()) { |
| 551 Tile* tile = raster_priority_queue_.Top(); | 637 Tile* tile = raster_priority_queue_.Top(); |
| 638 | |
| 639 if (required_for_draw_only) { | |
| 640 if (!tile->required_for_draw()) { | |
| 641 raster_priority_queue_.Pop(); | |
|
vmpstr
2014/12/23 09:51:02
I think this needs some thought. I don't like the
vmiura
2014/12/23 18:33:13
Initially I think we might want to have fewer chan
hendrikw
2014/12/23 18:54:29
Done.
| |
| 642 continue; | |
| 643 } | |
| 644 } | |
| 645 | |
| 552 TilePriority priority = tile->combined_priority(); | 646 TilePriority priority = tile->combined_priority(); |
| 553 | 647 |
| 554 if (TilePriorityViolatesMemoryPolicy(priority)) { | 648 if (TilePriorityViolatesMemoryPolicy(priority)) { |
| 555 TRACE_EVENT_INSTANT0( | 649 TRACE_EVENT_INSTANT0( |
| 556 "cc", | 650 "cc", "TileManager::AssignGpuMemory tile violates memory policy", |
| 557 "TileManager::AssignGpuMemory tile violates memory policy", | |
| 558 TRACE_EVENT_SCOPE_THREAD); | 651 TRACE_EVENT_SCOPE_THREAD); |
| 559 break; | 652 break; |
| 560 } | 653 } |
| 561 | 654 |
| 562 // We won't be able to schedule this tile, so break out early. | 655 // We won't be able to schedule this tile, so break out early. |
| 563 if (tiles_that_need_to_be_rasterized->size() >= | 656 if (tiles_that_need_to_be_rasterized->size() >= |
| 564 scheduled_raster_task_limit_) { | 657 scheduled_raster_task_limit) { |
| 565 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 658 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
| 566 break; | 659 break; |
| 567 } | 660 } |
| 568 | 661 |
| 569 TileDrawInfo& draw_info = tile->draw_info(); | 662 TileDrawInfo& draw_info = tile->draw_info(); |
| 570 tile->scheduled_priority_ = schedule_priority++; | 663 tile->scheduled_priority_ = schedule_priority++; |
| 571 | 664 |
| 572 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || | 665 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || |
| 573 !draw_info.IsReadyToDraw()); | 666 !draw_info.IsReadyToDraw()); |
| 574 | 667 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 585 | 678 |
| 586 // This is the memory limit that will be used by this tile. Depending on | 679 // This is the memory limit that will be used by this tile. Depending on |
| 587 // the tile priority, it will be one of hard_memory_limit or | 680 // the tile priority, it will be one of hard_memory_limit or |
| 588 // soft_memory_limit. | 681 // soft_memory_limit. |
| 589 MemoryUsage& tile_memory_limit = | 682 MemoryUsage& tile_memory_limit = |
| 590 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; | 683 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; |
| 591 | 684 |
| 592 bool memory_usage_is_within_limit = | 685 bool memory_usage_is_within_limit = |
| 593 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( | 686 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( |
| 594 tile_memory_limit - memory_required_by_tile_to_be_scheduled, | 687 tile_memory_limit - memory_required_by_tile_to_be_scheduled, |
| 595 priority, | 688 priority, &memory_usage); |
| 596 &memory_usage); | |
| 597 | 689 |
| 598 // If we couldn't fit the tile into our current memory limit, then we're | 690 // If we couldn't fit the tile into our current memory limit, then we're |
| 599 // done. | 691 // done. |
| 600 if (!memory_usage_is_within_limit) { | 692 if (!memory_usage_is_within_limit) { |
| 601 if (tile_is_needed_now) | 693 if (tile_is_needed_now) |
| 602 had_enough_memory_to_schedule_tiles_needed_now = false; | 694 had_enough_memory_to_schedule_tiles_needed_now = false; |
| 603 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 695 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
| 604 break; | 696 break; |
| 605 } | 697 } |
| 606 | 698 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 617 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", | 709 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", |
| 618 !had_enough_memory_to_schedule_tiles_needed_now); | 710 !had_enough_memory_to_schedule_tiles_needed_now); |
| 619 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; | 711 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; |
| 620 | 712 |
| 621 memory_stats_from_last_assign_.total_budget_in_bytes = | 713 memory_stats_from_last_assign_.total_budget_in_bytes = |
| 622 global_state_.hard_memory_limit_in_bytes; | 714 global_state_.hard_memory_limit_in_bytes; |
| 623 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); | 715 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); |
| 624 memory_stats_from_last_assign_.had_enough_memory = | 716 memory_stats_from_last_assign_.had_enough_memory = |
| 625 had_enough_memory_to_schedule_tiles_needed_now; | 717 had_enough_memory_to_schedule_tiles_needed_now; |
| 626 | 718 |
| 627 raster_priority_queue_.Reset(); | 719 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", |
| 628 | |
| 629 TRACE_EVENT_END2("cc", | |
| 630 "TileManager::AssignGpuMemoryToTiles", | |
| 631 "all_tiles_that_need_to_be_rasterized_are_scheduled", | 720 "all_tiles_that_need_to_be_rasterized_are_scheduled", |
| 632 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 721 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
| 633 "had_enough_memory_to_schedule_tiles_needed_now", | 722 "had_enough_memory_to_schedule_tiles_needed_now", |
| 634 had_enough_memory_to_schedule_tiles_needed_now); | 723 had_enough_memory_to_schedule_tiles_needed_now); |
| 635 } | 724 } |
| 636 | 725 |
| 637 void TileManager::FreeResourcesForTile(Tile* tile) { | 726 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 638 TileDrawInfo& draw_info = tile->draw_info(); | 727 TileDrawInfo& draw_info = tile->draw_info(); |
| 639 if (draw_info.resource_) | 728 if (draw_info.resource_) |
| 640 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); | 729 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 763 return; | 852 return; |
| 764 | 853 |
| 765 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; | 854 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; |
| 766 PixelRefTaskMap::iterator task_it = | 855 PixelRefTaskMap::iterator task_it = |
| 767 pixel_ref_tasks.find(pixel_ref->getGenerationID()); | 856 pixel_ref_tasks.find(pixel_ref->getGenerationID()); |
| 768 | 857 |
| 769 if (task_it != pixel_ref_tasks.end()) | 858 if (task_it != pixel_ref_tasks.end()) |
| 770 pixel_ref_tasks.erase(task_it); | 859 pixel_ref_tasks.erase(task_it); |
| 771 } | 860 } |
| 772 | 861 |
| 862 void TileManager::CompleteRasterTask( | |
|
vmpstr
2014/12/23 09:51:03
Why not just call OnRasterTaskCompleted with false
hendrikw
2014/12/23 18:10:33
Changing to a callback, so it doesn't matter.
| |
| 863 Tile::Id tile_id, | |
| 864 scoped_ptr<ScopedResource> resource, | |
| 865 const RasterSource::SolidColorAnalysis& analysis) { | |
| 866 OnRasterTaskCompleted(tile_id, resource.Pass(), analysis, false); | |
| 867 } | |
| 868 | |
| 773 void TileManager::OnRasterTaskCompleted( | 869 void TileManager::OnRasterTaskCompleted( |
|
vmpstr
2014/12/23 09:51:02
Maybe a better split would be if OnRasterTaskCompl
hendrikw
2014/12/23 18:10:33
I'm not sure what InitializeTile is, how it relate
| |
| 774 Tile::Id tile_id, | 870 Tile::Id tile_id, |
| 775 scoped_ptr<ScopedResource> resource, | 871 scoped_ptr<ScopedResource> resource, |
| 776 const RasterSource::SolidColorAnalysis& analysis, | 872 const RasterSource::SolidColorAnalysis& analysis, |
| 777 bool was_canceled) { | 873 bool was_canceled) { |
| 778 DCHECK(tiles_.find(tile_id) != tiles_.end()); | 874 DCHECK(tiles_.find(tile_id) != tiles_.end()); |
| 779 | 875 |
| 780 Tile* tile = tiles_[tile_id]; | 876 Tile* tile = tiles_[tile_id]; |
| 781 TileDrawInfo& draw_info = tile->draw_info(); | 877 TileDrawInfo& draw_info = tile->draw_info(); |
| 782 DCHECK(tile->raster_task_.get()); | 878 if (tile->raster_task_.get()) { |
| 783 orphan_raster_tasks_.push_back(tile->raster_task_); | 879 orphan_raster_tasks_.push_back(tile->raster_task_); |
| 784 tile->raster_task_ = NULL; | 880 tile->raster_task_ = nullptr; |
| 881 } | |
| 785 | 882 |
| 786 if (was_canceled) { | 883 if (was_canceled) { |
| 787 ++update_visible_tiles_stats_.canceled_count; | 884 ++update_visible_tiles_stats_.canceled_count; |
| 788 resource_pool_->ReleaseResource(resource.Pass()); | 885 resource_pool_->ReleaseResource(resource.Pass()); |
| 789 return; | 886 return; |
| 790 } | 887 } |
| 791 | 888 |
| 792 ++update_visible_tiles_stats_.completed_count; | 889 ++update_visible_tiles_stats_.completed_count; |
| 793 | 890 |
| 794 if (analysis.is_solid_color) { | 891 if (analysis.is_solid_color) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 846 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); | 943 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); |
| 847 | 944 |
| 848 for (const auto& layer : layers) { | 945 for (const auto& layer : layers) { |
| 849 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) | 946 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) |
| 850 return false; | 947 return false; |
| 851 } | 948 } |
| 852 | 949 |
| 853 return true; | 950 return true; |
| 854 } | 951 } |
| 855 | 952 |
| 953 void TileManager::NotifyReadyToActivate() { | |
| 954 TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate"); | |
| 955 if (did_notify_ready_to_activate_) | |
| 956 return; | |
| 957 client_->NotifyReadyToActivate(); | |
| 958 did_notify_ready_to_activate_ = true; | |
| 959 } | |
| 960 | |
| 961 void TileManager::NotifyReadyToDraw() { | |
| 962 TRACE_EVENT0("cc", "TileManager::NotifyReadyToDraw"); | |
| 963 if (did_notify_ready_to_draw_) | |
|
vmpstr
2014/12/23 09:51:02
We check this twice now on the software path..
hendrikw
2014/12/23 18:10:33
I only see one (REQUIRED_FOR_DRAW), where's the se
| |
| 964 return; | |
| 965 client_->NotifyReadyToDraw(); | |
| 966 did_notify_ready_to_draw_ = true; | |
| 967 } | |
| 968 | |
| 856 void TileManager::CheckIfReadyToActivate() { | 969 void TileManager::CheckIfReadyToActivate() { |
| 857 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); | 970 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); |
| 858 | 971 |
| 859 tile_task_runner_->CheckForCompletedTasks(); | 972 tile_task_runner_->CheckForCompletedTasks(); |
| 860 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 973 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 861 | 974 |
| 862 if (did_notify_ready_to_activate_) | 975 if (did_notify_ready_to_activate_) |
| 863 return; | 976 return; |
| 864 if (!IsReadyToActivate()) | 977 if (!IsReadyToActivate()) |
| 865 return; | 978 return; |
| 866 | 979 |
| 867 client_->NotifyReadyToActivate(); | 980 NotifyReadyToActivate(); |
| 868 did_notify_ready_to_activate_ = true; | |
| 869 } | 981 } |
| 870 | 982 |
| 871 void TileManager::CheckIfReadyToDraw() { | 983 void TileManager::CheckIfReadyToDraw() { |
| 872 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); | 984 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); |
| 873 | 985 |
| 874 tile_task_runner_->CheckForCompletedTasks(); | 986 tile_task_runner_->CheckForCompletedTasks(); |
| 875 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 987 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 876 | 988 |
| 877 if (did_notify_ready_to_draw_) | 989 if (did_notify_ready_to_draw_) |
| 878 return; | 990 return; |
| 879 if (!IsReadyToDraw()) | 991 if (!IsReadyToDraw()) |
| 880 return; | 992 return; |
| 881 | 993 |
| 882 client_->NotifyReadyToDraw(); | 994 NotifyReadyToDraw(); |
| 883 did_notify_ready_to_draw_ = true; | |
| 884 } | 995 } |
| 885 | 996 |
| 886 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { | 997 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { |
| 887 } | 998 } |
| 888 | 999 |
| 889 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) | 1000 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) |
| 890 : memory_bytes_(memory_bytes), resource_count_(resource_count) { | 1001 : memory_bytes_(memory_bytes), resource_count_(resource_count) { |
| 891 } | 1002 } |
| 892 | 1003 |
| 893 // static | 1004 // static |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 926 result -= other; | 1037 result -= other; |
| 927 return result; | 1038 return result; |
| 928 } | 1039 } |
| 929 | 1040 |
| 930 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 1041 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
| 931 return memory_bytes_ > limit.memory_bytes_ || | 1042 return memory_bytes_ > limit.memory_bytes_ || |
| 932 resource_count_ > limit.resource_count_; | 1043 resource_count_ > limit.resource_count_; |
| 933 } | 1044 } |
| 934 | 1045 |
| 935 } // namespace cc | 1046 } // namespace cc |
| OLD | NEW |