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(); |
| 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_, |
| 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( |
| 476 tiles_that_need_to_be_rasterized, resource_pool_, |
| 477 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this))); |
413 | 478 |
414 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", | 479 // Use on-demand raster for any tiles that have not been been assigned |
| 480 // memory. This ensures that we draw even when OOM. |
| 481 while (!raster_priority_queue_.IsEmpty()) { |
| 482 Tile* tile = raster_priority_queue_.Top(); |
| 483 TileDrawInfo& draw_info = tile->draw_info(); |
| 484 |
| 485 if (tile->required_for_draw() && !draw_info.IsReadyToDraw()) { |
| 486 draw_info.set_rasterize_on_demand(); |
| 487 client_->NotifyTileStateChanged(tile); |
| 488 } |
| 489 raster_priority_queue_.Pop(); |
| 490 } |
| 491 raster_priority_queue_.Reset(); |
| 492 |
| 493 if (IsReadyToDraw()) |
| 494 client_->NotifyReadyToDraw(); |
| 495 |
| 496 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state", |
415 BasicStateAsValue()); | 497 BasicStateAsValue()); |
416 | 498 |
417 TRACE_COUNTER_ID1("cc", | 499 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
418 "unused_memory_bytes", | |
419 this, | |
420 resource_pool_->total_memory_usage_bytes() - | 500 resource_pool_->total_memory_usage_bytes() - |
421 resource_pool_->acquired_memory_usage_bytes()); | 501 resource_pool_->acquired_memory_usage_bytes()); |
422 } | 502 } |
423 | 503 |
424 void TileManager::UpdateVisibleTiles() { | 504 void TileManager::UpdateVisibleTiles( |
| 505 const GlobalStateThatImpactsTilePriority& state) { |
425 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); | 506 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); |
426 | 507 |
| 508 DCHECK(rasterizer_); |
| 509 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode(); |
| 510 |
| 511 if (prepare_tiles_mode != PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES) |
| 512 SynchronouslyRasterizeTiles(state); |
| 513 |
427 tile_task_runner_->CheckForCompletedTasks(); | 514 tile_task_runner_->CheckForCompletedTasks(); |
428 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 515 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
429 | 516 |
430 TRACE_EVENT_INSTANT1( | 517 TRACE_EVENT_INSTANT1( |
431 "cc", | 518 "cc", |
432 "DidUpdateVisibleTiles", | 519 "DidUpdateVisibleTiles", |
433 TRACE_EVENT_SCOPE_THREAD, | 520 TRACE_EVENT_SCOPE_THREAD, |
434 "stats", | 521 "stats", |
435 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); | 522 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); |
436 update_visible_tiles_stats_ = RasterTaskCompletionStats(); | 523 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; | 600 return priority.priority_bin > TilePriority::SOON; |
514 case ALLOW_ANYTHING: | 601 case ALLOW_ANYTHING: |
515 return priority.distance_to_visible == | 602 return priority.distance_to_visible == |
516 std::numeric_limits<float>::infinity(); | 603 std::numeric_limits<float>::infinity(); |
517 } | 604 } |
518 NOTREACHED(); | 605 NOTREACHED(); |
519 return true; | 606 return true; |
520 } | 607 } |
521 | 608 |
522 void TileManager::AssignGpuMemoryToTiles( | 609 void TileManager::AssignGpuMemoryToTiles( |
523 TileVector* tiles_that_need_to_be_rasterized) { | 610 TileVector* tiles_that_need_to_be_rasterized, |
| 611 size_t scheduled_raster_task_limit, |
| 612 bool required_for_draw_only) { |
524 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); | 613 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); |
525 | 614 |
526 // Maintain the list of released resources that can potentially be re-used | 615 // Maintain the list of released resources that can potentially be re-used |
527 // or deleted. | 616 // or deleted. |
528 // If this operation becomes expensive too, only do this after some | 617 // 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 | 618 // resource(s) was returned. Note that in that case, one also need to |
530 // invalidate when releasing some resource from the pool. | 619 // invalidate when releasing some resource from the pool. |
531 resource_pool_->CheckBusyResources(false); | 620 resource_pool_->CheckBusyResources(false); |
532 | 621 |
533 // Now give memory out to the tiles until we're out, and build | 622 // Now give memory out to the tiles until we're out, and build |
534 // the needs-to-be-rasterized queue. | 623 // the needs-to-be-rasterized queue. |
535 unsigned schedule_priority = 1u; | 624 unsigned schedule_priority = 1u; |
536 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 625 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
537 bool had_enough_memory_to_schedule_tiles_needed_now = true; | 626 bool had_enough_memory_to_schedule_tiles_needed_now = true; |
538 | 627 |
539 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, | 628 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, |
540 global_state_.num_resources_limit); | 629 global_state_.num_resources_limit); |
541 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, | 630 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, |
542 global_state_.num_resources_limit); | 631 global_state_.num_resources_limit); |
543 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), | 632 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
544 resource_pool_->acquired_resource_count()); | 633 resource_pool_->acquired_resource_count()); |
545 | 634 |
546 eviction_priority_queue_is_up_to_date_ = false; | 635 eviction_priority_queue_is_up_to_date_ = false; |
547 client_->BuildRasterQueue(&raster_priority_queue_, | |
548 global_state_.tree_priority); | |
549 | 636 |
550 while (!raster_priority_queue_.IsEmpty()) { | 637 while (!raster_priority_queue_.IsEmpty()) { |
551 Tile* tile = raster_priority_queue_.Top(); | 638 Tile* tile = raster_priority_queue_.Top(); |
| 639 |
| 640 if (required_for_draw_only) { |
| 641 if (!tile->required_for_draw()) { |
| 642 raster_priority_queue_.Pop(); |
| 643 continue; |
| 644 } |
| 645 } |
| 646 |
552 TilePriority priority = tile->combined_priority(); | 647 TilePriority priority = tile->combined_priority(); |
553 | 648 |
554 if (TilePriorityViolatesMemoryPolicy(priority)) { | 649 if (TilePriorityViolatesMemoryPolicy(priority)) { |
555 TRACE_EVENT_INSTANT0( | 650 TRACE_EVENT_INSTANT0( |
556 "cc", | 651 "cc", "TileManager::AssignGpuMemory tile violates memory policy", |
557 "TileManager::AssignGpuMemory tile violates memory policy", | |
558 TRACE_EVENT_SCOPE_THREAD); | 652 TRACE_EVENT_SCOPE_THREAD); |
559 break; | 653 break; |
560 } | 654 } |
561 | 655 |
562 // We won't be able to schedule this tile, so break out early. | 656 // We won't be able to schedule this tile, so break out early. |
563 if (tiles_that_need_to_be_rasterized->size() >= | 657 if (tiles_that_need_to_be_rasterized->size() >= |
564 scheduled_raster_task_limit_) { | 658 scheduled_raster_task_limit) { |
565 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 659 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
566 break; | 660 break; |
567 } | 661 } |
568 | 662 |
569 TileDrawInfo& draw_info = tile->draw_info(); | 663 TileDrawInfo& draw_info = tile->draw_info(); |
570 tile->scheduled_priority_ = schedule_priority++; | 664 tile->scheduled_priority_ = schedule_priority++; |
571 | 665 |
572 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || | 666 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || |
573 !draw_info.IsReadyToDraw()); | 667 !draw_info.IsReadyToDraw()); |
574 | 668 |
(...skipping 10 matching lines...) Expand all Loading... |
585 | 679 |
586 // 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 |
587 // 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 |
588 // soft_memory_limit. | 682 // soft_memory_limit. |
589 MemoryUsage& tile_memory_limit = | 683 MemoryUsage& tile_memory_limit = |
590 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; | 684 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; |
591 | 685 |
592 bool memory_usage_is_within_limit = | 686 bool memory_usage_is_within_limit = |
593 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( | 687 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( |
594 tile_memory_limit - memory_required_by_tile_to_be_scheduled, | 688 tile_memory_limit - memory_required_by_tile_to_be_scheduled, |
595 priority, | 689 priority, &memory_usage); |
596 &memory_usage); | |
597 | 690 |
598 // 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 |
599 // done. | 692 // done. |
600 if (!memory_usage_is_within_limit) { | 693 if (!memory_usage_is_within_limit) { |
601 if (tile_is_needed_now) | 694 if (tile_is_needed_now) |
602 had_enough_memory_to_schedule_tiles_needed_now = false; | 695 had_enough_memory_to_schedule_tiles_needed_now = false; |
603 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 696 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
604 break; | 697 break; |
605 } | 698 } |
606 | 699 |
(...skipping 10 matching lines...) Expand all Loading... |
617 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", | 710 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", |
618 !had_enough_memory_to_schedule_tiles_needed_now); | 711 !had_enough_memory_to_schedule_tiles_needed_now); |
619 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; |
620 | 713 |
621 memory_stats_from_last_assign_.total_budget_in_bytes = | 714 memory_stats_from_last_assign_.total_budget_in_bytes = |
622 global_state_.hard_memory_limit_in_bytes; | 715 global_state_.hard_memory_limit_in_bytes; |
623 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(); |
624 memory_stats_from_last_assign_.had_enough_memory = | 717 memory_stats_from_last_assign_.had_enough_memory = |
625 had_enough_memory_to_schedule_tiles_needed_now; | 718 had_enough_memory_to_schedule_tiles_needed_now; |
626 | 719 |
627 raster_priority_queue_.Reset(); | 720 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", | 721 "all_tiles_that_need_to_be_rasterized_are_scheduled", |
632 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 722 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
633 "had_enough_memory_to_schedule_tiles_needed_now", | 723 "had_enough_memory_to_schedule_tiles_needed_now", |
634 had_enough_memory_to_schedule_tiles_needed_now); | 724 had_enough_memory_to_schedule_tiles_needed_now); |
635 } | 725 } |
636 | 726 |
637 void TileManager::FreeResourcesForTile(Tile* tile) { | 727 void TileManager::FreeResourcesForTile(Tile* tile) { |
638 TileDrawInfo& draw_info = tile->draw_info(); | 728 TileDrawInfo& draw_info = tile->draw_info(); |
639 if (draw_info.resource_) | 729 if (draw_info.resource_) |
640 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); | 730 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 | 862 |
773 void TileManager::OnRasterTaskCompleted( | 863 void TileManager::OnRasterTaskCompleted( |
774 Tile::Id tile_id, | 864 Tile::Id tile_id, |
775 scoped_ptr<ScopedResource> resource, | 865 scoped_ptr<ScopedResource> resource, |
776 const RasterSource::SolidColorAnalysis& analysis, | 866 const RasterSource::SolidColorAnalysis& analysis, |
777 bool was_canceled) { | 867 bool was_canceled) { |
778 DCHECK(tiles_.find(tile_id) != tiles_.end()); | 868 DCHECK(tiles_.find(tile_id) != tiles_.end()); |
779 | 869 |
780 Tile* tile = tiles_[tile_id]; | 870 Tile* tile = tiles_[tile_id]; |
781 TileDrawInfo& draw_info = tile->draw_info(); | 871 TileDrawInfo& draw_info = tile->draw_info(); |
782 DCHECK(tile->raster_task_.get()); | 872 if (tile->raster_task_.get()) { |
783 orphan_raster_tasks_.push_back(tile->raster_task_); | 873 orphan_raster_tasks_.push_back(tile->raster_task_); |
784 tile->raster_task_ = NULL; | 874 tile->raster_task_ = nullptr; |
| 875 } |
785 | 876 |
786 if (was_canceled) { | 877 if (was_canceled) { |
787 ++update_visible_tiles_stats_.canceled_count; | 878 ++update_visible_tiles_stats_.canceled_count; |
788 resource_pool_->ReleaseResource(resource.Pass()); | 879 resource_pool_->ReleaseResource(resource.Pass()); |
789 return; | 880 return; |
790 } | 881 } |
791 | 882 |
792 ++update_visible_tiles_stats_.completed_count; | 883 ++update_visible_tiles_stats_.completed_count; |
793 | 884 |
794 if (analysis.is_solid_color) { | 885 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(); | 937 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); |
847 | 938 |
848 for (const auto& layer : layers) { | 939 for (const auto& layer : layers) { |
849 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) | 940 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) |
850 return false; | 941 return false; |
851 } | 942 } |
852 | 943 |
853 return true; | 944 return true; |
854 } | 945 } |
855 | 946 |
| 947 void TileManager::NotifyReadyToActivate() { |
| 948 TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate"); |
| 949 if (did_notify_ready_to_activate_) |
| 950 return; |
| 951 client_->NotifyReadyToActivate(); |
| 952 did_notify_ready_to_activate_ = true; |
| 953 } |
| 954 |
| 955 void TileManager::NotifyReadyToDraw() { |
| 956 TRACE_EVENT0("cc", "TileManager::NotifyReadyToDraw"); |
| 957 if (did_notify_ready_to_draw_) |
| 958 return; |
| 959 client_->NotifyReadyToDraw(); |
| 960 did_notify_ready_to_draw_ = true; |
| 961 } |
| 962 |
856 void TileManager::CheckIfReadyToActivate() { | 963 void TileManager::CheckIfReadyToActivate() { |
857 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); | 964 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); |
858 | 965 |
859 tile_task_runner_->CheckForCompletedTasks(); | 966 tile_task_runner_->CheckForCompletedTasks(); |
860 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 967 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
861 | 968 |
862 if (did_notify_ready_to_activate_) | 969 if (did_notify_ready_to_activate_) |
863 return; | 970 return; |
864 if (!IsReadyToActivate()) | 971 if (!IsReadyToActivate()) |
865 return; | 972 return; |
866 | 973 |
867 client_->NotifyReadyToActivate(); | 974 NotifyReadyToActivate(); |
868 did_notify_ready_to_activate_ = true; | |
869 } | 975 } |
870 | 976 |
871 void TileManager::CheckIfReadyToDraw() { | 977 void TileManager::CheckIfReadyToDraw() { |
872 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); | 978 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); |
873 | 979 |
874 tile_task_runner_->CheckForCompletedTasks(); | 980 tile_task_runner_->CheckForCompletedTasks(); |
875 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 981 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
876 | 982 |
877 if (did_notify_ready_to_draw_) | 983 if (did_notify_ready_to_draw_) |
878 return; | 984 return; |
879 if (!IsReadyToDraw()) | 985 if (!IsReadyToDraw()) |
880 return; | 986 return; |
881 | 987 |
882 client_->NotifyReadyToDraw(); | 988 NotifyReadyToDraw(); |
883 did_notify_ready_to_draw_ = true; | |
884 } | 989 } |
885 | 990 |
886 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { | 991 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { |
887 } | 992 } |
888 | 993 |
889 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) | 994 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) |
890 : memory_bytes_(memory_bytes), resource_count_(resource_count) { | 995 : memory_bytes_(memory_bytes), resource_count_(resource_count) { |
891 } | 996 } |
892 | 997 |
893 // static | 998 // static |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 result -= other; | 1031 result -= other; |
927 return result; | 1032 return result; |
928 } | 1033 } |
929 | 1034 |
930 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 1035 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
931 return memory_bytes_ > limit.memory_bytes_ || | 1036 return memory_bytes_ > limit.memory_bytes_ || |
932 resource_count_ > limit.resource_count_; | 1037 resource_count_ > limit.resource_count_; |
933 } | 1038 } |
934 | 1039 |
935 } // namespace cc | 1040 } // namespace cc |
OLD | NEW |