Chromium Code Reviews| 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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 116 TileManager::TileManager( | 116 TileManager::TileManager( |
| 117 TileManagerClient* client, | 117 TileManagerClient* client, |
| 118 ResourceProvider* resource_provider, | 118 ResourceProvider* resource_provider, |
| 119 scoped_ptr<RasterWorkerPool> raster_worker_pool, | 119 scoped_ptr<RasterWorkerPool> raster_worker_pool, |
| 120 size_t num_raster_threads, | 120 size_t num_raster_threads, |
| 121 RenderingStatsInstrumentation* rendering_stats_instrumentation, | 121 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
| 122 GLenum texture_format) | 122 GLenum texture_format) |
| 123 : client_(client), | 123 : client_(client), |
| 124 resource_pool_(ResourcePool::Create(resource_provider)), | 124 resource_pool_(ResourcePool::Create(resource_provider)), |
| 125 raster_worker_pool_(raster_worker_pool.Pass()), | 125 raster_worker_pool_(raster_worker_pool.Pass()), |
| 126 sorted_tiles_need_update_(false), | |
| 127 all_tiles_required_for_activation_have_memory_(true), | |
| 126 ever_exceeded_memory_budget_(false), | 128 ever_exceeded_memory_budget_(false), |
| 127 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 129 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 128 did_initialize_visible_tile_(false), | 130 did_initialize_visible_tile_(false), |
| 129 texture_format_(texture_format) { | 131 texture_format_(texture_format) { |
| 130 raster_worker_pool_->SetClient(this); | 132 raster_worker_pool_->SetClient(this); |
| 131 } | 133 } |
| 132 | 134 |
| 133 TileManager::~TileManager() { | 135 TileManager::~TileManager() { |
| 134 // Reset global state and manage. This should cause | 136 // Reset global state and manage. This should cause |
| 135 // our memory usage to drop to zero. | 137 // our memory usage to drop to zero. |
| 136 global_state_ = GlobalStateThatImpactsTilePriority(); | 138 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 137 AssignGpuMemoryToTiles(); | 139 DCHECK(tiles_.empty()); |
|
reveman
2013/07/04 00:46:11
DCHECK_EQ(0u, tiles_.size()) is preferred
vmpstr
2013/07/08 17:28:30
Done.
| |
| 140 | |
| 141 sorted_tiles_need_update_ = true; | |
| 142 UpdateSortedTilesIfNeeded(); | |
| 143 TileVector tiles_that_need_to_be_rasterized; | |
| 144 TileSet oom_tiles_required_for_activation; | |
| 145 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | |
| 146 &oom_tiles_required_for_activation); | |
| 147 ScheduleTasks(tiles_that_need_to_be_rasterized); | |
|
reveman
2013/07/04 00:46:11
I don't think we need to exercise all this code he
vmpstr
2013/07/08 17:28:30
Done.
| |
| 148 | |
| 138 CleanUpUnusedImageDecodeTasks(); | 149 CleanUpUnusedImageDecodeTasks(); |
| 139 // This should finish all pending tasks and release any uninitialized | 150 // This should finish all pending tasks and release any uninitialized |
| 140 // resources. | 151 // resources. |
| 141 raster_worker_pool_->Shutdown(); | 152 raster_worker_pool_->Shutdown(); |
| 142 raster_worker_pool_->CheckForCompletedTasks(); | 153 raster_worker_pool_->CheckForCompletedTasks(); |
| 143 DCHECK_EQ(0u, tiles_.size()); | |
| 144 } | 154 } |
| 145 | 155 |
| 146 void TileManager::SetGlobalState( | 156 void TileManager::SetGlobalState( |
| 147 const GlobalStateThatImpactsTilePriority& global_state) { | 157 const GlobalStateThatImpactsTilePriority& global_state) { |
| 148 global_state_ = global_state; | 158 global_state_ = global_state; |
| 149 resource_pool_->SetMaxMemoryUsageBytes( | 159 resource_pool_->SetMaxMemoryUsageBytes( |
| 150 global_state_.memory_limit_in_bytes, | 160 global_state_.memory_limit_in_bytes, |
| 151 global_state_.unused_memory_limit_in_bytes); | 161 global_state_.unused_memory_limit_in_bytes); |
| 152 } | 162 } |
| 153 | 163 |
| 154 void TileManager::RegisterTile(Tile* tile) { | 164 void TileManager::RegisterTile(Tile* tile) { |
| 155 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) == tiles_.end()); | |
| 156 DCHECK(!tile->required_for_activation()); | 165 DCHECK(!tile->required_for_activation()); |
| 157 tiles_.push_back(tile); | 166 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
| 167 | |
| 168 tiles_[tile->id()] = tile; | |
| 169 sorted_tiles_need_update_ = true; | |
| 158 } | 170 } |
| 159 | 171 |
| 160 void TileManager::UnregisterTile(Tile* tile) { | 172 void TileManager::UnregisterTile(Tile* tile) { |
| 161 TileVector::iterator raster_iter = | 173 tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| 162 std::find(tiles_that_need_to_be_rasterized_.begin(), | |
| 163 tiles_that_need_to_be_rasterized_.end(), | |
| 164 tile); | |
| 165 if (raster_iter != tiles_that_need_to_be_rasterized_.end()) | |
| 166 tiles_that_need_to_be_rasterized_.erase(raster_iter); | |
| 167 | 174 |
| 168 tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 175 FreeResourcesForTile(tile); |
| 169 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); | |
| 170 | 176 |
| 171 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end()); | 177 DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
| 172 FreeResourcesForTile(tile); | 178 tiles_.erase(tile->id()); |
| 173 tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile)); | 179 |
| 180 sorted_tiles_need_update_ = true; | |
| 174 } | 181 } |
| 175 | 182 |
| 176 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { | 183 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { |
| 177 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; | 184 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; |
| 178 } | 185 } |
| 179 | 186 |
| 187 void TileManager::UpdateSortedTilesIfNeeded() { | |
| 188 TRACE_EVENT0("cc", "TileManager::UpdateSortedTilesIfNeeded"); | |
| 189 | |
| 190 if (!sorted_tiles_need_update_) | |
| 191 return; | |
| 192 | |
| 193 sorted_tiles_.clear(); | |
| 194 AssignBinsToTiles(&sorted_tiles_); | |
| 195 SortTiles(&sorted_tiles_); | |
|
reveman
2013/07/04 00:46:11
I would prefer building the vector here and passin
vmpstr
2013/07/08 17:28:30
Done.
| |
| 196 } | |
| 197 | |
| 180 void TileManager::DidFinishedRunningTasks() { | 198 void TileManager::DidFinishedRunningTasks() { |
| 199 TRACE_EVENT0("cc", "TileManager::DidFinishedRunningTasks"); | |
| 200 | |
| 181 // When OOM, keep re-assigning memory until we reach a steady state | 201 // When OOM, keep re-assigning memory until we reach a steady state |
| 182 // where top-priority tiles are initialized. | 202 // where top-priority tiles are initialized. |
| 183 if (!memory_stats_from_last_assign_.bytes_over) | 203 if (!memory_stats_from_last_assign_.bytes_over) |
| 184 return; | 204 return; |
| 185 | 205 |
| 186 raster_worker_pool_->CheckForCompletedTasks(); | 206 raster_worker_pool_->CheckForCompletedTasks(); |
| 187 | 207 |
| 188 AssignGpuMemoryToTiles(); | 208 UpdateSortedTilesIfNeeded(); |
| 189 | 209 |
| 190 if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty()) | 210 TileVector tiles_that_need_to_be_rasterized; |
| 191 ReassignGpuMemoryToOOMTilesRequiredForActivation(); | 211 TileSet oom_tiles_required_for_activation; |
| 212 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | |
| 213 &oom_tiles_required_for_activation); | |
| 192 | 214 |
| 193 // |tiles_that_need_to_be_rasterized_| will be empty when we reach a | 215 if (!oom_tiles_required_for_activation.empty()) { |
| 216 ReassignGpuMemoryToOOMTilesRequiredForActivation( | |
| 217 &tiles_that_need_to_be_rasterized, | |
| 218 &oom_tiles_required_for_activation); | |
| 219 } | |
| 220 all_tiles_required_for_activation_have_memory_ = | |
| 221 oom_tiles_required_for_activation.empty(); | |
| 222 | |
| 223 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | |
| 194 // steady memory state. Keep scheduling tasks until we reach this state. | 224 // steady memory state. Keep scheduling tasks until we reach this state. |
| 195 if (!tiles_that_need_to_be_rasterized_.empty()) { | 225 if (!tiles_that_need_to_be_rasterized.empty()) { |
| 196 ScheduleTasks(); | 226 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 197 return; | 227 return; |
| 198 } | 228 } |
| 199 | 229 |
| 200 // Use on-demand raster for any tiles that have not been been assigned | 230 // Use on-demand raster for any tiles that have not been been assigned |
| 201 // memory after reaching a steady memory state. | 231 // memory after reaching a steady memory state. |
| 202 for (TileSet::iterator it = | 232 for (TileSet::iterator it = oom_tiles_required_for_activation.begin(); |
| 203 oom_tiles_that_need_to_be_initialized_for_activation_.begin(); | 233 it != oom_tiles_required_for_activation.end(); |
| 204 it != oom_tiles_that_need_to_be_initialized_for_activation_.end(); | |
| 205 ++it) { | 234 ++it) { |
| 206 Tile* tile = *it; | 235 Tile* tile = *it; |
| 207 ManagedTileState& mts = tile->managed_state(); | 236 ManagedTileState& mts = tile->managed_state(); |
| 208 mts.tile_versions[mts.raster_mode].set_rasterize_on_demand(); | 237 mts.tile_versions[mts.raster_mode].set_rasterize_on_demand(); |
| 209 } | 238 } |
| 210 oom_tiles_that_need_to_be_initialized_for_activation_.clear(); | |
| 211 | 239 |
| 212 DCHECK_EQ(0u, tiles_that_need_to_be_initialized_for_activation_.size()); | 240 DCHECK_EQ(0u, tiles_that_need_to_be_initialized_for_activation_.size()); |
| 213 client_->NotifyReadyToActivate(); | 241 client_->NotifyReadyToActivate(); |
| 214 } | 242 } |
| 215 | 243 |
| 216 void TileManager::DidFinishedRunningTasksRequiredForActivation() { | 244 void TileManager::DidFinishedRunningTasksRequiredForActivation() { |
| 217 // This is only a true indication that all tiles required for | 245 // This is only a true indication that all tiles required for |
| 218 // activation are initialized when no tiles are OOM. We need to | 246 // activation are initialized when no tiles are OOM. We need to |
| 219 // wait for DidFinishRunningTasks() to be called, try to re-assign | 247 // wait for DidFinishRunningTasks() to be called, try to re-assign |
| 220 // memory and in worst case use on-demand raster when tiles | 248 // memory and in worst case use on-demand raster when tiles |
| 221 // required for activation are OOM. | 249 // required for activation are OOM. |
| 222 if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty()) | 250 if (!all_tiles_required_for_activation_have_memory_) |
| 223 return; | 251 return; |
| 224 | 252 |
| 225 client_->NotifyReadyToActivate(); | 253 client_->NotifyReadyToActivate(); |
| 226 } | 254 } |
| 227 | 255 |
| 228 class BinComparator { | 256 class BinComparator { |
| 229 public: | 257 public: |
| 230 bool operator() (const Tile* a, const Tile* b) const { | 258 bool operator() (const Tile* a, const Tile* b) const { |
| 231 const ManagedTileState& ams = a->managed_state(); | 259 const ManagedTileState& ams = a->managed_state(); |
| 232 const ManagedTileState& bms = b->managed_state(); | 260 const ManagedTileState& bms = b->managed_state(); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 252 } | 280 } |
| 253 | 281 |
| 254 gfx::Rect a_rect = a->content_rect(); | 282 gfx::Rect a_rect = a->content_rect(); |
| 255 gfx::Rect b_rect = b->content_rect(); | 283 gfx::Rect b_rect = b->content_rect(); |
| 256 if (a_rect.y() != b_rect.y()) | 284 if (a_rect.y() != b_rect.y()) |
| 257 return a_rect.y() < b_rect.y(); | 285 return a_rect.y() < b_rect.y(); |
| 258 return a_rect.x() < b_rect.x(); | 286 return a_rect.x() < b_rect.x(); |
| 259 } | 287 } |
| 260 }; | 288 }; |
| 261 | 289 |
| 262 void TileManager::AssignBinsToTiles() { | 290 void TileManager::AssignBinsToTiles(TileVector* tiles) { |
| 263 const TreePriority tree_priority = global_state_.tree_priority; | 291 const TreePriority tree_priority = global_state_.tree_priority; |
| 264 | 292 |
| 265 // Memory limit policy works by mapping some bin states to the NEVER bin. | 293 // Memory limit policy works by mapping some bin states to the NEVER bin. |
| 266 TileManagerBin bin_map[NUM_BINS]; | 294 TileManagerBin bin_map[NUM_BINS]; |
| 267 if (global_state_.memory_limit_policy == ALLOW_NOTHING) { | 295 if (global_state_.memory_limit_policy == ALLOW_NOTHING) { |
| 268 bin_map[NOW_BIN] = NEVER_BIN; | 296 bin_map[NOW_BIN] = NEVER_BIN; |
| 269 bin_map[SOON_BIN] = NEVER_BIN; | 297 bin_map[SOON_BIN] = NEVER_BIN; |
| 270 bin_map[EVENTUALLY_BIN] = NEVER_BIN; | 298 bin_map[EVENTUALLY_BIN] = NEVER_BIN; |
| 271 bin_map[NEVER_BIN] = NEVER_BIN; | 299 bin_map[NEVER_BIN] = NEVER_BIN; |
| 272 } else if (global_state_.memory_limit_policy == ALLOW_ABSOLUTE_MINIMUM) { | 300 } else if (global_state_.memory_limit_policy == ALLOW_ABSOLUTE_MINIMUM) { |
| 273 bin_map[NOW_BIN] = NOW_BIN; | 301 bin_map[NOW_BIN] = NOW_BIN; |
| 274 bin_map[SOON_BIN] = NEVER_BIN; | 302 bin_map[SOON_BIN] = NEVER_BIN; |
| 275 bin_map[EVENTUALLY_BIN] = NEVER_BIN; | 303 bin_map[EVENTUALLY_BIN] = NEVER_BIN; |
| 276 bin_map[NEVER_BIN] = NEVER_BIN; | 304 bin_map[NEVER_BIN] = NEVER_BIN; |
| 277 } else if (global_state_.memory_limit_policy == ALLOW_PREPAINT_ONLY) { | 305 } else if (global_state_.memory_limit_policy == ALLOW_PREPAINT_ONLY) { |
| 278 bin_map[NOW_BIN] = NOW_BIN; | 306 bin_map[NOW_BIN] = NOW_BIN; |
| 279 bin_map[SOON_BIN] = SOON_BIN; | 307 bin_map[SOON_BIN] = SOON_BIN; |
| 280 bin_map[EVENTUALLY_BIN] = NEVER_BIN; | 308 bin_map[EVENTUALLY_BIN] = NEVER_BIN; |
| 281 bin_map[NEVER_BIN] = NEVER_BIN; | 309 bin_map[NEVER_BIN] = NEVER_BIN; |
| 282 } else { | 310 } else { |
| 283 bin_map[NOW_BIN] = NOW_BIN; | 311 bin_map[NOW_BIN] = NOW_BIN; |
| 284 bin_map[SOON_BIN] = SOON_BIN; | 312 bin_map[SOON_BIN] = SOON_BIN; |
| 285 bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN; | 313 bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN; |
| 286 bin_map[NEVER_BIN] = NEVER_BIN; | 314 bin_map[NEVER_BIN] = NEVER_BIN; |
| 287 } | 315 } |
| 288 | 316 |
| 317 DCHECK(tiles->empty()); | |
| 318 tiles->reserve(tiles_.size()); | |
| 319 | |
| 289 // For each tree, bin into different categories of tiles. | 320 // For each tree, bin into different categories of tiles. |
| 290 for (TileVector::iterator it = tiles_.begin(); | 321 for (TileMap::iterator it = tiles_.begin(); |
| 291 it != tiles_.end(); | 322 it != tiles_.end(); |
| 292 ++it) { | 323 ++it) { |
| 293 Tile* tile = *it; | 324 Tile* tile = it->second; |
| 294 ManagedTileState& mts = tile->managed_state(); | 325 ManagedTileState& mts = tile->managed_state(); |
| 295 | 326 |
| 296 TilePriority prio[NUM_BIN_PRIORITIES]; | 327 TilePriority prio[NUM_BIN_PRIORITIES]; |
| 297 switch (tree_priority) { | 328 switch (tree_priority) { |
| 298 case SAME_PRIORITY_FOR_BOTH_TREES: | 329 case SAME_PRIORITY_FOR_BOTH_TREES: |
| 299 prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] = | 330 prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] = |
| 300 tile->combined_priority(); | 331 tile->combined_priority(); |
| 301 break; | 332 break; |
| 302 case SMOOTHNESS_TAKES_PRIORITY: | 333 case SMOOTHNESS_TAKES_PRIORITY: |
| 303 prio[HIGH_PRIORITY_BIN] = tile->priority(ACTIVE_TREE); | 334 prio[HIGH_PRIORITY_BIN] = tile->priority(ACTIVE_TREE); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 327 bin_map[BinFromTilePriority( | 358 bin_map[BinFromTilePriority( |
| 328 tile->priority(ACTIVE_TREE), tree_priority)], | 359 tile->priority(ACTIVE_TREE), tree_priority)], |
| 329 ACTIVE_TREE); | 360 ACTIVE_TREE); |
| 330 DidTileTreeBinChange(tile, | 361 DidTileTreeBinChange(tile, |
| 331 bin_map[BinFromTilePriority( | 362 bin_map[BinFromTilePriority( |
| 332 tile->priority(PENDING_TREE), tree_priority)], | 363 tile->priority(PENDING_TREE), tree_priority)], |
| 333 PENDING_TREE); | 364 PENDING_TREE); |
| 334 | 365 |
| 335 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) | 366 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) |
| 336 mts.bin[i] = bin_map[mts.bin[i]]; | 367 mts.bin[i] = bin_map[mts.bin[i]]; |
| 368 | |
| 369 tiles->push_back(tile); | |
| 337 } | 370 } |
| 338 } | 371 } |
| 339 | 372 |
| 340 void TileManager::SortTiles() { | 373 void TileManager::SortTiles(TileVector* tiles) { |
| 341 TRACE_EVENT0("cc", "TileManager::SortTiles"); | 374 TRACE_EVENT0("cc", "TileManager::SortTiles"); |
| 342 | 375 |
| 343 // Sort by bin, resolution and time until needed. | 376 // Sort by bin, resolution and time until needed. |
| 344 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); | 377 std::sort(tiles->begin(), tiles->end(), BinComparator()); |
| 345 } | 378 } |
| 346 | 379 |
| 347 void TileManager::ManageTiles() { | 380 void TileManager::ManageTiles() { |
| 348 TRACE_EVENT0("cc", "TileManager::ManageTiles"); | 381 TRACE_EVENT0("cc", "TileManager::ManageTiles"); |
| 349 AssignBinsToTiles(); | 382 |
| 350 SortTiles(); | 383 // Since priorities might have changed, we need to force |
| 351 AssignGpuMemoryToTiles(); | 384 // the sorted list to be updated. |
| 385 sorted_tiles_need_update_ = true; | |
| 386 | |
| 387 UpdateSortedTilesIfNeeded(); | |
| 388 | |
| 389 TileVector tiles_that_need_to_be_rasterized; | |
| 390 TileSet oom_tiles_required_for_activation; | |
| 391 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | |
| 392 &oom_tiles_required_for_activation); | |
| 393 all_tiles_required_for_activation_have_memory_ = | |
| 394 oom_tiles_required_for_activation.empty(); | |
| 352 CleanUpUnusedImageDecodeTasks(); | 395 CleanUpUnusedImageDecodeTasks(); |
| 353 | 396 |
| 354 TRACE_EVENT_INSTANT1( | 397 TRACE_EVENT_INSTANT1( |
| 355 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, | 398 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, |
| 356 "state", TracedValue::FromValue(BasicStateAsValue().release())); | 399 "state", TracedValue::FromValue(BasicStateAsValue().release())); |
| 357 | 400 |
| 358 // Finally, schedule rasterizer tasks. | 401 // Finally, schedule rasterizer tasks. |
| 359 ScheduleTasks(); | 402 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 360 } | 403 } |
| 361 | 404 |
| 362 void TileManager::CheckForCompletedTileUploads() { | 405 void TileManager::CheckForCompletedTileUploads() { |
| 363 raster_worker_pool_->CheckForCompletedTasks(); | 406 raster_worker_pool_->CheckForCompletedTasks(); |
| 364 | 407 |
| 365 if (did_initialize_visible_tile_) { | 408 if (did_initialize_visible_tile_) { |
| 366 client_->DidInitializeVisibleTile(); | 409 client_->DidInitializeVisibleTile(); |
| 367 did_initialize_visible_tile_ = false; | 410 did_initialize_visible_tile_ = false; |
| 368 } | 411 } |
| 369 } | 412 } |
| 370 | 413 |
| 371 void TileManager::GetMemoryStats( | 414 void TileManager::GetMemoryStats( |
| 372 size_t* memory_required_bytes, | 415 size_t* memory_required_bytes, |
| 373 size_t* memory_nice_to_have_bytes, | 416 size_t* memory_nice_to_have_bytes, |
| 374 size_t* memory_used_bytes) const { | 417 size_t* memory_used_bytes) const { |
| 375 *memory_required_bytes = 0; | 418 *memory_required_bytes = 0; |
| 376 *memory_nice_to_have_bytes = 0; | 419 *memory_nice_to_have_bytes = 0; |
| 377 *memory_used_bytes = resource_pool_->acquired_memory_usage_bytes(); | 420 *memory_used_bytes = resource_pool_->acquired_memory_usage_bytes(); |
| 378 for (TileVector::const_iterator it = tiles_.begin(); | 421 for (TileMap::const_iterator it = tiles_.begin(); |
| 379 it != tiles_.end(); | 422 it != tiles_.end(); |
| 380 ++it) { | 423 ++it) { |
| 381 const Tile* tile = *it; | 424 const Tile* tile = it->second; |
| 382 const ManagedTileState& mts = tile->managed_state(); | 425 const ManagedTileState& mts = tile->managed_state(); |
| 383 | 426 |
| 384 RasterMode mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; | 427 RasterMode mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; |
| 385 if (tile->IsReadyToDraw(&mode) && | 428 if (tile->IsReadyToDraw(&mode) && |
| 386 !mts.tile_versions[mode].requires_resource()) | 429 !mts.tile_versions[mode].requires_resource()) |
| 387 continue; | 430 continue; |
| 388 | 431 |
| 389 size_t tile_bytes = tile->bytes_consumed_if_allocated(); | 432 size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
| 390 if (mts.gpu_memmgr_stats_bin == NOW_BIN) | 433 if (mts.gpu_memmgr_stats_bin == NOW_BIN) |
| 391 *memory_required_bytes += tile_bytes; | 434 *memory_required_bytes += tile_bytes; |
| 392 if (mts.gpu_memmgr_stats_bin != NEVER_BIN) | 435 if (mts.gpu_memmgr_stats_bin != NEVER_BIN) |
| 393 *memory_nice_to_have_bytes += tile_bytes; | 436 *memory_nice_to_have_bytes += tile_bytes; |
| 394 } | 437 } |
| 395 } | 438 } |
| 396 | 439 |
| 397 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const { | 440 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const { |
| 398 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 441 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 399 state->SetInteger("tile_count", tiles_.size()); | 442 state->SetInteger("tile_count", tiles_.size()); |
| 400 state->Set("global_state", global_state_.AsValue().release()); | 443 state->Set("global_state", global_state_.AsValue().release()); |
| 401 state->Set("memory_requirements", GetMemoryRequirementsAsValue().release()); | 444 state->Set("memory_requirements", GetMemoryRequirementsAsValue().release()); |
| 402 return state.PassAs<base::Value>(); | 445 return state.PassAs<base::Value>(); |
| 403 } | 446 } |
| 404 | 447 |
| 405 scoped_ptr<base::Value> TileManager::AllTilesAsValue() const { | 448 scoped_ptr<base::Value> TileManager::AllTilesAsValue() const { |
| 406 scoped_ptr<base::ListValue> state(new base::ListValue()); | 449 scoped_ptr<base::ListValue> state(new base::ListValue()); |
| 407 for (TileVector::const_iterator it = tiles_.begin(); | 450 for (TileMap::const_iterator it = tiles_.begin(); |
| 408 it != tiles_.end(); | 451 it != tiles_.end(); |
| 409 it++) { | 452 it++) { |
| 410 state->Append((*it)->AsValue().release()); | 453 state->Append(it->second->AsValue().release()); |
| 411 } | 454 } |
| 412 return state.PassAs<base::Value>(); | 455 return state.PassAs<base::Value>(); |
| 413 } | 456 } |
| 414 | 457 |
| 415 scoped_ptr<base::Value> TileManager::GetMemoryRequirementsAsValue() const { | 458 scoped_ptr<base::Value> TileManager::GetMemoryRequirementsAsValue() const { |
| 416 scoped_ptr<base::DictionaryValue> requirements( | 459 scoped_ptr<base::DictionaryValue> requirements( |
| 417 new base::DictionaryValue()); | 460 new base::DictionaryValue()); |
| 418 | 461 |
| 419 size_t memory_required_bytes; | 462 size_t memory_required_bytes; |
| 420 size_t memory_nice_to_have_bytes; | 463 size_t memory_nice_to_have_bytes; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 449 raster_mode = LOW_QUALITY_RASTER_MODE; | 492 raster_mode = LOW_QUALITY_RASTER_MODE; |
| 450 else if (tile->can_use_lcd_text()) | 493 else if (tile->can_use_lcd_text()) |
| 451 raster_mode = HIGH_QUALITY_RASTER_MODE; | 494 raster_mode = HIGH_QUALITY_RASTER_MODE; |
| 452 else if (mts.tile_versions[current_mode].has_text_ || | 495 else if (mts.tile_versions[current_mode].has_text_ || |
| 453 !mts.tile_versions[current_mode].IsReadyToDraw()) | 496 !mts.tile_versions[current_mode].IsReadyToDraw()) |
| 454 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; | 497 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; |
| 455 | 498 |
| 456 return std::min(raster_mode, current_mode); | 499 return std::min(raster_mode, current_mode); |
| 457 } | 500 } |
| 458 | 501 |
| 459 void TileManager::AssignGpuMemoryToTiles() { | 502 void TileManager::AssignGpuMemoryToTiles( |
|
reveman
2013/07/04 00:46:11
Maybe pass sorted tiles as a parameter to this fun
vmpstr
2013/07/08 17:28:30
Done.
| |
| 503 TileVector* tiles_that_need_to_be_rasterized, | |
| 504 TileSet* oom_tiles_required_for_activation) { | |
| 460 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); | 505 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| 461 | 506 |
| 462 // Now give memory out to the tiles until we're out, and build | 507 // Now give memory out to the tiles until we're out, and build |
| 463 // the needs-to-be-rasterized queue. | 508 // the needs-to-be-rasterized queue. |
| 464 tiles_that_need_to_be_rasterized_.clear(); | |
| 465 tiles_that_need_to_be_initialized_for_activation_.clear(); | 509 tiles_that_need_to_be_initialized_for_activation_.clear(); |
| 466 oom_tiles_that_need_to_be_initialized_for_activation_.clear(); | |
| 467 | 510 |
| 468 size_t bytes_releasable = 0; | 511 size_t bytes_releasable = 0; |
| 469 for (TileVector::const_iterator it = tiles_.begin(); | 512 for (TileVector::const_iterator it = sorted_tiles_.begin(); |
| 470 it != tiles_.end(); | 513 it != sorted_tiles_.end(); |
| 471 ++it) { | 514 ++it) { |
| 472 const Tile* tile = *it; | 515 const Tile* tile = *it; |
| 473 const ManagedTileState& mts = tile->managed_state(); | 516 const ManagedTileState& mts = tile->managed_state(); |
| 474 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { | 517 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| 475 if (mts.tile_versions[mode].resource_) | 518 if (mts.tile_versions[mode].resource_) |
| 476 bytes_releasable += tile->bytes_consumed_if_allocated(); | 519 bytes_releasable += tile->bytes_consumed_if_allocated(); |
| 477 } | 520 } |
| 478 } | 521 } |
| 479 | 522 |
| 480 // Cast to prevent overflow. | 523 // Cast to prevent overflow. |
| 481 int64 bytes_available = | 524 int64 bytes_available = |
| 482 static_cast<int64>(bytes_releasable) + | 525 static_cast<int64>(bytes_releasable) + |
| 483 static_cast<int64>(global_state_.memory_limit_in_bytes) - | 526 static_cast<int64>(global_state_.memory_limit_in_bytes) - |
| 484 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); | 527 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); |
| 485 | 528 |
| 486 size_t bytes_allocatable = | 529 size_t bytes_allocatable = |
| 487 std::max(static_cast<int64>(0), bytes_available); | 530 std::max(static_cast<int64>(0), bytes_available); |
| 488 | 531 |
| 489 size_t bytes_that_exceeded_memory_budget = 0; | 532 size_t bytes_that_exceeded_memory_budget = 0; |
| 490 size_t bytes_left = bytes_allocatable; | 533 size_t bytes_left = bytes_allocatable; |
| 491 size_t bytes_oom_tiles_that_need_to_be_initialized_for_activation = 0; | 534 size_t bytes_oom_tiles_that_need_to_be_initialized_for_activation = 0; |
| 492 bool higher_priority_tile_oomed = false; | 535 bool higher_priority_tile_oomed = false; |
| 493 for (TileVector::iterator it = tiles_.begin(); | 536 for (TileVector::iterator it = sorted_tiles_.begin(); |
| 494 it != tiles_.end(); | 537 it != sorted_tiles_.end(); |
| 495 ++it) { | 538 ++it) { |
| 496 Tile* tile = *it; | 539 Tile* tile = *it; |
| 497 ManagedTileState& mts = tile->managed_state(); | 540 ManagedTileState& mts = tile->managed_state(); |
| 498 | 541 |
| 499 mts.raster_mode = DetermineRasterMode(tile); | 542 mts.raster_mode = DetermineRasterMode(tile); |
| 500 | 543 |
| 501 ManagedTileState::TileVersion& tile_version = | 544 ManagedTileState::TileVersion& tile_version = |
| 502 mts.tile_versions[mts.raster_mode]; | 545 mts.tile_versions[mts.raster_mode]; |
| 503 | 546 |
| 504 // If this tile doesn't need a resource, then nothing to do. | 547 // If this tile doesn't need a resource, then nothing to do. |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 525 tile_bytes += tile->bytes_consumed_if_allocated(); | 568 tile_bytes += tile->bytes_consumed_if_allocated(); |
| 526 | 569 |
| 527 // Tile is OOM. | 570 // Tile is OOM. |
| 528 if (tile_bytes > bytes_left) { | 571 if (tile_bytes > bytes_left) { |
| 529 if (tile->required_for_activation()) { | 572 if (tile->required_for_activation()) { |
| 530 // Immediately mark tiles for on-demand raster once the amount | 573 // Immediately mark tiles for on-demand raster once the amount |
| 531 // of memory for oom tiles required for activation exceeds our | 574 // of memory for oom tiles required for activation exceeds our |
| 532 // memory limit. | 575 // memory limit. |
| 533 if (bytes_oom_tiles_that_need_to_be_initialized_for_activation < | 576 if (bytes_oom_tiles_that_need_to_be_initialized_for_activation < |
| 534 global_state_.memory_limit_in_bytes) { | 577 global_state_.memory_limit_in_bytes) { |
| 535 oom_tiles_that_need_to_be_initialized_for_activation_.insert(tile); | 578 oom_tiles_required_for_activation->insert(tile); |
| 536 bytes_oom_tiles_that_need_to_be_initialized_for_activation += | 579 bytes_oom_tiles_that_need_to_be_initialized_for_activation += |
| 537 tile_bytes; | 580 tile_bytes; |
| 538 } else { | 581 } else { |
| 539 tile_version.set_rasterize_on_demand(); | 582 tile_version.set_rasterize_on_demand(); |
| 540 } | 583 } |
| 541 } | 584 } |
| 542 FreeResourcesForTile(tile); | 585 FreeResourcesForTile(tile); |
| 543 higher_priority_tile_oomed = true; | 586 higher_priority_tile_oomed = true; |
| 544 bytes_that_exceeded_memory_budget += tile_bytes; | 587 bytes_that_exceeded_memory_budget += tile_bytes; |
| 545 continue; | 588 continue; |
| 546 } | 589 } |
| 547 | 590 |
| 548 tile_version.set_use_resource(); | 591 tile_version.set_use_resource(); |
| 549 bytes_left -= tile_bytes; | 592 bytes_left -= tile_bytes; |
| 550 | 593 |
| 551 // Tile shouldn't be rasterized if we've failed to assign | 594 // Tile shouldn't be rasterized if we've failed to assign |
| 552 // gpu memory to a higher priority tile. This is important for | 595 // gpu memory to a higher priority tile. This is important for |
| 553 // two reasons: | 596 // two reasons: |
| 554 // 1. Tile size should not impact raster priority. | 597 // 1. Tile size should not impact raster priority. |
| 555 // 2. Tile with unreleasable memory could otherwise incorrectly | 598 // 2. Tile with unreleasable memory could otherwise incorrectly |
| 556 // be added as it's not affected by |bytes_allocatable|. | 599 // be added as it's not affected by |bytes_allocatable|. |
| 557 if (higher_priority_tile_oomed) | 600 if (higher_priority_tile_oomed) |
| 558 continue; | 601 continue; |
| 559 | 602 |
| 560 if (!tile_version.resource_) | 603 if (!tile_version.resource_) |
| 561 tiles_that_need_to_be_rasterized_.push_back(tile); | 604 tiles_that_need_to_be_rasterized->push_back(tile); |
| 562 | 605 |
| 563 if (!tile->IsReadyToDraw(NULL) && | 606 if (!tile->IsReadyToDraw(NULL) && |
| 564 tile->required_for_activation()) { | 607 tile->required_for_activation()) { |
| 565 AddRequiredTileForActivation(tile); | 608 AddRequiredTileForActivation(tile); |
| 566 } | 609 } |
| 567 } | 610 } |
| 568 | 611 |
| 569 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; | 612 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; |
| 570 if (ever_exceeded_memory_budget_) { | 613 if (ever_exceeded_memory_budget_) { |
| 571 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, | 614 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
| 572 "budget", global_state_.memory_limit_in_bytes, | 615 "budget", global_state_.memory_limit_in_bytes, |
| 573 "over", bytes_that_exceeded_memory_budget); | 616 "over", bytes_that_exceeded_memory_budget); |
| 574 } | 617 } |
| 575 memory_stats_from_last_assign_.total_budget_in_bytes = | 618 memory_stats_from_last_assign_.total_budget_in_bytes = |
| 576 global_state_.memory_limit_in_bytes; | 619 global_state_.memory_limit_in_bytes; |
| 577 memory_stats_from_last_assign_.bytes_allocated = | 620 memory_stats_from_last_assign_.bytes_allocated = |
| 578 bytes_allocatable - bytes_left; | 621 bytes_allocatable - bytes_left; |
| 579 memory_stats_from_last_assign_.bytes_unreleasable = | 622 memory_stats_from_last_assign_.bytes_unreleasable = |
| 580 bytes_allocatable - bytes_releasable; | 623 bytes_allocatable - bytes_releasable; |
| 581 memory_stats_from_last_assign_.bytes_over = | 624 memory_stats_from_last_assign_.bytes_over = |
| 582 bytes_that_exceeded_memory_budget; | 625 bytes_that_exceeded_memory_budget; |
| 583 } | 626 } |
| 584 | 627 |
| 585 void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation() { | 628 void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation( |
|
reveman
2013/07/04 00:46:11
Same thing here. Maybe pass sorted tiles as a para
vmpstr
2013/07/08 17:28:30
Done.
| |
| 629 TileVector* tiles_that_need_to_be_rasterized, | |
| 630 TileSet* oom_tiles_required_for_activation) { | |
| 586 TRACE_EVENT0( | 631 TRACE_EVENT0( |
| 587 "cc", "TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation"); | 632 "cc", "TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation"); |
| 588 | 633 |
| 589 size_t bytes_oom_for_required_tiles = 0; | 634 size_t bytes_oom_for_required_tiles = 0; |
| 590 TileVector tiles_requiring_memory_but_oomed; | 635 TileVector tiles_requiring_memory_but_oomed; |
| 591 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 636 for (TileVector::iterator it = sorted_tiles_.begin(); |
| 637 it != sorted_tiles_.end(); | |
| 638 ++it) { | |
| 592 Tile* tile = *it; | 639 Tile* tile = *it; |
| 593 if (oom_tiles_that_need_to_be_initialized_for_activation_.find(tile) == | 640 if (oom_tiles_required_for_activation->find(tile) == |
| 594 oom_tiles_that_need_to_be_initialized_for_activation_.end()) | 641 oom_tiles_required_for_activation->end()) |
| 595 continue; | 642 continue; |
| 596 | 643 |
| 597 tiles_requiring_memory_but_oomed.push_back(tile); | 644 tiles_requiring_memory_but_oomed.push_back(tile); |
| 598 bytes_oom_for_required_tiles += tile->bytes_consumed_if_allocated(); | 645 bytes_oom_for_required_tiles += tile->bytes_consumed_if_allocated(); |
| 599 } | 646 } |
| 600 | 647 |
| 601 if (tiles_requiring_memory_but_oomed.empty()) | 648 if (tiles_requiring_memory_but_oomed.empty()) |
| 602 return; | 649 return; |
| 603 | 650 |
| 604 // In OOM situation, we iterate tiles_, remove the memory for active tree | 651 // In OOM situation, we iterate sorted_tiles_, remove the memory for active |
| 605 // and not the now bin. And give them to bytes_oom_for_required_tiles | 652 // tree and not the now bin. And give them to bytes_oom_for_required_tiles |
| 606 size_t bytes_freed = 0; | 653 size_t bytes_freed = 0; |
| 607 for (TileVector::reverse_iterator it = tiles_.rbegin(); | 654 for (TileVector::reverse_iterator it = sorted_tiles_.rbegin(); |
| 608 it != tiles_.rend(); ++it) { | 655 it != sorted_tiles_.rend(); |
| 656 ++it) { | |
| 609 Tile* tile = *it; | 657 Tile* tile = *it; |
| 610 ManagedTileState& mts = tile->managed_state(); | 658 ManagedTileState& mts = tile->managed_state(); |
| 611 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN && | 659 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN && |
| 612 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) { | 660 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) { |
| 613 ManagedTileState::TileVersion& tile_version = | 661 ManagedTileState::TileVersion& tile_version = |
| 614 mts.tile_versions[mts.raster_mode]; | 662 mts.tile_versions[mts.raster_mode]; |
| 615 | 663 |
| 616 // If the tile is in the to-rasterize list, but it has no task, | 664 // If the tile is in the to-rasterize list, but it has no task, |
| 617 // then it means that we have assigned memory for it. | 665 // then it means that we have assigned memory for it. |
| 618 TileVector::iterator raster_it = | 666 TileVector::iterator raster_it = |
| 619 std::find(tiles_that_need_to_be_rasterized_.begin(), | 667 std::find(tiles_that_need_to_be_rasterized->begin(), |
| 620 tiles_that_need_to_be_rasterized_.end(), | 668 tiles_that_need_to_be_rasterized->end(), |
| 621 tile); | 669 tile); |
| 622 if (raster_it != tiles_that_need_to_be_rasterized_.end() && | 670 if (raster_it != tiles_that_need_to_be_rasterized->end() && |
| 623 tile_version.raster_task_.is_null()) { | 671 tile_version.raster_task_.is_null()) { |
| 624 bytes_freed += tile->bytes_consumed_if_allocated(); | 672 bytes_freed += tile->bytes_consumed_if_allocated(); |
| 625 tiles_that_need_to_be_rasterized_.erase(raster_it); | 673 tiles_that_need_to_be_rasterized->erase(raster_it); |
| 626 } | 674 } |
| 627 | 675 |
| 628 // Also consider all of the completed resources for freeing. | 676 // Also consider all of the completed resources for freeing. |
| 629 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { | 677 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| 630 if (mts.tile_versions[mode].resource_) { | 678 if (mts.tile_versions[mode].resource_) { |
| 631 DCHECK(!tile->required_for_activation()); | 679 DCHECK(!tile->required_for_activation()); |
| 632 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); | 680 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); |
| 633 bytes_freed += tile->bytes_consumed_if_allocated(); | 681 bytes_freed += tile->bytes_consumed_if_allocated(); |
| 634 } | 682 } |
| 635 } | 683 } |
| 636 } | 684 } |
| 637 | 685 |
| 638 if (bytes_oom_for_required_tiles <= bytes_freed) | 686 if (bytes_oom_for_required_tiles <= bytes_freed) |
| 639 break; | 687 break; |
| 640 } | 688 } |
| 641 | 689 |
| 642 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin(); | 690 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin(); |
| 643 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0; | 691 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0; |
| 644 ++it) { | 692 ++it) { |
| 645 Tile* tile = *it; | 693 Tile* tile = *it; |
| 646 ManagedTileState& mts = tile->managed_state(); | 694 ManagedTileState& mts = tile->managed_state(); |
| 647 size_t bytes_needed = tile->bytes_consumed_if_allocated(); | 695 size_t bytes_needed = tile->bytes_consumed_if_allocated(); |
| 648 if (bytes_needed > bytes_freed) | 696 if (bytes_needed > bytes_freed) |
| 649 continue; | 697 continue; |
| 650 mts.tile_versions[mts.raster_mode].set_use_resource(); | 698 mts.tile_versions[mts.raster_mode].set_use_resource(); |
| 651 bytes_freed -= bytes_needed; | 699 bytes_freed -= bytes_needed; |
| 652 tiles_that_need_to_be_rasterized_.push_back(tile); | 700 tiles_that_need_to_be_rasterized->push_back(tile); |
| 653 DCHECK(tile->required_for_activation()); | 701 DCHECK(tile->required_for_activation()); |
| 654 AddRequiredTileForActivation(tile); | 702 AddRequiredTileForActivation(tile); |
| 655 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 703 oom_tiles_required_for_activation->erase(tile); |
| 656 } | 704 } |
| 657 } | 705 } |
| 658 | 706 |
| 659 void TileManager::CleanUpUnusedImageDecodeTasks() { | 707 void TileManager::CleanUpUnusedImageDecodeTasks() { |
| 660 // Calculate a set of layers that are used by at least one tile. | 708 // Calculate a set of layers that are used by at least one tile. |
| 661 base::hash_set<int> used_layers; | 709 base::hash_set<int> used_layers; |
| 662 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) | 710 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) |
|
reveman
2013/07/04 00:46:11
maybe use sorted tiles here as that will likely be
vmpstr
2013/07/08 17:28:30
I prefer to keep it as is, since tiles_ is the aut
| |
| 663 used_layers.insert((*it)->layer_id()); | 711 used_layers.insert(it->second->layer_id()); |
| 664 | 712 |
| 665 // Now calculate the set of layers in |image_decode_tasks_| that are not used | 713 // Now calculate the set of layers in |image_decode_tasks_| that are not used |
| 666 // by any tile. | 714 // by any tile. |
| 667 std::vector<int> unused_layers; | 715 std::vector<int> unused_layers; |
| 668 for (LayerPixelRefTaskMap::iterator it = image_decode_tasks_.begin(); | 716 for (LayerPixelRefTaskMap::iterator it = image_decode_tasks_.begin(); |
| 669 it != image_decode_tasks_.end(); | 717 it != image_decode_tasks_.end(); |
| 670 ++it) { | 718 ++it) { |
| 671 if (used_layers.find(it->first) == used_layers.end()) | 719 if (used_layers.find(it->first) == used_layers.end()) |
| 672 unused_layers.push_back(it->first); | 720 unused_layers.push_back(it->first); |
| 673 } | 721 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 696 | 744 |
| 697 void TileManager::FreeUnusedResourcesForTile(Tile* tile) { | 745 void TileManager::FreeUnusedResourcesForTile(Tile* tile) { |
| 698 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE; | 746 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE; |
| 699 bool version_is_used = tile->IsReadyToDraw(&used_mode); | 747 bool version_is_used = tile->IsReadyToDraw(&used_mode); |
| 700 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { | 748 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| 701 if (!version_is_used || mode != used_mode) | 749 if (!version_is_used || mode != used_mode) |
| 702 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); | 750 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); |
| 703 } | 751 } |
| 704 } | 752 } |
| 705 | 753 |
| 706 void TileManager::ScheduleTasks() { | 754 void TileManager::ScheduleTasks( |
| 755 const TileVector& tiles_that_need_to_be_rasterized) { | |
| 707 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", | 756 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", |
| 708 "count", tiles_that_need_to_be_rasterized_.size()); | 757 "count", tiles_that_need_to_be_rasterized.size()); |
| 709 RasterWorkerPool::RasterTask::Queue tasks; | 758 RasterWorkerPool::RasterTask::Queue tasks; |
| 710 | 759 |
| 711 // Build a new task queue containing all task currently needed. Tasks | 760 // Build a new task queue containing all task currently needed. Tasks |
| 712 // are added in order of priority, highest priority task first. | 761 // are added in order of priority, highest priority task first. |
| 713 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); | 762 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
| 714 it != tiles_that_need_to_be_rasterized_.end(); | 763 it != tiles_that_need_to_be_rasterized.end(); |
| 715 ++it) { | 764 ++it) { |
| 716 Tile* tile = *it; | 765 Tile* tile = *it; |
| 717 ManagedTileState& mts = tile->managed_state(); | 766 ManagedTileState& mts = tile->managed_state(); |
| 718 ManagedTileState::TileVersion& tile_version = | 767 ManagedTileState::TileVersion& tile_version = |
| 719 mts.tile_versions[mts.raster_mode]; | 768 mts.tile_versions[mts.raster_mode]; |
| 720 | 769 |
| 721 DCHECK(tile_version.requires_resource()); | 770 DCHECK(tile_version.requires_resource()); |
| 722 DCHECK(!tile_version.resource_); | 771 DCHECK(!tile_version.resource_); |
| 723 | 772 |
| 724 if (tile_version.raster_task_.is_null()) | 773 if (tile_version.raster_task_.is_null()) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 794 return RasterWorkerPool::CreateRasterTask( | 843 return RasterWorkerPool::CreateRasterTask( |
| 795 const_resource, | 844 const_resource, |
| 796 tile->picture_pile(), | 845 tile->picture_pile(), |
| 797 tile->content_rect(), | 846 tile->content_rect(), |
| 798 tile->contents_scale(), | 847 tile->contents_scale(), |
| 799 mts.raster_mode, | 848 mts.raster_mode, |
| 800 metadata, | 849 metadata, |
| 801 rendering_stats_instrumentation_, | 850 rendering_stats_instrumentation_, |
| 802 base::Bind(&TileManager::OnRasterTaskCompleted, | 851 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 803 base::Unretained(this), | 852 base::Unretained(this), |
| 804 make_scoped_refptr(tile), | 853 tile->id(), |
| 805 base::Passed(&resource), | 854 base::Passed(&resource), |
| 806 mts.raster_mode), | 855 mts.raster_mode), |
| 807 &decode_tasks); | 856 &decode_tasks); |
| 808 } | 857 } |
| 809 | 858 |
| 810 void TileManager::OnImageDecodeTaskCompleted( | 859 void TileManager::OnImageDecodeTaskCompleted( |
| 811 int layer_id, | 860 int layer_id, |
| 812 skia::LazyPixelRef* pixel_ref, | 861 skia::LazyPixelRef* pixel_ref, |
| 813 bool was_canceled) { | 862 bool was_canceled) { |
| 814 // If the task was canceled, we need to clean it up | 863 // If the task was canceled, we need to clean it up |
| 815 // from |image_decode_tasks_|. | 864 // from |image_decode_tasks_|. |
| 816 if (!was_canceled) | 865 if (!was_canceled) |
| 817 return; | 866 return; |
| 818 | 867 |
| 819 LayerPixelRefTaskMap::iterator layer_it = | 868 LayerPixelRefTaskMap::iterator layer_it = |
| 820 image_decode_tasks_.find(layer_id); | 869 image_decode_tasks_.find(layer_id); |
| 821 | 870 |
| 822 if (layer_it == image_decode_tasks_.end()) | 871 if (layer_it == image_decode_tasks_.end()) |
| 823 return; | 872 return; |
| 824 | 873 |
| 825 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; | 874 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; |
| 826 PixelRefTaskMap::iterator task_it = | 875 PixelRefTaskMap::iterator task_it = |
| 827 pixel_ref_tasks.find(pixel_ref->getGenerationID()); | 876 pixel_ref_tasks.find(pixel_ref->getGenerationID()); |
| 828 | 877 |
| 829 if (task_it != pixel_ref_tasks.end()) | 878 if (task_it != pixel_ref_tasks.end()) |
| 830 pixel_ref_tasks.erase(task_it); | 879 pixel_ref_tasks.erase(task_it); |
| 831 } | 880 } |
| 832 | 881 |
| 833 void TileManager::OnRasterTaskCompleted( | 882 void TileManager::OnRasterTaskCompleted( |
| 834 scoped_refptr<Tile> tile, | 883 ManagedTileId managed_id, |
| 835 scoped_ptr<ResourcePool::Resource> resource, | 884 scoped_ptr<ResourcePool::Resource> resource, |
| 836 RasterMode raster_mode, | 885 RasterMode raster_mode, |
| 837 const PicturePileImpl::Analysis& analysis, | 886 const PicturePileImpl::Analysis& analysis, |
| 838 bool was_canceled) { | 887 bool was_canceled) { |
| 839 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", | 888 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", |
| 840 "was_canceled", was_canceled); | 889 "was_canceled", was_canceled); |
| 841 | 890 |
| 891 TileMap::iterator tile_iter = tiles_.find(managed_id); | |
|
reveman
2013/07/04 00:46:11
TileMap::iterator it = tiles_.fi.. ?
vmpstr
2013/07/08 17:28:30
Done.
| |
| 892 if (tile_iter == tiles_.end()) { | |
| 893 resource_pool_->ReleaseResource(resource.Pass()); | |
| 894 return; | |
| 895 } | |
| 896 | |
| 897 Tile* tile = tile_iter->second; | |
| 842 ManagedTileState& mts = tile->managed_state(); | 898 ManagedTileState& mts = tile->managed_state(); |
| 843 ManagedTileState::TileVersion& tile_version = | 899 ManagedTileState::TileVersion& tile_version = |
| 844 mts.tile_versions[raster_mode]; | 900 mts.tile_versions[raster_mode]; |
| 845 DCHECK(!tile_version.raster_task_.is_null()); | 901 DCHECK(!tile_version.raster_task_.is_null()); |
| 846 tile_version.raster_task_.Reset(); | 902 tile_version.raster_task_.Reset(); |
| 847 | 903 |
| 848 if (was_canceled) { | 904 if (was_canceled) { |
| 849 resource_pool_->ReleaseResource(resource.Pass()); | 905 resource_pool_->ReleaseResource(resource.Pass()); |
| 850 return; | 906 return; |
| 851 } | 907 } |
| 852 | 908 |
| 853 tile_version.set_has_text(analysis.has_text); | 909 tile_version.set_has_text(analysis.has_text); |
| 854 if (analysis.is_solid_color) { | 910 if (analysis.is_solid_color) { |
| 855 tile_version.set_solid_color(analysis.solid_color); | 911 tile_version.set_solid_color(analysis.solid_color); |
| 856 resource_pool_->ReleaseResource(resource.Pass()); | 912 resource_pool_->ReleaseResource(resource.Pass()); |
| 857 } else { | 913 } else { |
| 858 tile_version.resource_ = resource.Pass(); | 914 tile_version.resource_ = resource.Pass(); |
| 859 } | 915 } |
| 860 | 916 |
| 861 FreeUnusedResourcesForTile(tile.get()); | 917 FreeUnusedResourcesForTile(tile); |
| 862 | 918 |
| 863 DidFinishTileInitialization(tile.get()); | 919 DidFinishTileInitialization(tile); |
| 864 } | 920 } |
| 865 | 921 |
| 866 void TileManager::DidFinishTileInitialization(Tile* tile) { | 922 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 867 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 923 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
| 868 did_initialize_visible_tile_ = true; | 924 did_initialize_visible_tile_ = true; |
| 869 if (tile->required_for_activation()) { | 925 if (tile->required_for_activation()) { |
| 870 // It's possible that a tile required for activation is not in this list | 926 // It's possible that a tile required for activation is not in this list |
| 871 // if it was marked as being required after being dispatched for | 927 // if it was marked as being required after being dispatched for |
| 872 // rasterization but before AssignGPUMemory was called again. | 928 // rasterization but before AssignGPUMemory was called again. |
| 873 tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 929 tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
|
reveman
2013/07/04 00:46:11
we don't need this anymore. you can just set all_t
vmpstr
2013/07/08 17:28:30
Done.
| |
| 874 } | 930 } |
| 875 } | 931 } |
| 876 | 932 |
| 877 void TileManager::DidTileTreeBinChange(Tile* tile, | 933 void TileManager::DidTileTreeBinChange(Tile* tile, |
| 878 TileManagerBin new_tree_bin, | 934 TileManagerBin new_tree_bin, |
| 879 WhichTree tree) { | 935 WhichTree tree) { |
| 880 ManagedTileState& mts = tile->managed_state(); | 936 ManagedTileState& mts = tile->managed_state(); |
| 881 mts.tree_bin[tree] = new_tree_bin; | 937 mts.tree_bin[tree] = new_tree_bin; |
| 882 } | 938 } |
| 883 | 939 |
| 884 } // namespace cc | 940 } // namespace cc |
| OLD | NEW |