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