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, |
174 size_t max_transfer_buffer_usage_bytes, | 175 size_t max_transfer_buffer_usage_bytes, |
175 size_t max_raster_usage_bytes, | 176 size_t max_raster_usage_bytes, |
176 GLenum map_image_texture_target) { | 177 GLenum map_image_texture_target) { |
177 return make_scoped_ptr( | 178 return make_scoped_ptr( |
178 new TileManager(client, | 179 new TileManager(client, |
179 resource_provider, | 180 resource_provider, |
181 context_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), |
189 num_raster_threads, | 191 num_raster_threads, |
190 max_raster_usage_bytes, | 192 max_raster_usage_bytes, |
191 rendering_stats_instrumentation)); | 193 rendering_stats_instrumentation)); |
192 } | 194 } |
193 | 195 |
194 TileManager::TileManager( | 196 TileManager::TileManager( |
195 TileManagerClient* client, | 197 TileManagerClient* client, |
196 ResourceProvider* resource_provider, | 198 ResourceProvider* resource_provider, |
199 ContextProvider* context_provider, | |
197 scoped_ptr<RasterWorkerPool> raster_worker_pool, | 200 scoped_ptr<RasterWorkerPool> raster_worker_pool, |
198 size_t num_raster_threads, | 201 size_t num_raster_threads, |
199 size_t max_raster_usage_bytes, | 202 size_t max_raster_usage_bytes, |
200 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 203 RenderingStatsInstrumentation* rendering_stats_instrumentation) |
201 : client_(client), | 204 : client_(client), |
202 resource_pool_(ResourcePool::Create( | 205 resource_pool_(ResourcePool::Create( |
203 resource_provider, | 206 resource_provider, |
204 raster_worker_pool->GetResourceTarget(), | 207 raster_worker_pool->GetResourceTarget(), |
205 raster_worker_pool->GetResourceFormat())), | 208 raster_worker_pool->GetResourceFormat())), |
206 raster_worker_pool_(raster_worker_pool.Pass()), | 209 raster_worker_pool_(raster_worker_pool.Pass()), |
210 gpu_rasterizer_(GpuRasterizer::Create( | |
nduca
2013/12/02 19:50:17
you should have unit tests that ensure that tiles
slavi
2013/12/04 02:06:50
Done.
| |
211 this, context_provider, resource_provider)), | |
207 prioritized_tiles_dirty_(false), | 212 prioritized_tiles_dirty_(false), |
208 all_tiles_that_need_to_be_rasterized_have_memory_(true), | 213 all_tiles_that_need_to_be_rasterized_have_memory_(true), |
209 all_tiles_required_for_activation_have_memory_(true), | 214 all_tiles_required_for_activation_have_memory_(true), |
210 memory_required_bytes_(0), | 215 memory_required_bytes_(0), |
211 memory_nice_to_have_bytes_(0), | 216 memory_nice_to_have_bytes_(0), |
212 bytes_releasable_(0), | 217 bytes_releasable_(0), |
213 resources_releasable_(0), | 218 resources_releasable_(0), |
214 max_raster_usage_bytes_(max_raster_usage_bytes), | 219 max_raster_usage_bytes_(max_raster_usage_bytes), |
215 ever_exceeded_memory_budget_(false), | 220 ever_exceeded_memory_budget_(false), |
216 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 221 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
793 if (mode != used_mode) | 798 if (mode != used_mode) |
794 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); | 799 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); |
795 } | 800 } |
796 } | 801 } |
797 | 802 |
798 void TileManager::ScheduleTasks( | 803 void TileManager::ScheduleTasks( |
799 const TileVector& tiles_that_need_to_be_rasterized) { | 804 const TileVector& tiles_that_need_to_be_rasterized) { |
800 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", | 805 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", |
801 "count", tiles_that_need_to_be_rasterized.size()); | 806 "count", tiles_that_need_to_be_rasterized.size()); |
802 RasterWorkerPool::RasterTask::Queue tasks; | 807 RasterWorkerPool::RasterTask::Queue tasks; |
808 GpuRasterizer::Queue gpu_raster_tasks; | |
803 | 809 |
804 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 810 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
805 | 811 |
806 // Build a new task queue containing all task currently needed. Tasks | 812 // Build a new task queue containing all task currently needed. Tasks |
807 // are added in order of priority, highest priority task first. | 813 // are added in order of priority, highest priority task first. |
808 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); | 814 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
809 it != tiles_that_need_to_be_rasterized.end(); | 815 it != tiles_that_need_to_be_rasterized.end(); |
810 ++it) { | 816 ++it) { |
811 Tile* tile = *it; | 817 Tile* tile = *it; |
812 ManagedTileState& mts = tile->managed_state(); | 818 ManagedTileState& mts = tile->managed_state(); |
813 ManagedTileState::TileVersion& tile_version = | 819 ManagedTileState::TileVersion& tile_version = |
814 mts.tile_versions[mts.raster_mode]; | 820 mts.tile_versions[mts.raster_mode]; |
815 | 821 |
816 DCHECK(tile_version.requires_resource()); | 822 DCHECK(tile_version.requires_resource()); |
817 DCHECK(!tile_version.resource_); | 823 DCHECK(!tile_version.resource_); |
818 | 824 |
819 if (tile_version.raster_task_.is_null()) | 825 if (tile->use_gpu_rasterizer()) { |
820 tile_version.raster_task_ = CreateRasterTask(tile); | 826 scoped_ptr<ResourcePool::Resource> resource = |
827 resource_pool_->AcquireResource(tile->tile_size_.size()); | |
821 | 828 |
822 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); | 829 gpu_raster_tasks.Append(tile, resource.Pass()); |
830 } else { | |
831 if (tile_version.raster_task_.is_null()) | |
832 tile_version.raster_task_ = CreateRasterTask(tile); | |
833 | |
834 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); | |
835 } | |
823 } | 836 } |
824 | 837 |
825 // We must reduce the amount of unused resoruces before calling | 838 // We must reduce the amount of unused resoruces before calling |
826 // ScheduleTasks to prevent usage from rising above limits. | 839 // ScheduleTasks to prevent usage from rising above limits. |
827 resource_pool_->ReduceResourceUsage(); | 840 resource_pool_->ReduceResourceUsage(); |
828 | 841 |
829 // Schedule running of |tasks|. This replaces any previously | 842 // Schedule running of |tasks|. This replaces any previously |
830 // scheduled tasks and effectively cancels all tasks not present | 843 // scheduled tasks and effectively cancels all tasks not present |
831 // in |tasks|. | 844 // in |tasks|. |
832 raster_worker_pool_->ScheduleTasks(&tasks); | 845 raster_worker_pool_->ScheduleTasks(&tasks); |
833 | 846 |
834 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 847 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
848 | |
849 gpu_rasterizer_->Rasterize(gpu_raster_tasks, | |
850 rendering_stats_instrumentation_); | |
835 } | 851 } |
836 | 852 |
837 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( | 853 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
838 Tile* tile, skia::LazyPixelRef* pixel_ref) { | 854 Tile* tile, skia::LazyPixelRef* pixel_ref) { |
839 return RasterWorkerPool::CreateImageDecodeTask( | 855 return RasterWorkerPool::CreateImageDecodeTask( |
840 pixel_ref, | 856 pixel_ref, |
841 tile->layer_id(), | 857 tile->layer_id(), |
842 rendering_stats_instrumentation_, | 858 rendering_stats_instrumentation_, |
843 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 859 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
844 base::Unretained(this), | 860 base::Unretained(this), |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
957 | 973 |
958 bytes_releasable_ += BytesConsumedIfAllocated(tile); | 974 bytes_releasable_ += BytesConsumedIfAllocated(tile); |
959 ++resources_releasable_; | 975 ++resources_releasable_; |
960 } | 976 } |
961 | 977 |
962 FreeUnusedResourcesForTile(tile); | 978 FreeUnusedResourcesForTile(tile); |
963 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 979 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
964 did_initialize_visible_tile_ = true; | 980 did_initialize_visible_tile_ = true; |
965 } | 981 } |
966 | 982 |
983 void TileManager::OnGpuRasterTaskCompleted( | |
984 Tile* tile, | |
985 scoped_ptr<ResourcePool::Resource> resource) { | |
986 ManagedTileState& mts = tile->managed_state(); | |
987 ManagedTileState::TileVersion& tile_version = | |
988 mts.tile_versions[mts.raster_mode]; | |
989 DCHECK(tile_version.raster_task_.is_null()); | |
990 | |
991 ++update_visible_tiles_stats_.completed_count; | |
992 | |
993 tile_version.set_use_resource(); | |
994 tile_version.resource_ = resource.Pass(); | |
995 | |
996 bytes_releasable_ += BytesConsumedIfAllocated(tile); | |
997 ++resources_releasable_; | |
998 | |
999 FreeUnusedResourcesForTile(tile); | |
1000 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | |
1001 did_initialize_visible_tile_ = true; | |
1002 } | |
1003 | |
967 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, | 1004 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
968 gfx::Size tile_size, | 1005 gfx::Size tile_size, |
969 gfx::Rect content_rect, | 1006 gfx::Rect content_rect, |
970 gfx::Rect opaque_rect, | 1007 gfx::Rect opaque_rect, |
971 float contents_scale, | 1008 float contents_scale, |
972 int layer_id, | 1009 int layer_id, |
973 int source_frame_number, | 1010 int source_frame_number, |
974 bool can_use_lcd_text) { | 1011 bool can_use_lcd_text, |
1012 bool use_gpu_rasterizer) { | |
975 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, | 1013 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, |
976 picture_pile, | 1014 picture_pile, |
977 tile_size, | 1015 tile_size, |
978 content_rect, | 1016 content_rect, |
979 opaque_rect, | 1017 opaque_rect, |
980 contents_scale, | 1018 contents_scale, |
981 layer_id, | 1019 layer_id, |
982 source_frame_number, | 1020 source_frame_number, |
983 can_use_lcd_text)); | 1021 can_use_lcd_text, |
1022 use_gpu_rasterizer)); | |
984 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 1023 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
985 | 1024 |
986 tiles_[tile->id()] = tile; | 1025 tiles_[tile->id()] = tile; |
987 used_layer_counts_[tile->layer_id()]++; | 1026 used_layer_counts_[tile->layer_id()]++; |
988 prioritized_tiles_dirty_ = true; | 1027 prioritized_tiles_dirty_ = true; |
989 return tile; | 1028 return tile; |
990 } | 1029 } |
991 | 1030 |
992 } // namespace cc | 1031 } // namespace cc |
OLD | NEW |