| 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 |