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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 160 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
161 state->SetInteger("completed_count", stats.completed_count); | 161 state->SetInteger("completed_count", stats.completed_count); |
162 state->SetInteger("canceled_count", stats.canceled_count); | 162 state->SetInteger("canceled_count", stats.canceled_count); |
163 return state.PassAs<base::Value>(); | 163 return state.PassAs<base::Value>(); |
164 } | 164 } |
165 | 165 |
166 // static | 166 // static |
167 scoped_ptr<TileManager> TileManager::Create( | 167 scoped_ptr<TileManager> TileManager::Create( |
168 TileManagerClient* client, | 168 TileManagerClient* client, |
169 ResourceProvider* resource_provider, | 169 ResourceProvider* resource_provider, |
| 170 ContextProvider* context_provider, |
170 size_t num_raster_threads, | 171 size_t num_raster_threads, |
171 RenderingStatsInstrumentation* rendering_stats_instrumentation, | 172 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
172 bool use_map_image, | 173 bool use_map_image, |
173 size_t max_transfer_buffer_usage_bytes, | 174 size_t max_transfer_buffer_usage_bytes, |
174 size_t max_raster_usage_bytes, | 175 size_t max_raster_usage_bytes, |
175 GLenum map_image_texture_target) { | 176 GLenum map_image_texture_target) { |
176 return make_scoped_ptr( | 177 return make_scoped_ptr( |
177 new TileManager(client, | 178 new TileManager(client, |
178 resource_provider, | 179 resource_provider, |
| 180 GpuRasterizer::Create( |
| 181 context_provider, resource_provider), |
179 use_map_image ? | 182 use_map_image ? |
180 ImageRasterWorkerPool::Create( | 183 ImageRasterWorkerPool::Create( |
181 resource_provider, | 184 resource_provider, |
182 num_raster_threads, | 185 num_raster_threads, |
183 map_image_texture_target) : | 186 map_image_texture_target) : |
184 PixelBufferRasterWorkerPool::Create( | 187 PixelBufferRasterWorkerPool::Create( |
185 resource_provider, | 188 resource_provider, |
186 num_raster_threads, | 189 num_raster_threads, |
187 max_transfer_buffer_usage_bytes), | 190 max_transfer_buffer_usage_bytes), |
188 num_raster_threads, | 191 num_raster_threads, |
189 max_raster_usage_bytes, | 192 max_raster_usage_bytes, |
190 rendering_stats_instrumentation)); | 193 rendering_stats_instrumentation)); |
191 } | 194 } |
192 | 195 |
193 TileManager::TileManager( | 196 TileManager::TileManager( |
194 TileManagerClient* client, | 197 TileManagerClient* client, |
195 ResourceProvider* resource_provider, | 198 ResourceProvider* resource_provider, |
| 199 scoped_ptr<GpuRasterizer> gpu_rasterizer, |
196 scoped_ptr<RasterWorkerPool> raster_worker_pool, | 200 scoped_ptr<RasterWorkerPool> raster_worker_pool, |
197 size_t num_raster_threads, | 201 size_t num_raster_threads, |
198 size_t max_raster_usage_bytes, | 202 size_t max_raster_usage_bytes, |
199 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 203 RenderingStatsInstrumentation* rendering_stats_instrumentation) |
200 : client_(client), | 204 : client_(client), |
201 resource_pool_(ResourcePool::Create( | 205 resource_pool_(ResourcePool::Create( |
202 resource_provider, | 206 resource_provider, |
203 raster_worker_pool->GetResourceTarget(), | 207 raster_worker_pool->GetResourceTarget(), |
204 raster_worker_pool->GetResourceFormat())), | 208 raster_worker_pool->GetResourceFormat())), |
| 209 gpu_rasterizer_(gpu_rasterizer.Pass()), |
205 raster_worker_pool_(raster_worker_pool.Pass()), | 210 raster_worker_pool_(raster_worker_pool.Pass()), |
206 prioritized_tiles_dirty_(false), | 211 prioritized_tiles_dirty_(false), |
207 all_tiles_that_need_to_be_rasterized_have_memory_(true), | 212 all_tiles_that_need_to_be_rasterized_have_memory_(true), |
208 all_tiles_required_for_activation_have_memory_(true), | 213 all_tiles_required_for_activation_have_memory_(true), |
209 memory_required_bytes_(0), | 214 memory_required_bytes_(0), |
210 memory_nice_to_have_bytes_(0), | 215 memory_nice_to_have_bytes_(0), |
211 bytes_releasable_(0), | 216 bytes_releasable_(0), |
212 resources_releasable_(0), | 217 resources_releasable_(0), |
213 max_raster_usage_bytes_(max_raster_usage_bytes), | 218 max_raster_usage_bytes_(max_raster_usage_bytes), |
214 ever_exceeded_memory_budget_(false), | 219 ever_exceeded_memory_budget_(false), |
215 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 220 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
216 did_initialize_visible_tile_(false), | 221 did_initialize_visible_tile_(false), |
217 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { | 222 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { |
| 223 gpu_rasterizer_->SetClient(this); |
218 raster_worker_pool_->SetClient(this); | 224 raster_worker_pool_->SetClient(this); |
219 } | 225 } |
220 | 226 |
221 TileManager::~TileManager() { | 227 TileManager::~TileManager() { |
222 // Reset global state and manage. This should cause | 228 // Reset global state and manage. This should cause |
223 // our memory usage to drop to zero. | 229 // our memory usage to drop to zero. |
224 global_state_ = GlobalStateThatImpactsTilePriority(); | 230 global_state_ = GlobalStateThatImpactsTilePriority(); |
225 | 231 |
226 CleanUpReleasedTiles(); | 232 CleanUpReleasedTiles(); |
227 DCHECK_EQ(0u, bundles_.size()); | 233 DCHECK_EQ(0u, bundles_.size()); |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 if (mode != used_mode) | 822 if (mode != used_mode) |
817 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); | 823 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); |
818 } | 824 } |
819 } | 825 } |
820 | 826 |
821 void TileManager::ScheduleTasks( | 827 void TileManager::ScheduleTasks( |
822 const TileVector& tiles_that_need_to_be_rasterized) { | 828 const TileVector& tiles_that_need_to_be_rasterized) { |
823 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", | 829 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", |
824 "count", tiles_that_need_to_be_rasterized.size()); | 830 "count", tiles_that_need_to_be_rasterized.size()); |
825 RasterWorkerPool::RasterTask::Queue tasks; | 831 RasterWorkerPool::RasterTask::Queue tasks; |
| 832 GpuRasterizer::Queue gpu_raster_tasks; |
826 | 833 |
827 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 834 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
828 | 835 |
829 // Build a new task queue containing all task currently needed. Tasks | 836 // Build a new task queue containing all task currently needed. Tasks |
830 // are added in order of priority, highest priority task first. | 837 // are added in order of priority, highest priority task first. |
831 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); | 838 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
832 it != tiles_that_need_to_be_rasterized.end(); | 839 it != tiles_that_need_to_be_rasterized.end(); |
833 ++it) { | 840 ++it) { |
834 Tile* tile = *it; | 841 Tile* tile = *it; |
835 ManagedTileState& mts = tile->managed_state(); | 842 ManagedTileState& mts = tile->managed_state(); |
836 ManagedTileState::TileVersion& tile_version = | 843 ManagedTileState::TileVersion& tile_version = |
837 mts.tile_versions[mts.raster_mode]; | 844 mts.tile_versions[mts.raster_mode]; |
838 | 845 |
839 DCHECK(tile_version.requires_resource()); | 846 DCHECK(tile_version.requires_resource()); |
840 DCHECK(!tile_version.resource_); | 847 DCHECK(!tile_version.resource_); |
841 | 848 |
842 if (tile_version.raster_task_.is_null()) | 849 if (tile->use_gpu_rasterization()) { |
843 tile_version.raster_task_ = CreateRasterTask(tile); | 850 scoped_ptr<ScopedResource> resource = |
| 851 resource_pool_->AcquireResource(tile->tile_size_.size()); |
844 | 852 |
845 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); | 853 gpu_raster_tasks.Append(tile, resource.Pass()); |
| 854 } else { |
| 855 if (tile_version.raster_task_.is_null()) |
| 856 tile_version.raster_task_ = CreateRasterTask(tile); |
| 857 |
| 858 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); |
| 859 } |
846 } | 860 } |
847 | 861 |
848 // We must reduce the amount of unused resoruces before calling | 862 // We must reduce the amount of unused resoruces before calling |
849 // ScheduleTasks to prevent usage from rising above limits. | 863 // ScheduleTasks to prevent usage from rising above limits. |
850 resource_pool_->ReduceResourceUsage(); | 864 resource_pool_->ReduceResourceUsage(); |
851 | 865 |
852 // Schedule running of |tasks|. This replaces any previously | 866 // Schedule running of |tasks|. This replaces any previously |
853 // scheduled tasks and effectively cancels all tasks not present | 867 // scheduled tasks and effectively cancels all tasks not present |
854 // in |tasks|. | 868 // in |tasks|. |
855 raster_worker_pool_->ScheduleTasks(&tasks); | 869 raster_worker_pool_->ScheduleTasks(&tasks); |
856 | 870 |
857 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 871 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| 872 |
| 873 gpu_rasterizer_->Rasterize(gpu_raster_tasks, |
| 874 rendering_stats_instrumentation_); |
858 } | 875 } |
859 | 876 |
860 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( | 877 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
861 Tile* tile, skia::LazyPixelRef* pixel_ref) { | 878 Tile* tile, skia::LazyPixelRef* pixel_ref) { |
862 return RasterWorkerPool::CreateImageDecodeTask( | 879 return RasterWorkerPool::CreateImageDecodeTask( |
863 pixel_ref, | 880 pixel_ref, |
864 tile->layer_id(), | 881 tile->layer_id(), |
865 rendering_stats_instrumentation_, | 882 rendering_stats_instrumentation_, |
866 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 883 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
867 base::Unretained(this), | 884 base::Unretained(this), |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
980 | 997 |
981 bytes_releasable_ += BytesConsumedIfAllocated(tile); | 998 bytes_releasable_ += BytesConsumedIfAllocated(tile); |
982 ++resources_releasable_; | 999 ++resources_releasable_; |
983 } | 1000 } |
984 | 1001 |
985 FreeUnusedResourcesForTile(tile); | 1002 FreeUnusedResourcesForTile(tile); |
986 if (tile->is_visible()) | 1003 if (tile->is_visible()) |
987 did_initialize_visible_tile_ = true; | 1004 did_initialize_visible_tile_ = true; |
988 } | 1005 } |
989 | 1006 |
| 1007 void TileManager::OnGpuRasterTaskCompleted( |
| 1008 Tile* tile, |
| 1009 scoped_ptr<ScopedResource> resource) { |
| 1010 ManagedTileState& mts = tile->managed_state(); |
| 1011 ManagedTileState::TileVersion& tile_version = |
| 1012 mts.tile_versions[mts.raster_mode]; |
| 1013 DCHECK(tile_version.raster_task_.is_null()); |
| 1014 |
| 1015 ++update_visible_tiles_stats_.completed_count; |
| 1016 |
| 1017 tile_version.set_use_resource(); |
| 1018 tile_version.resource_ = resource.Pass(); |
| 1019 |
| 1020 bytes_releasable_ += BytesConsumedIfAllocated(tile); |
| 1021 ++resources_releasable_; |
| 1022 |
| 1023 FreeUnusedResourcesForTile(tile); |
| 1024 if (tile->is_visible()) |
| 1025 did_initialize_visible_tile_ = true; |
| 1026 } |
| 1027 |
990 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, | 1028 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
991 gfx::Size tile_size, | 1029 gfx::Size tile_size, |
992 gfx::Rect content_rect, | 1030 gfx::Rect content_rect, |
993 gfx::Rect opaque_rect, | 1031 gfx::Rect opaque_rect, |
994 float contents_scale, | 1032 float contents_scale, |
995 int layer_id, | 1033 int layer_id, |
996 int source_frame_number, | 1034 int source_frame_number, |
997 int flags) { | 1035 int flags) { |
998 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, | 1036 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, |
999 picture_pile, | 1037 picture_pile, |
(...skipping 16 matching lines...) Expand all Loading... |
1016 int offset_y, | 1054 int offset_y, |
1017 int width, | 1055 int width, |
1018 int height) { | 1056 int height) { |
1019 scoped_refptr<TileBundle> bundle = make_scoped_refptr( | 1057 scoped_refptr<TileBundle> bundle = make_scoped_refptr( |
1020 new TileBundle(this, offset_x, offset_y, width, height)); | 1058 new TileBundle(this, offset_x, offset_y, width, height)); |
1021 bundles_[bundle->id()] = bundle; | 1059 bundles_[bundle->id()] = bundle; |
1022 return bundle; | 1060 return bundle; |
1023 } | 1061 } |
1024 | 1062 |
1025 } // namespace cc | 1063 } // namespace cc |
OLD | NEW |