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 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 162 state->SetInteger("completed_count", stats.completed_count); | 162 state->SetInteger("completed_count", stats.completed_count); |
| 163 state->SetInteger("canceled_count", stats.canceled_count); | 163 state->SetInteger("canceled_count", stats.canceled_count); |
| 164 return state.PassAs<base::Value>(); | 164 return state.PassAs<base::Value>(); |
| 165 } | 165 } |
| 166 | 166 |
| 167 // static | 167 // static |
| 168 scoped_ptr<TileManager> TileManager::Create( | 168 scoped_ptr<TileManager> TileManager::Create( |
| 169 TileManagerClient* client, | 169 TileManagerClient* client, |
| 170 ResourceProvider* resource_provider, | 170 ResourceProvider* resource_provider, |
| 171 ContextProvider* context_provider, | |
| 171 size_t num_raster_threads, | 172 size_t num_raster_threads, |
| 172 RenderingStatsInstrumentation* rendering_stats_instrumentation, | 173 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
| 174 bool use_ganesh, | |
| 173 bool use_map_image, | 175 bool use_map_image, |
| 174 size_t max_transfer_buffer_usage_bytes, | 176 size_t max_transfer_buffer_usage_bytes, |
| 175 size_t max_raster_usage_bytes) { | 177 size_t max_raster_usage_bytes) { |
| 176 return make_scoped_ptr( | 178 return make_scoped_ptr( |
| 177 new TileManager(client, | 179 new TileManager(client, |
| 178 resource_provider, | 180 resource_provider, |
| 179 use_map_image ? | 181 use_map_image ? |
| 180 ImageRasterWorkerPool::Create( | 182 ImageRasterWorkerPool::Create( |
| 181 resource_provider, num_raster_threads) : | 183 resource_provider, num_raster_threads) : |
| 182 PixelBufferRasterWorkerPool::Create( | 184 PixelBufferRasterWorkerPool::Create( |
| 183 resource_provider, | 185 resource_provider, |
| 184 num_raster_threads, | 186 num_raster_threads, |
| 185 max_transfer_buffer_usage_bytes), | 187 max_transfer_buffer_usage_bytes), |
| 188 use_ganesh ? | |
| 189 GaneshRasterizer::Create( | |
|
enne (OOO)
2013/11/25 23:14:10
It seems like extra complication to have this opti
| |
| 190 context_provider, resource_provider) : | |
| 191 scoped_ptr<GaneshRasterizer>(), | |
| 186 num_raster_threads, | 192 num_raster_threads, |
| 187 max_raster_usage_bytes, | 193 max_raster_usage_bytes, |
| 188 rendering_stats_instrumentation)); | 194 rendering_stats_instrumentation)); |
| 189 } | 195 } |
| 190 | 196 |
| 191 TileManager::TileManager( | 197 TileManager::TileManager( |
| 192 TileManagerClient* client, | 198 TileManagerClient* client, |
| 193 ResourceProvider* resource_provider, | 199 ResourceProvider* resource_provider, |
| 194 scoped_ptr<RasterWorkerPool> raster_worker_pool, | 200 scoped_ptr<RasterWorkerPool> raster_worker_pool, |
| 201 scoped_ptr<GaneshRasterizer> ganesh_rasterizer, | |
| 195 size_t num_raster_threads, | 202 size_t num_raster_threads, |
| 196 size_t max_raster_usage_bytes, | 203 size_t max_raster_usage_bytes, |
| 197 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 204 RenderingStatsInstrumentation* rendering_stats_instrumentation) |
| 198 : client_(client), | 205 : client_(client), |
| 199 resource_pool_(ResourcePool::Create(resource_provider)), | 206 resource_pool_(ResourcePool::Create(resource_provider)), |
| 200 raster_worker_pool_(raster_worker_pool.Pass()), | 207 raster_worker_pool_(raster_worker_pool.Pass()), |
| 208 ganesh_rasterizer_(ganesh_rasterizer.Pass()), | |
| 201 prioritized_tiles_dirty_(false), | 209 prioritized_tiles_dirty_(false), |
| 202 all_tiles_that_need_to_be_rasterized_have_memory_(true), | 210 all_tiles_that_need_to_be_rasterized_have_memory_(true), |
| 203 all_tiles_required_for_activation_have_memory_(true), | 211 all_tiles_required_for_activation_have_memory_(true), |
| 204 memory_required_bytes_(0), | 212 memory_required_bytes_(0), |
| 205 memory_nice_to_have_bytes_(0), | 213 memory_nice_to_have_bytes_(0), |
| 206 bytes_releasable_(0), | 214 bytes_releasable_(0), |
| 207 resources_releasable_(0), | 215 resources_releasable_(0), |
| 208 max_raster_usage_bytes_(max_raster_usage_bytes), | 216 max_raster_usage_bytes_(max_raster_usage_bytes), |
| 209 ever_exceeded_memory_budget_(false), | 217 ever_exceeded_memory_budget_(false), |
| 210 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 218 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 211 did_initialize_visible_tile_(false), | 219 did_initialize_visible_tile_(false), |
| 212 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { | 220 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { |
| 213 raster_worker_pool_->SetClient(this); | 221 raster_worker_pool_->SetClient(this); |
| 222 if (ganesh_rasterizer_) | |
| 223 ganesh_rasterizer_->SetClient(this); | |
| 214 } | 224 } |
| 215 | 225 |
| 216 TileManager::~TileManager() { | 226 TileManager::~TileManager() { |
| 217 // Reset global state and manage. This should cause | 227 // Reset global state and manage. This should cause |
| 218 // our memory usage to drop to zero. | 228 // our memory usage to drop to zero. |
| 219 global_state_ = GlobalStateThatImpactsTilePriority(); | 229 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 220 | 230 |
| 221 CleanUpReleasedTiles(); | 231 CleanUpReleasedTiles(); |
| 222 DCHECK_EQ(0u, tiles_.size()); | 232 DCHECK_EQ(0u, tiles_.size()); |
| 223 | 233 |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 581 return requirements.PassAs<base::Value>(); | 591 return requirements.PassAs<base::Value>(); |
| 582 } | 592 } |
| 583 | 593 |
| 584 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const { | 594 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const { |
| 585 DCHECK(tile); | 595 DCHECK(tile); |
| 586 DCHECK(tile->picture_pile()); | 596 DCHECK(tile->picture_pile()); |
| 587 | 597 |
| 588 const ManagedTileState& mts = tile->managed_state(); | 598 const ManagedTileState& mts = tile->managed_state(); |
| 589 RasterMode current_mode = mts.raster_mode; | 599 RasterMode current_mode = mts.raster_mode; |
| 590 | 600 |
| 601 // TODO(skaslev): Add proper a heuristic whether a tile | |
| 602 // should go for software or GPU rasterizing. | |
| 603 if (ganesh_rasterizer_) | |
| 604 return GANESH_RASTER_MODE; | |
| 591 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE; | 605 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE; |
| 592 if (tile->managed_state().resolution == LOW_RESOLUTION) | 606 if (tile->managed_state().resolution == LOW_RESOLUTION) |
| 593 raster_mode = LOW_QUALITY_RASTER_MODE; | 607 raster_mode = LOW_QUALITY_RASTER_MODE; |
| 594 else if (tile->can_use_lcd_text()) | 608 else if (tile->can_use_lcd_text()) |
| 595 raster_mode = HIGH_QUALITY_RASTER_MODE; | 609 raster_mode = HIGH_QUALITY_RASTER_MODE; |
| 596 else if (mts.tile_versions[current_mode].has_text_ || | 610 else if (mts.tile_versions[current_mode].has_text_ || |
| 597 !mts.tile_versions[current_mode].IsReadyToDraw()) | 611 !mts.tile_versions[current_mode].IsReadyToDraw()) |
| 598 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; | 612 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; |
| 599 | 613 |
| 600 return std::min(raster_mode, current_mode); | 614 return std::min(raster_mode, current_mode); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 803 it != tiles_that_need_to_be_rasterized.end(); | 817 it != tiles_that_need_to_be_rasterized.end(); |
| 804 ++it) { | 818 ++it) { |
| 805 Tile* tile = *it; | 819 Tile* tile = *it; |
| 806 ManagedTileState& mts = tile->managed_state(); | 820 ManagedTileState& mts = tile->managed_state(); |
| 807 ManagedTileState::TileVersion& tile_version = | 821 ManagedTileState::TileVersion& tile_version = |
| 808 mts.tile_versions[mts.raster_mode]; | 822 mts.tile_versions[mts.raster_mode]; |
| 809 | 823 |
| 810 DCHECK(tile_version.requires_resource()); | 824 DCHECK(tile_version.requires_resource()); |
| 811 DCHECK(!tile_version.resource_); | 825 DCHECK(!tile_version.resource_); |
| 812 | 826 |
| 813 if (tile_version.raster_task_.is_null()) | 827 if (mts.raster_mode == GANESH_RASTER_MODE) { |
| 814 tile_version.raster_task_ = CreateRasterTask(tile); | 828 CreateGaneshRasterTask(tile); |
| 829 } else { | |
| 830 if (tile_version.raster_task_.is_null()) | |
| 831 tile_version.raster_task_ = CreateRasterTask(tile); | |
| 815 | 832 |
| 816 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); | 833 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); |
| 834 } | |
| 817 } | 835 } |
| 818 | 836 |
| 819 // We must reduce the amount of unused resoruces before calling | 837 // We must reduce the amount of unused resoruces before calling |
| 820 // ScheduleTasks to prevent usage from rising above limits. | 838 // ScheduleTasks to prevent usage from rising above limits. |
| 821 resource_pool_->ReduceResourceUsage(); | 839 resource_pool_->ReduceResourceUsage(); |
| 822 | 840 |
| 823 // Schedule running of |tasks|. This replaces any previously | 841 // Schedule running of |tasks|. This replaces any previously |
| 824 // scheduled tasks and effectively cancels all tasks not present | 842 // scheduled tasks and effectively cancels all tasks not present |
| 825 // in |tasks|. | 843 // in |tasks|. |
| 826 raster_worker_pool_->ScheduleTasks(&tasks); | 844 raster_worker_pool_->ScheduleTasks(&tasks); |
| 827 | 845 |
| 828 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 846 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| 847 | |
| 848 if (ganesh_rasterizer_) | |
| 849 ganesh_rasterizer_->FlushRasterTasks(rendering_stats_instrumentation_); | |
|
vmpstr
2013/11/25 18:11:48
From the perspective of what TileManager current d
reveman
2013/11/25 21:24:10
It might be cleaner to tally up these tiles in a d
| |
| 829 } | 850 } |
| 830 | 851 |
| 831 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( | 852 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
| 832 Tile* tile, skia::LazyPixelRef* pixel_ref) { | 853 Tile* tile, skia::LazyPixelRef* pixel_ref) { |
| 833 return RasterWorkerPool::CreateImageDecodeTask( | 854 return RasterWorkerPool::CreateImageDecodeTask( |
| 834 pixel_ref, | 855 pixel_ref, |
| 835 tile->layer_id(), | 856 tile->layer_id(), |
| 836 rendering_stats_instrumentation_, | 857 rendering_stats_instrumentation_, |
| 837 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 858 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
| 838 base::Unretained(this), | 859 base::Unretained(this), |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 885 tile->source_frame_number(), | 906 tile->source_frame_number(), |
| 886 rendering_stats_instrumentation_, | 907 rendering_stats_instrumentation_, |
| 887 base::Bind(&TileManager::OnRasterTaskCompleted, | 908 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 888 base::Unretained(this), | 909 base::Unretained(this), |
| 889 tile->id(), | 910 tile->id(), |
| 890 base::Passed(&resource), | 911 base::Passed(&resource), |
| 891 mts.raster_mode), | 912 mts.raster_mode), |
| 892 &decode_tasks); | 913 &decode_tasks); |
| 893 } | 914 } |
| 894 | 915 |
| 916 void TileManager::CreateGaneshRasterTask(Tile* tile) { | |
| 917 DCHECK(ganesh_rasterizer_); | |
| 918 | |
| 919 scoped_ptr<ResourcePool::Resource> resource = | |
| 920 resource_pool_->AcquireResource(tile->tile_size_.size(), | |
| 921 ganesh_rasterizer_->GetResourceFormat()); | |
| 922 ganesh_rasterizer_->PushRasterTask(tile, resource.Pass()); | |
| 923 } | |
| 924 | |
| 895 void TileManager::OnImageDecodeTaskCompleted( | 925 void TileManager::OnImageDecodeTaskCompleted( |
| 896 int layer_id, | 926 int layer_id, |
| 897 skia::LazyPixelRef* pixel_ref, | 927 skia::LazyPixelRef* pixel_ref, |
| 898 bool was_canceled) { | 928 bool was_canceled) { |
| 899 // If the task was canceled, we need to clean it up | 929 // If the task was canceled, we need to clean it up |
| 900 // from |image_decode_tasks_|. | 930 // from |image_decode_tasks_|. |
| 901 if (!was_canceled) | 931 if (!was_canceled) |
| 902 return; | 932 return; |
| 903 | 933 |
| 904 LayerPixelRefTaskMap::iterator layer_it = | 934 LayerPixelRefTaskMap::iterator layer_it = |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 953 | 983 |
| 954 bytes_releasable_ += BytesConsumedIfAllocated(tile); | 984 bytes_releasable_ += BytesConsumedIfAllocated(tile); |
| 955 ++resources_releasable_; | 985 ++resources_releasable_; |
| 956 } | 986 } |
| 957 | 987 |
| 958 FreeUnusedResourcesForTile(tile); | 988 FreeUnusedResourcesForTile(tile); |
| 959 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 989 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
| 960 did_initialize_visible_tile_ = true; | 990 did_initialize_visible_tile_ = true; |
| 961 } | 991 } |
| 962 | 992 |
| 993 void TileManager::OnGaneshRasterTaskCompleted( | |
| 994 Tile* tile, | |
| 995 scoped_ptr<ResourcePool::Resource> resource, | |
| 996 bool was_canceled) { | |
| 997 ManagedTileState& mts = tile->managed_state(); | |
| 998 ManagedTileState::TileVersion& tile_version = | |
| 999 mts.tile_versions[GANESH_RASTER_MODE]; | |
| 1000 DCHECK(tile_version.raster_task_.is_null()); | |
| 1001 | |
| 1002 if (was_canceled) { | |
| 1003 ++update_visible_tiles_stats_.canceled_count; | |
| 1004 resource_pool_->ReleaseResource(resource.Pass()); | |
| 1005 return; | |
| 1006 } | |
| 1007 | |
| 1008 ++update_visible_tiles_stats_.completed_count; | |
| 1009 | |
| 1010 tile_version.set_use_resource(); | |
| 1011 tile_version.resource_ = resource.Pass(); | |
| 1012 | |
| 1013 bytes_releasable_ += BytesConsumedIfAllocated(tile); | |
| 1014 ++resources_releasable_; | |
| 1015 | |
| 1016 FreeUnusedResourcesForTile(tile); | |
| 1017 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | |
| 1018 did_initialize_visible_tile_ = true; | |
| 1019 } | |
| 1020 | |
| 963 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, | 1021 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
| 964 gfx::Size tile_size, | 1022 gfx::Size tile_size, |
| 965 gfx::Rect content_rect, | 1023 gfx::Rect content_rect, |
| 966 gfx::Rect opaque_rect, | 1024 gfx::Rect opaque_rect, |
| 967 float contents_scale, | 1025 float contents_scale, |
| 968 int layer_id, | 1026 int layer_id, |
| 969 int source_frame_number, | 1027 int source_frame_number, |
| 970 bool can_use_lcd_text) { | 1028 bool can_use_lcd_text) { |
| 971 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, | 1029 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, |
| 972 picture_pile, | 1030 picture_pile, |
| 973 tile_size, | 1031 tile_size, |
| 974 content_rect, | 1032 content_rect, |
| 975 opaque_rect, | 1033 opaque_rect, |
| 976 contents_scale, | 1034 contents_scale, |
| 977 layer_id, | 1035 layer_id, |
| 978 source_frame_number, | 1036 source_frame_number, |
| 979 can_use_lcd_text)); | 1037 can_use_lcd_text)); |
| 980 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 1038 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
| 981 | 1039 |
| 982 tiles_[tile->id()] = tile; | 1040 tiles_[tile->id()] = tile; |
| 983 used_layer_counts_[tile->layer_id()]++; | 1041 used_layer_counts_[tile->layer_id()]++; |
| 984 prioritized_tiles_dirty_ = true; | 1042 prioritized_tiles_dirty_ = true; |
| 985 return tile; | 1043 return tile; |
| 986 } | 1044 } |
| 987 | 1045 |
| 988 } // namespace cc | 1046 } // namespace cc |
| OLD | NEW |