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 |