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, |
173 bool use_map_image, | 174 bool use_map_image, |
| 175 bool use_ganesh, |
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( |
| 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) |
| 602 return GANESH_RASTER_MODE; |
591 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE; | 603 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE; |
592 if (tile->managed_state().resolution == LOW_RESOLUTION) | 604 if (tile->managed_state().resolution == LOW_RESOLUTION) |
593 raster_mode = LOW_QUALITY_RASTER_MODE; | 605 raster_mode = LOW_QUALITY_RASTER_MODE; |
594 else if (tile->can_use_lcd_text()) | 606 else if (tile->can_use_lcd_text()) |
595 raster_mode = HIGH_QUALITY_RASTER_MODE; | 607 raster_mode = HIGH_QUALITY_RASTER_MODE; |
596 else if (mts.tile_versions[current_mode].has_text_ || | 608 else if (mts.tile_versions[current_mode].has_text_ || |
597 !mts.tile_versions[current_mode].IsReadyToDraw()) | 609 !mts.tile_versions[current_mode].IsReadyToDraw()) |
598 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; | 610 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; |
599 | 611 |
600 return std::min(raster_mode, current_mode); | 612 return std::min(raster_mode, current_mode); |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 } | 802 } |
791 | 803 |
792 void TileManager::ScheduleTasks( | 804 void TileManager::ScheduleTasks( |
793 const TileVector& tiles_that_need_to_be_rasterized) { | 805 const TileVector& tiles_that_need_to_be_rasterized) { |
794 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", | 806 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", |
795 "count", tiles_that_need_to_be_rasterized.size()); | 807 "count", tiles_that_need_to_be_rasterized.size()); |
796 RasterWorkerPool::RasterTask::Queue tasks; | 808 RasterWorkerPool::RasterTask::Queue tasks; |
797 | 809 |
798 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 810 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
799 | 811 |
| 812 GaneshRasterizer::RasterTaskVector ganesh_tasks; |
| 813 |
800 // Build a new task queue containing all task currently needed. Tasks | 814 // Build a new task queue containing all task currently needed. Tasks |
801 // are added in order of priority, highest priority task first. | 815 // are added in order of priority, highest priority task first. |
802 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); | 816 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
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 // TODO(skaslev) Set proper raster_mode somewhere else, |
814 tile_version.raster_task_ = CreateRasterTask(tile); | 828 // e.g. AssignGpuMemoryToTiles. |
| 829 if (mts.raster_mode == GANESH_RASTER_MODE) { |
| 830 ganesh_tasks.push_back(CreateGaneshRasterTask(tile)); |
| 831 } else { |
| 832 if (tile_version.raster_task_.is_null()) |
| 833 tile_version.raster_task_ = CreateRasterTask(tile); |
815 | 834 |
816 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); | 835 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); |
| 836 } |
817 } | 837 } |
818 | 838 |
819 // We must reduce the amount of unused resoruces before calling | 839 // We must reduce the amount of unused resoruces before calling |
820 // ScheduleTasks to prevent usage from rising above limits. | 840 // ScheduleTasks to prevent usage from rising above limits. |
821 resource_pool_->ReduceResourceUsage(); | 841 resource_pool_->ReduceResourceUsage(); |
822 | 842 |
823 // Schedule running of |tasks|. This replaces any previously | 843 // Schedule running of |tasks|. This replaces any previously |
824 // scheduled tasks and effectively cancels all tasks not present | 844 // scheduled tasks and effectively cancels all tasks not present |
825 // in |tasks|. | 845 // in |tasks|. |
826 raster_worker_pool_->ScheduleTasks(&tasks); | 846 raster_worker_pool_->ScheduleTasks(&tasks); |
827 | 847 |
828 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 848 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| 849 |
| 850 if (!ganesh_tasks.empty()) { |
| 851 ganesh_rasterizer_->Rasterize( |
| 852 ganesh_tasks, rendering_stats_instrumentation_); |
| 853 } |
829 } | 854 } |
830 | 855 |
831 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( | 856 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
832 Tile* tile, skia::LazyPixelRef* pixel_ref) { | 857 Tile* tile, skia::LazyPixelRef* pixel_ref) { |
833 return RasterWorkerPool::CreateImageDecodeTask( | 858 return RasterWorkerPool::CreateImageDecodeTask( |
834 pixel_ref, | 859 pixel_ref, |
835 tile->layer_id(), | 860 tile->layer_id(), |
836 rendering_stats_instrumentation_, | 861 rendering_stats_instrumentation_, |
837 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 862 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
838 base::Unretained(this), | 863 base::Unretained(this), |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 tile->source_frame_number(), | 910 tile->source_frame_number(), |
886 rendering_stats_instrumentation_, | 911 rendering_stats_instrumentation_, |
887 base::Bind(&TileManager::OnRasterTaskCompleted, | 912 base::Bind(&TileManager::OnRasterTaskCompleted, |
888 base::Unretained(this), | 913 base::Unretained(this), |
889 tile->id(), | 914 tile->id(), |
890 base::Passed(&resource), | 915 base::Passed(&resource), |
891 mts.raster_mode), | 916 mts.raster_mode), |
892 &decode_tasks); | 917 &decode_tasks); |
893 } | 918 } |
894 | 919 |
| 920 GaneshRasterizer::RasterTask* TileManager::CreateGaneshRasterTask(Tile* tile) { |
| 921 scoped_ptr<ResourcePool::Resource> resource = |
| 922 resource_pool_->AcquireResource(tile->tile_size_.size(), |
| 923 ganesh_rasterizer_->GetResourceFormat()); |
| 924 return ganesh_rasterizer_->CreateRasterTask(tile, resource.Pass()); |
| 925 } |
| 926 |
895 void TileManager::OnImageDecodeTaskCompleted( | 927 void TileManager::OnImageDecodeTaskCompleted( |
896 int layer_id, | 928 int layer_id, |
897 skia::LazyPixelRef* pixel_ref, | 929 skia::LazyPixelRef* pixel_ref, |
898 bool was_canceled) { | 930 bool was_canceled) { |
899 // If the task was canceled, we need to clean it up | 931 // If the task was canceled, we need to clean it up |
900 // from |image_decode_tasks_|. | 932 // from |image_decode_tasks_|. |
901 if (!was_canceled) | 933 if (!was_canceled) |
902 return; | 934 return; |
903 | 935 |
904 LayerPixelRefTaskMap::iterator layer_it = | 936 LayerPixelRefTaskMap::iterator layer_it = |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 | 985 |
954 bytes_releasable_ += BytesConsumedIfAllocated(tile); | 986 bytes_releasable_ += BytesConsumedIfAllocated(tile); |
955 ++resources_releasable_; | 987 ++resources_releasable_; |
956 } | 988 } |
957 | 989 |
958 FreeUnusedResourcesForTile(tile); | 990 FreeUnusedResourcesForTile(tile); |
959 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 991 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
960 did_initialize_visible_tile_ = true; | 992 did_initialize_visible_tile_ = true; |
961 } | 993 } |
962 | 994 |
| 995 void TileManager::OnGaneshRasterTaskCompleted( |
| 996 Tile* tile, |
| 997 scoped_ptr<ResourcePool::Resource> resource, |
| 998 bool was_canceled) { |
| 999 ManagedTileState& mts = tile->managed_state(); |
| 1000 ManagedTileState::TileVersion& tile_version = |
| 1001 mts.tile_versions[GANESH_RASTER_MODE]; |
| 1002 DCHECK(tile_version.raster_task_.is_null()); |
| 1003 |
| 1004 if (was_canceled) { |
| 1005 ++update_visible_tiles_stats_.canceled_count; |
| 1006 resource_pool_->ReleaseResource(resource.Pass()); |
| 1007 return; |
| 1008 } |
| 1009 |
| 1010 ++update_visible_tiles_stats_.completed_count; |
| 1011 |
| 1012 tile_version.set_use_resource(); |
| 1013 tile_version.resource_ = resource.Pass(); |
| 1014 |
| 1015 bytes_releasable_ += BytesConsumedIfAllocated(tile); |
| 1016 ++resources_releasable_; |
| 1017 |
| 1018 FreeUnusedResourcesForTile(tile); |
| 1019 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
| 1020 did_initialize_visible_tile_ = true; |
| 1021 } |
| 1022 |
963 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, | 1023 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
964 gfx::Size tile_size, | 1024 gfx::Size tile_size, |
965 gfx::Rect content_rect, | 1025 gfx::Rect content_rect, |
966 gfx::Rect opaque_rect, | 1026 gfx::Rect opaque_rect, |
967 float contents_scale, | 1027 float contents_scale, |
968 int layer_id, | 1028 int layer_id, |
969 int source_frame_number, | 1029 int source_frame_number, |
970 bool can_use_lcd_text) { | 1030 bool can_use_lcd_text) { |
971 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, | 1031 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, |
972 picture_pile, | 1032 picture_pile, |
973 tile_size, | 1033 tile_size, |
974 content_rect, | 1034 content_rect, |
975 opaque_rect, | 1035 opaque_rect, |
976 contents_scale, | 1036 contents_scale, |
977 layer_id, | 1037 layer_id, |
978 source_frame_number, | 1038 source_frame_number, |
979 can_use_lcd_text)); | 1039 can_use_lcd_text)); |
980 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 1040 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
981 | 1041 |
982 tiles_[tile->id()] = tile; | 1042 tiles_[tile->id()] = tile; |
983 used_layer_counts_[tile->layer_id()]++; | 1043 used_layer_counts_[tile->layer_id()]++; |
984 prioritized_tiles_dirty_ = true; | 1044 prioritized_tiles_dirty_ = true; |
985 return tile; | 1045 return tile; |
986 } | 1046 } |
987 | 1047 |
988 } // namespace cc | 1048 } // namespace cc |
OLD | NEW |