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/tiles/tile_manager.h" | 5 #include "cc/tiles/tile_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 636 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 636 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
| 637 bool had_enough_memory_to_schedule_tiles_needed_now = true; | 637 bool had_enough_memory_to_schedule_tiles_needed_now = true; |
| 638 | 638 |
| 639 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, | 639 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, |
| 640 global_state_.num_resources_limit); | 640 global_state_.num_resources_limit); |
| 641 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, | 641 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, |
| 642 global_state_.num_resources_limit); | 642 global_state_.num_resources_limit); |
| 643 MemoryUsage memory_usage(resource_pool_->memory_usage_bytes(), | 643 MemoryUsage memory_usage(resource_pool_->memory_usage_bytes(), |
| 644 resource_pool_->resource_count()); | 644 resource_pool_->resource_count()); |
| 645 | 645 |
| 646 gfx::ColorSpace raster_color_space = client_->GetRasterColorSpace(); | 646 gfx::ColorSpace client_raster_color_space = client_->GetRasterColorSpace(); |
| 647 | 647 |
| 648 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( | 648 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( |
| 649 client_->BuildRasterQueue(global_state_.tree_priority, | 649 client_->BuildRasterQueue(global_state_.tree_priority, |
| 650 RasterTilePriorityQueue::Type::ALL)); | 650 RasterTilePriorityQueue::Type::ALL)); |
| 651 std::unique_ptr<EvictionTilePriorityQueue> eviction_priority_queue; | 651 std::unique_ptr<EvictionTilePriorityQueue> eviction_priority_queue; |
| 652 PrioritizedWorkToSchedule work_to_schedule; | 652 PrioritizedWorkToSchedule work_to_schedule; |
| 653 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { | 653 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { |
| 654 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top(); | 654 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top(); |
| 655 Tile* tile = prioritized_tile.tile(); | 655 Tile* tile = prioritized_tile.tile(); |
| 656 TilePriority priority = prioritized_tile.priority(); | 656 TilePriority priority = prioritized_tile.priority(); |
| 657 | 657 |
| 658 gfx::ColorSpace raster_color_space = GetTileColorSpace(prioritized_tile); | |
| 659 | |
| 658 if (TilePriorityViolatesMemoryPolicy(priority)) { | 660 if (TilePriorityViolatesMemoryPolicy(priority)) { |
| 659 TRACE_EVENT_INSTANT0( | 661 TRACE_EVENT_INSTANT0( |
| 660 "cc", "TileManager::AssignGpuMemory tile violates memory policy", | 662 "cc", "TileManager::AssignGpuMemory tile violates memory policy", |
| 661 TRACE_EVENT_SCOPE_THREAD); | 663 TRACE_EVENT_SCOPE_THREAD); |
| 662 break; | 664 break; |
| 663 } | 665 } |
| 664 | 666 |
| 665 bool tile_is_needed_now = priority.priority_bin == TilePriority::NOW; | 667 bool tile_is_needed_now = priority.priority_bin == TilePriority::NOW; |
| 666 if (!tile->is_solid_color_analysis_performed() && | 668 if (!tile->is_solid_color_analysis_performed() && |
| 667 tile->use_picture_analysis() && kUseColorEstimator) { | 669 tile->use_picture_analysis() && kUseColorEstimator) { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 758 if (tile->raster_task_scheduled_with_checker_images() && | 760 if (tile->raster_task_scheduled_with_checker_images() && |
| 759 prioritized_tile.should_decode_checkered_images_for_tile()) { | 761 prioritized_tile.should_decode_checkered_images_for_tile()) { |
| 760 AddCheckeredImagesToDecodeQueue( | 762 AddCheckeredImagesToDecodeQueue( |
| 761 prioritized_tile, raster_color_space, | 763 prioritized_tile, raster_color_space, |
| 762 &work_to_schedule.checker_image_decode_queue); | 764 &work_to_schedule.checker_image_decode_queue); |
| 763 } | 765 } |
| 764 } else { | 766 } else { |
| 765 // Creating the raster task here will acquire resources, but | 767 // Creating the raster task here will acquire resources, but |
| 766 // this resource usage has already been accounted for above. | 768 // this resource usage has already been accounted for above. |
| 767 tile->raster_task_ = | 769 tile->raster_task_ = |
| 768 CreateRasterTask(prioritized_tile, client_->GetRasterColorSpace(), | 770 CreateRasterTask(prioritized_tile, raster_color_space, |
| 769 &work_to_schedule.checker_image_decode_queue); | 771 &work_to_schedule.checker_image_decode_queue); |
| 770 } | 772 } |
| 771 | 773 |
| 772 memory_usage += memory_required_by_tile_to_be_scheduled; | 774 memory_usage += memory_required_by_tile_to_be_scheduled; |
| 773 work_to_schedule.tiles_to_raster.push_back(prioritized_tile); | 775 work_to_schedule.tiles_to_raster.push_back(prioritized_tile); |
| 774 } | 776 } |
| 775 | 777 |
| 776 // Note that we should try and further reduce memory in case the above loop | 778 // Note that we should try and further reduce memory in case the above loop |
| 777 // didn't reduce memory. This ensures that we always release as many resources | 779 // didn't reduce memory. This ensures that we always release as many resources |
| 778 // as possible to stay within the memory limit. | 780 // as possible to stay within the memory limit. |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 793 if (prioritized_tile.priority().priority_bin > TilePriority::NOW) | 795 if (prioritized_tile.priority().priority_bin > TilePriority::NOW) |
| 794 break; | 796 break; |
| 795 | 797 |
| 796 if (!prioritized_tile.should_decode_checkered_images_for_tile()) | 798 if (!prioritized_tile.should_decode_checkered_images_for_tile()) |
| 797 continue; | 799 continue; |
| 798 | 800 |
| 799 Tile* tile = prioritized_tile.tile(); | 801 Tile* tile = prioritized_tile.tile(); |
| 800 if (tile->draw_info().is_checker_imaged() || | 802 if (tile->draw_info().is_checker_imaged() || |
| 801 tile->raster_task_scheduled_with_checker_images()) { | 803 tile->raster_task_scheduled_with_checker_images()) { |
| 802 AddCheckeredImagesToDecodeQueue( | 804 AddCheckeredImagesToDecodeQueue( |
| 803 prioritized_tile, raster_color_space, | 805 prioritized_tile, GetTileColorSpace(prioritized_tile), |
| 804 &work_to_schedule.checker_image_decode_queue); | 806 &work_to_schedule.checker_image_decode_queue); |
| 805 } | 807 } |
| 806 } | 808 } |
| 807 } | 809 } |
| 808 | 810 |
| 809 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", | 811 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", |
| 810 !had_enough_memory_to_schedule_tiles_needed_now); | 812 !had_enough_memory_to_schedule_tiles_needed_now); |
| 811 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; | 813 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; |
| 812 | 814 |
| 813 memory_stats_from_last_assign_.total_budget_in_bytes = | 815 memory_stats_from_last_assign_.total_budget_in_bytes = |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 907 | 909 |
| 908 // Track the number of dependents for each *_done task. | 910 // Track the number of dependents for each *_done task. |
| 909 size_t required_for_activate_count = 0; | 911 size_t required_for_activate_count = 0; |
| 910 size_t required_for_draw_count = 0; | 912 size_t required_for_draw_count = 0; |
| 911 size_t all_count = 0; | 913 size_t all_count = 0; |
| 912 | 914 |
| 913 size_t priority = kTileTaskPriorityBase; | 915 size_t priority = kTileTaskPriorityBase; |
| 914 | 916 |
| 915 graph_.Reset(); | 917 graph_.Reset(); |
| 916 | 918 |
| 917 gfx::ColorSpace raster_color_space = client_->GetRasterColorSpace(); | |
| 918 | |
| 919 scoped_refptr<TileTask> required_for_activation_done_task = | 919 scoped_refptr<TileTask> required_for_activation_done_task = |
| 920 CreateTaskSetFinishedTask( | 920 CreateTaskSetFinishedTask( |
| 921 &TileManager::DidFinishRunningTileTasksRequiredForActivation); | 921 &TileManager::DidFinishRunningTileTasksRequiredForActivation); |
| 922 scoped_refptr<TileTask> required_for_draw_done_task = | 922 scoped_refptr<TileTask> required_for_draw_done_task = |
| 923 CreateTaskSetFinishedTask( | 923 CreateTaskSetFinishedTask( |
| 924 &TileManager::DidFinishRunningTileTasksRequiredForDraw); | 924 &TileManager::DidFinishRunningTileTasksRequiredForDraw); |
| 925 scoped_refptr<TileTask> all_done_task = | 925 scoped_refptr<TileTask> all_done_task = |
| 926 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); | 926 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); |
| 927 | 927 |
| 928 // Build a new task queue containing all task currently needed. Tasks | 928 // Build a new task queue containing all task currently needed. Tasks |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 965 work_to_schedule.tiles_to_process_for_images; | 965 work_to_schedule.tiles_to_process_for_images; |
| 966 std::vector<DrawImage> new_locked_images; | 966 std::vector<DrawImage> new_locked_images; |
| 967 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) { | 967 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) { |
| 968 Tile* tile = prioritized_tile.tile(); | 968 Tile* tile = prioritized_tile.tile(); |
| 969 | 969 |
| 970 // TODO(khushalsagar): Send these images to the ImageDecodeService, through | 970 // TODO(khushalsagar): Send these images to the ImageDecodeService, through |
| 971 // the CheckerImageTracker as well. See crbug.com/691087. | 971 // the CheckerImageTracker as well. See crbug.com/691087. |
| 972 std::vector<DrawImage> images; | 972 std::vector<DrawImage> images; |
| 973 prioritized_tile.raster_source()->GetDiscardableImagesInRect( | 973 prioritized_tile.raster_source()->GetDiscardableImagesInRect( |
| 974 tile->enclosing_layer_rect(), tile->raster_transform().scale(), | 974 tile->enclosing_layer_rect(), tile->raster_transform().scale(), |
| 975 raster_color_space, &images); | 975 GetTileColorSpace(prioritized_tile), &images); |
| 976 new_locked_images.insert(new_locked_images.end(), images.begin(), | 976 new_locked_images.insert(new_locked_images.end(), images.begin(), |
| 977 images.end()); | 977 images.end()); |
| 978 } | 978 } |
| 979 | 979 |
| 980 // TODO(vmpstr): SOON is misleading here, but these images can come from | 980 // TODO(vmpstr): SOON is misleading here, but these images can come from |
| 981 // several diffent tiles. Rethink what we actually want to trace here. Note | 981 // several diffent tiles. Rethink what we actually want to trace here. Note |
| 982 // that I'm using SOON, since it can't be NOW (these are prepaint). | 982 // that I'm using SOON, since it can't be NOW (these are prepaint). |
| 983 ImageDecodeCache::TracingInfo tracing_info(prepare_tiles_count_, | 983 ImageDecodeCache::TracingInfo tracing_info(prepare_tiles_count_, |
| 984 TilePriority::SOON); | 984 TilePriority::SOON); |
| 985 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks = | 985 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks = |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1493 | 1493 |
| 1494 // Utility function that can be used to create a "Task set finished" task that | 1494 // Utility function that can be used to create a "Task set finished" task that |
| 1495 // posts |callback| to |task_runner| when run. | 1495 // posts |callback| to |task_runner| when run. |
| 1496 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( | 1496 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| 1497 void (TileManager::*callback)()) { | 1497 void (TileManager::*callback)()) { |
| 1498 return make_scoped_refptr(new TaskSetFinishedTaskImpl( | 1498 return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| 1499 task_runner_, | 1499 task_runner_, |
| 1500 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); | 1500 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 1501 } | 1501 } |
| 1502 | 1502 |
| 1503 gfx::ColorSpace TileManager::GetTileColorSpace( | |
| 1504 const PrioritizedTile& prioritized_tile) const { | |
| 1505 return prioritized_tile.raster_source()->HasNonSRGBContent() | |
| 1506 ? client_raster_color_space | |
| 1507 : gfx::ColorSpace::CreateSRGB(); | |
|
vmpstr
2017/05/09 22:58:27
Is this a cheap call? Assuming that everything is
| |
| 1508 } | |
| 1509 | |
| 1503 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 1510 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
| 1504 TileManager::ActivationStateAsValue() { | 1511 TileManager::ActivationStateAsValue() { |
| 1505 auto state = base::MakeUnique<base::trace_event::TracedValue>(); | 1512 auto state = base::MakeUnique<base::trace_event::TracedValue>(); |
| 1506 ActivationStateAsValueInto(state.get()); | 1513 ActivationStateAsValueInto(state.get()); |
| 1507 return std::move(state); | 1514 return std::move(state); |
| 1508 } | 1515 } |
| 1509 | 1516 |
| 1510 void TileManager::ActivationStateAsValueInto( | 1517 void TileManager::ActivationStateAsValueInto( |
| 1511 base::trace_event::TracedValue* state) { | 1518 base::trace_event::TracedValue* state) { |
| 1512 state->SetString("tree_priority", | 1519 state->SetString("tree_priority", |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1641 all_tile_tasks_completed = false; | 1648 all_tile_tasks_completed = false; |
| 1642 did_notify_all_tile_tasks_completed = false; | 1649 did_notify_all_tile_tasks_completed = false; |
| 1643 } | 1650 } |
| 1644 | 1651 |
| 1645 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; | 1652 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; |
| 1646 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( | 1653 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( |
| 1647 PrioritizedWorkToSchedule&& other) = default; | 1654 PrioritizedWorkToSchedule&& other) = default; |
| 1648 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; | 1655 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; |
| 1649 | 1656 |
| 1650 } // namespace cc | 1657 } // namespace cc |
| OLD | NEW |