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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 state->SetInteger("completed_count", stats.completed_count); | 360 state->SetInteger("completed_count", stats.completed_count); |
361 state->SetInteger("canceled_count", stats.canceled_count); | 361 state->SetInteger("canceled_count", stats.canceled_count); |
362 return state.PassAs<base::Value>(); | 362 return state.PassAs<base::Value>(); |
363 } | 363 } |
364 | 364 |
365 // static | 365 // static |
366 scoped_ptr<TileManager> TileManager::Create( | 366 scoped_ptr<TileManager> TileManager::Create( |
367 TileManagerClient* client, | 367 TileManagerClient* client, |
368 ResourcePool* resource_pool, | 368 ResourcePool* resource_pool, |
369 Rasterizer* rasterizer, | 369 Rasterizer* rasterizer, |
370 Rasterizer* gpu_rasterizer, | |
371 bool use_rasterize_on_demand, | 370 bool use_rasterize_on_demand, |
372 RenderingStatsInstrumentation* rendering_stats_instrumentation) { | 371 RenderingStatsInstrumentation* rendering_stats_instrumentation) { |
373 return make_scoped_ptr(new TileManager(client, | 372 return make_scoped_ptr(new TileManager(client, |
374 resource_pool, | 373 resource_pool, |
375 rasterizer, | 374 rasterizer, |
376 gpu_rasterizer, | |
377 use_rasterize_on_demand, | 375 use_rasterize_on_demand, |
378 rendering_stats_instrumentation)); | 376 rendering_stats_instrumentation)); |
379 } | 377 } |
380 | 378 |
381 TileManager::TileManager( | 379 TileManager::TileManager( |
382 TileManagerClient* client, | 380 TileManagerClient* client, |
383 ResourcePool* resource_pool, | 381 ResourcePool* resource_pool, |
384 Rasterizer* rasterizer, | 382 Rasterizer* rasterizer, |
385 Rasterizer* gpu_rasterizer, | |
386 bool use_rasterize_on_demand, | 383 bool use_rasterize_on_demand, |
387 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 384 RenderingStatsInstrumentation* rendering_stats_instrumentation) |
388 : client_(client), | 385 : client_(client), |
389 resource_pool_(resource_pool), | 386 resource_pool_(resource_pool), |
| 387 rasterizer_(rasterizer), |
390 prioritized_tiles_dirty_(false), | 388 prioritized_tiles_dirty_(false), |
391 all_tiles_that_need_to_be_rasterized_have_memory_(true), | 389 all_tiles_that_need_to_be_rasterized_have_memory_(true), |
392 all_tiles_required_for_activation_have_memory_(true), | 390 all_tiles_required_for_activation_have_memory_(true), |
393 memory_required_bytes_(0), | 391 memory_required_bytes_(0), |
394 memory_nice_to_have_bytes_(0), | 392 memory_nice_to_have_bytes_(0), |
395 bytes_releasable_(0), | 393 bytes_releasable_(0), |
396 resources_releasable_(0), | 394 resources_releasable_(0), |
397 ever_exceeded_memory_budget_(false), | 395 ever_exceeded_memory_budget_(false), |
398 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 396 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
399 did_initialize_visible_tile_(false), | 397 did_initialize_visible_tile_(false), |
400 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 398 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
401 use_rasterize_on_demand_(use_rasterize_on_demand) { | 399 use_rasterize_on_demand_(use_rasterize_on_demand) { |
402 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = { | 400 rasterizer_->SetClient(this); |
403 rasterizer, // RASTERIZER_TYPE_DEFAULT | |
404 gpu_rasterizer, // RASTERIZER_TYPE_GPU | |
405 }; | |
406 rasterizer_delegate_ = | |
407 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers)); | |
408 } | 401 } |
409 | 402 |
410 TileManager::~TileManager() { | 403 TileManager::~TileManager() { |
411 // Reset global state and manage. This should cause | 404 // Reset global state and manage. This should cause |
412 // our memory usage to drop to zero. | 405 // our memory usage to drop to zero. |
413 global_state_ = GlobalStateThatImpactsTilePriority(); | 406 global_state_ = GlobalStateThatImpactsTilePriority(); |
414 | 407 |
415 CleanUpReleasedTiles(); | 408 CleanUpReleasedTiles(); |
416 DCHECK_EQ(0u, tiles_.size()); | 409 DCHECK_EQ(0u, tiles_.size()); |
417 | 410 |
418 RasterTaskQueue empty[NUM_RASTERIZER_TYPES]; | 411 RasterTaskQueue empty; |
419 rasterizer_delegate_->ScheduleTasks(empty); | 412 rasterizer_->ScheduleTasks(&empty); |
420 orphan_raster_tasks_.clear(); | 413 orphan_raster_tasks_.clear(); |
421 | 414 |
422 // This should finish all pending tasks and release any uninitialized | 415 // This should finish all pending tasks and release any uninitialized |
423 // resources. | 416 // resources. |
424 rasterizer_delegate_->Shutdown(); | 417 rasterizer_->Shutdown(); |
425 rasterizer_delegate_->CheckForCompletedTasks(); | 418 rasterizer_->CheckForCompletedTasks(); |
426 | 419 |
427 DCHECK_EQ(0u, bytes_releasable_); | 420 DCHECK_EQ(0u, bytes_releasable_); |
428 DCHECK_EQ(0u, resources_releasable_); | 421 DCHECK_EQ(0u, resources_releasable_); |
429 | 422 |
430 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin(); | 423 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin(); |
431 it != layers_.end(); | 424 it != layers_.end(); |
432 ++it) { | 425 ++it) { |
433 (*it)->DidUnregisterLayer(); | 426 (*it)->DidUnregisterLayer(); |
434 } | 427 } |
435 layers_.clear(); | 428 layers_.clear(); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 | 486 |
494 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() > | 487 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() > |
495 global_state_.soft_memory_limit_in_bytes; | 488 global_state_.soft_memory_limit_in_bytes; |
496 | 489 |
497 // When OOM, keep re-assigning memory until we reach a steady state | 490 // When OOM, keep re-assigning memory until we reach a steady state |
498 // where top-priority tiles are initialized. | 491 // where top-priority tiles are initialized. |
499 if (all_tiles_that_need_to_be_rasterized_have_memory_ && | 492 if (all_tiles_that_need_to_be_rasterized_have_memory_ && |
500 !memory_usage_above_limit) | 493 !memory_usage_above_limit) |
501 return; | 494 return; |
502 | 495 |
503 rasterizer_delegate_->CheckForCompletedTasks(); | 496 rasterizer_->CheckForCompletedTasks(); |
504 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 497 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
505 | 498 |
506 TileVector tiles_that_need_to_be_rasterized; | 499 TileVector tiles_that_need_to_be_rasterized; |
507 AssignGpuMemoryToTiles(&prioritized_tiles_, | 500 AssignGpuMemoryToTiles(&prioritized_tiles_, |
508 &tiles_that_need_to_be_rasterized); | 501 &tiles_that_need_to_be_rasterized); |
509 | 502 |
510 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 503 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
511 // steady memory state. Keep scheduling tasks until we reach this state. | 504 // steady memory state. Keep scheduling tasks until we reach this state. |
512 if (!tiles_that_need_to_be_rasterized.empty()) { | 505 if (!tiles_that_need_to_be_rasterized.empty()) { |
513 ScheduleTasks(tiles_that_need_to_be_rasterized); | 506 ScheduleTasks(tiles_that_need_to_be_rasterized); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 if (state != global_state_) { | 693 if (state != global_state_) { |
701 global_state_ = state; | 694 global_state_ = state; |
702 prioritized_tiles_dirty_ = true; | 695 prioritized_tiles_dirty_ = true; |
703 } | 696 } |
704 | 697 |
705 CleanUpLayers(); | 698 CleanUpLayers(); |
706 | 699 |
707 // We need to call CheckForCompletedTasks() once in-between each call | 700 // We need to call CheckForCompletedTasks() once in-between each call |
708 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 701 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
709 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 702 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
710 rasterizer_delegate_->CheckForCompletedTasks(); | 703 rasterizer_->CheckForCompletedTasks(); |
711 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 704 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
712 } | 705 } |
713 | 706 |
714 UpdatePrioritizedTileSetIfNeeded(); | 707 UpdatePrioritizedTileSetIfNeeded(); |
715 | 708 |
716 TileVector tiles_that_need_to_be_rasterized; | 709 TileVector tiles_that_need_to_be_rasterized; |
717 AssignGpuMemoryToTiles(&prioritized_tiles_, | 710 AssignGpuMemoryToTiles(&prioritized_tiles_, |
718 &tiles_that_need_to_be_rasterized); | 711 &tiles_that_need_to_be_rasterized); |
719 | 712 |
720 // Finally, schedule rasterizer tasks. | 713 // Finally, schedule rasterizer tasks. |
721 ScheduleTasks(tiles_that_need_to_be_rasterized); | 714 ScheduleTasks(tiles_that_need_to_be_rasterized); |
722 | 715 |
723 TRACE_EVENT_INSTANT1("cc", | 716 TRACE_EVENT_INSTANT1("cc", |
724 "DidManage", | 717 "DidManage", |
725 TRACE_EVENT_SCOPE_THREAD, | 718 TRACE_EVENT_SCOPE_THREAD, |
726 "state", | 719 "state", |
727 TracedValue::FromValue(BasicStateAsValue().release())); | 720 TracedValue::FromValue(BasicStateAsValue().release())); |
728 | 721 |
729 TRACE_COUNTER_ID1("cc", | 722 TRACE_COUNTER_ID1("cc", |
730 "unused_memory_bytes", | 723 "unused_memory_bytes", |
731 this, | 724 this, |
732 resource_pool_->total_memory_usage_bytes() - | 725 resource_pool_->total_memory_usage_bytes() - |
733 resource_pool_->acquired_memory_usage_bytes()); | 726 resource_pool_->acquired_memory_usage_bytes()); |
734 } | 727 } |
735 | 728 |
736 bool TileManager::UpdateVisibleTiles() { | 729 bool TileManager::UpdateVisibleTiles() { |
737 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); | 730 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); |
738 | 731 |
739 rasterizer_delegate_->CheckForCompletedTasks(); | 732 rasterizer_->CheckForCompletedTasks(); |
740 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 733 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
741 | 734 |
742 TRACE_EVENT_INSTANT1( | 735 TRACE_EVENT_INSTANT1( |
743 "cc", | 736 "cc", |
744 "DidUpdateVisibleTiles", | 737 "DidUpdateVisibleTiles", |
745 TRACE_EVENT_SCOPE_THREAD, | 738 TRACE_EVENT_SCOPE_THREAD, |
746 "stats", | 739 "stats", |
747 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( | 740 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( |
748 update_visible_tiles_stats_).release())); | 741 update_visible_tiles_stats_).release())); |
749 update_visible_tiles_stats_ = RasterTaskCompletionStats(); | 742 update_visible_tiles_stats_ = RasterTaskCompletionStats(); |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1006 | 999 |
1007 void TileManager::ScheduleTasks( | 1000 void TileManager::ScheduleTasks( |
1008 const TileVector& tiles_that_need_to_be_rasterized) { | 1001 const TileVector& tiles_that_need_to_be_rasterized) { |
1009 TRACE_EVENT1("cc", | 1002 TRACE_EVENT1("cc", |
1010 "TileManager::ScheduleTasks", | 1003 "TileManager::ScheduleTasks", |
1011 "count", | 1004 "count", |
1012 tiles_that_need_to_be_rasterized.size()); | 1005 tiles_that_need_to_be_rasterized.size()); |
1013 | 1006 |
1014 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 1007 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
1015 | 1008 |
1016 for (size_t i = 0; i < NUM_RASTERIZER_TYPES; ++i) | 1009 raster_queue_.Reset(); |
1017 raster_queue_[i].Reset(); | |
1018 | 1010 |
1019 // Build a new task queue containing all task currently needed. Tasks | 1011 // Build a new task queue containing all task currently needed. Tasks |
1020 // are added in order of priority, highest priority task first. | 1012 // are added in order of priority, highest priority task first. |
1021 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); | 1013 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
1022 it != tiles_that_need_to_be_rasterized.end(); | 1014 it != tiles_that_need_to_be_rasterized.end(); |
1023 ++it) { | 1015 ++it) { |
1024 Tile* tile = *it; | 1016 Tile* tile = *it; |
1025 ManagedTileState& mts = tile->managed_state(); | 1017 ManagedTileState& mts = tile->managed_state(); |
1026 ManagedTileState::TileVersion& tile_version = | 1018 ManagedTileState::TileVersion& tile_version = |
1027 mts.tile_versions[mts.raster_mode]; | 1019 mts.tile_versions[mts.raster_mode]; |
1028 | 1020 |
1029 DCHECK(tile_version.requires_resource()); | 1021 DCHECK(tile_version.requires_resource()); |
1030 DCHECK(!tile_version.resource_); | 1022 DCHECK(!tile_version.resource_); |
1031 | 1023 |
1032 if (!tile_version.raster_task_) | 1024 if (!tile_version.raster_task_) |
1033 tile_version.raster_task_ = CreateRasterTask(tile); | 1025 tile_version.raster_task_ = CreateRasterTask(tile); |
1034 | 1026 |
1035 size_t pool_type = tile->use_gpu_rasterization() ? RASTERIZER_TYPE_GPU | 1027 raster_queue_.items.push_back(RasterTaskQueue::Item( |
1036 : RASTERIZER_TYPE_DEFAULT; | |
1037 | |
1038 raster_queue_[pool_type].items.push_back(RasterTaskQueue::Item( | |
1039 tile_version.raster_task_.get(), tile->required_for_activation())); | 1028 tile_version.raster_task_.get(), tile->required_for_activation())); |
1040 raster_queue_[pool_type].required_for_activation_count += | 1029 raster_queue_.required_for_activation_count += |
1041 tile->required_for_activation(); | 1030 tile->required_for_activation(); |
1042 } | 1031 } |
1043 | 1032 |
1044 // We must reduce the amount of unused resoruces before calling | 1033 // We must reduce the amount of unused resoruces before calling |
1045 // ScheduleTasks to prevent usage from rising above limits. | 1034 // ScheduleTasks to prevent usage from rising above limits. |
1046 resource_pool_->ReduceResourceUsage(); | 1035 resource_pool_->ReduceResourceUsage(); |
1047 | 1036 |
1048 // Schedule running of |raster_tasks_|. This replaces any previously | 1037 // Schedule running of |raster_tasks_|. This replaces any previously |
1049 // scheduled tasks and effectively cancels all tasks not present | 1038 // scheduled tasks and effectively cancels all tasks not present |
1050 // in |raster_tasks_|. | 1039 // in |raster_tasks_|. |
1051 rasterizer_delegate_->ScheduleTasks(raster_queue_); | 1040 rasterizer_->ScheduleTasks(&raster_queue_); |
1052 | 1041 |
1053 // It's now safe to clean up orphan tasks as raster worker pool is not | 1042 // It's now safe to clean up orphan tasks as raster worker pool is not |
1054 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has | 1043 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has |
1055 // been called. | 1044 // been called. |
1056 orphan_raster_tasks_.clear(); | 1045 orphan_raster_tasks_.clear(); |
1057 | 1046 |
1058 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 1047 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
1059 } | 1048 } |
1060 | 1049 |
1061 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( | 1050 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( |
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1626 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY; | 1615 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY; |
1627 | 1616 |
1628 if (b_priority.resolution != a_priority.resolution) { | 1617 if (b_priority.resolution != a_priority.resolution) { |
1629 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || | 1618 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || |
1630 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || | 1619 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || |
1631 (a_priority.resolution == NON_IDEAL_RESOLUTION); | 1620 (a_priority.resolution == NON_IDEAL_RESOLUTION); |
1632 } | 1621 } |
1633 return a_priority.IsHigherPriorityThan(b_priority); | 1622 return a_priority.IsHigherPriorityThan(b_priority); |
1634 } | 1623 } |
1635 | 1624 |
1636 void TileManager::SetRasterizersForTesting(Rasterizer* rasterizer, | 1625 void TileManager::SetRasterizerForTesting(Rasterizer* rasterizer) { |
1637 Rasterizer* gpu_rasterizer) { | 1626 rasterizer_ = rasterizer; |
1638 Rasterizer* rasterizers[2] = {rasterizer, gpu_rasterizer}; | 1627 rasterizer_->SetClient(this); |
1639 rasterizer_delegate_ = | |
1640 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers)); | |
1641 } | 1628 } |
1642 | 1629 |
1643 } // namespace cc | 1630 } // namespace cc |
OLD | NEW |