| 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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 ContextProvider* context_provider, |
| 171 RenderingStatsInstrumentation* rendering_stats_instrumentation, | 171 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
| 172 bool use_map_image, | 172 bool use_map_image, |
| 173 bool use_rasterize_on_demand, |
| 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 unsigned map_image_texture_target) { | 176 unsigned map_image_texture_target) { |
| 176 return make_scoped_ptr(new TileManager( | 177 return make_scoped_ptr(new TileManager( |
| 177 client, | 178 client, |
| 178 resource_provider, | 179 resource_provider, |
| 179 use_map_image | 180 use_map_image |
| 180 ? ImageRasterWorkerPool::Create( | 181 ? ImageRasterWorkerPool::Create( |
| 181 resource_provider, context_provider, map_image_texture_target) | 182 resource_provider, context_provider, map_image_texture_target) |
| 182 : PixelBufferRasterWorkerPool::Create( | 183 : PixelBufferRasterWorkerPool::Create( |
| 183 resource_provider, | 184 resource_provider, |
| 184 context_provider, | 185 context_provider, |
| 185 max_transfer_buffer_usage_bytes), | 186 max_transfer_buffer_usage_bytes), |
| 186 max_raster_usage_bytes, | 187 max_raster_usage_bytes, |
| 187 rendering_stats_instrumentation)); | 188 rendering_stats_instrumentation, |
| 189 use_rasterize_on_demand)); |
| 188 } | 190 } |
| 189 | 191 |
| 190 TileManager::TileManager( | 192 TileManager::TileManager( |
| 191 TileManagerClient* client, | 193 TileManagerClient* client, |
| 192 ResourceProvider* resource_provider, | 194 ResourceProvider* resource_provider, |
| 193 scoped_ptr<RasterWorkerPool> raster_worker_pool, | 195 scoped_ptr<RasterWorkerPool> raster_worker_pool, |
| 194 size_t max_raster_usage_bytes, | 196 size_t max_raster_usage_bytes, |
| 195 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 197 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
| 198 bool use_rasterize_on_demand) |
| 196 : client_(client), | 199 : client_(client), |
| 197 resource_pool_( | 200 resource_pool_( |
| 198 ResourcePool::Create(resource_provider, | 201 ResourcePool::Create(resource_provider, |
| 199 raster_worker_pool->GetResourceTarget(), | 202 raster_worker_pool->GetResourceTarget(), |
| 200 raster_worker_pool->GetResourceFormat())), | 203 raster_worker_pool->GetResourceFormat())), |
| 201 raster_worker_pool_(raster_worker_pool.Pass()), | 204 raster_worker_pool_(raster_worker_pool.Pass()), |
| 202 prioritized_tiles_dirty_(false), | 205 prioritized_tiles_dirty_(false), |
| 203 all_tiles_that_need_to_be_rasterized_have_memory_(true), | 206 all_tiles_that_need_to_be_rasterized_have_memory_(true), |
| 204 all_tiles_required_for_activation_have_memory_(true), | 207 all_tiles_required_for_activation_have_memory_(true), |
| 205 memory_required_bytes_(0), | 208 memory_required_bytes_(0), |
| 206 memory_nice_to_have_bytes_(0), | 209 memory_nice_to_have_bytes_(0), |
| 207 bytes_releasable_(0), | 210 bytes_releasable_(0), |
| 208 resources_releasable_(0), | 211 resources_releasable_(0), |
| 209 max_raster_usage_bytes_(max_raster_usage_bytes), | 212 max_raster_usage_bytes_(max_raster_usage_bytes), |
| 210 ever_exceeded_memory_budget_(false), | 213 ever_exceeded_memory_budget_(false), |
| 211 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 214 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 212 did_initialize_visible_tile_(false), | 215 did_initialize_visible_tile_(false), |
| 213 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { | 216 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
| 217 use_rasterize_on_demand_(use_rasterize_on_demand) { |
| 214 raster_worker_pool_->SetClient(this); | 218 raster_worker_pool_->SetClient(this); |
| 215 } | 219 } |
| 216 | 220 |
| 217 TileManager::~TileManager() { | 221 TileManager::~TileManager() { |
| 218 // Reset global state and manage. This should cause | 222 // Reset global state and manage. This should cause |
| 219 // our memory usage to drop to zero. | 223 // our memory usage to drop to zero. |
| 220 global_state_ = GlobalStateThatImpactsTilePriority(); | 224 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 221 | 225 |
| 222 CleanUpReleasedTiles(); | 226 CleanUpReleasedTiles(); |
| 223 DCHECK_EQ(0u, tiles_.size()); | 227 DCHECK_EQ(0u, tiles_.size()); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 321 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| 318 Tile* tile = it->second; | 322 Tile* tile = it->second; |
| 319 ManagedTileState& mts = tile->managed_state(); | 323 ManagedTileState& mts = tile->managed_state(); |
| 320 ManagedTileState::TileVersion& tile_version = | 324 ManagedTileState::TileVersion& tile_version = |
| 321 mts.tile_versions[mts.raster_mode]; | 325 mts.tile_versions[mts.raster_mode]; |
| 322 | 326 |
| 323 if (tile->required_for_activation() && !tile_version.IsReadyToDraw()) { | 327 if (tile->required_for_activation() && !tile_version.IsReadyToDraw()) { |
| 324 // If we can't raster on demand, give up early (and don't activate). | 328 // If we can't raster on demand, give up early (and don't activate). |
| 325 if (!allow_rasterize_on_demand) | 329 if (!allow_rasterize_on_demand) |
| 326 return; | 330 return; |
| 327 tile_version.set_rasterize_on_demand(); | 331 if (use_rasterize_on_demand_) |
| 332 tile_version.set_rasterize_on_demand(); |
| 328 } | 333 } |
| 329 } | 334 } |
| 330 | 335 |
| 331 client_->NotifyReadyToActivate(); | 336 client_->NotifyReadyToActivate(); |
| 332 } | 337 } |
| 333 | 338 |
| 334 void TileManager::DidFinishRunningTasksRequiredForActivation() { | 339 void TileManager::DidFinishRunningTasksRequiredForActivation() { |
| 335 // This is only a true indication that all tiles required for | 340 // This is only a true indication that all tiles required for |
| 336 // activation are initialized when no tiles are OOM. We need to | 341 // activation are initialized when no tiles are OOM. We need to |
| 337 // wait for DidFinishRunningTasks() to be called, try to re-assign | 342 // wait for DidFinishRunningTasks() to be called, try to re-assign |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 } | 695 } |
| 691 } | 696 } |
| 692 | 697 |
| 693 // Tile is OOM. | 698 // Tile is OOM. |
| 694 if (tile_bytes > bytes_left || tile_resources > resources_left) { | 699 if (tile_bytes > bytes_left || tile_resources > resources_left) { |
| 695 FreeResourcesForTile(tile); | 700 FreeResourcesForTile(tile); |
| 696 | 701 |
| 697 // This tile was already on screen and now its resources have been | 702 // This tile was already on screen and now its resources have been |
| 698 // released. In order to prevent checkerboarding, set this tile as | 703 // released. In order to prevent checkerboarding, set this tile as |
| 699 // rasterize on demand immediately. | 704 // rasterize on demand immediately. |
| 700 if (mts.visible_and_ready_to_draw) | 705 if (mts.visible_and_ready_to_draw && use_rasterize_on_demand_) |
| 701 tile_version.set_rasterize_on_demand(); | 706 tile_version.set_rasterize_on_demand(); |
| 702 | 707 |
| 703 oomed = true; | 708 oomed = true; |
| 704 bytes_that_exceeded_memory_budget += tile_bytes; | 709 bytes_that_exceeded_memory_budget += tile_bytes; |
| 705 } else { | 710 } else { |
| 706 bytes_left -= tile_bytes; | 711 bytes_left -= tile_bytes; |
| 707 resources_left -= tile_resources; | 712 resources_left -= tile_resources; |
| 708 | 713 |
| 709 if (tile_version.resource_) | 714 if (tile_version.resource_) |
| 710 continue; | 715 continue; |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 flags)); | 980 flags)); |
| 976 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 981 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
| 977 | 982 |
| 978 tiles_[tile->id()] = tile; | 983 tiles_[tile->id()] = tile; |
| 979 used_layer_counts_[tile->layer_id()]++; | 984 used_layer_counts_[tile->layer_id()]++; |
| 980 prioritized_tiles_dirty_ = true; | 985 prioritized_tiles_dirty_ = true; |
| 981 return tile; | 986 return tile; |
| 982 } | 987 } |
| 983 | 988 |
| 984 } // namespace cc | 989 } // namespace cc |
| OLD | NEW |