| 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/tile_manager.h" | 5 #include "cc/tile_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 return EVENTUALLY_BIN; | 66 return EVENTUALLY_BIN; |
| 67 } | 67 } |
| 68 | 68 |
| 69 std::string ValueToString(scoped_ptr<base::Value> value) | 69 std::string ValueToString(scoped_ptr<base::Value> value) |
| 70 { | 70 { |
| 71 std::string str; | 71 std::string str; |
| 72 base::JSONWriter::Write(value.get(), &str); | 72 base::JSONWriter::Write(value.get(), &str); |
| 73 return str; | 73 return str; |
| 74 } | 74 } |
| 75 | 75 |
| 76 RasterTaskMetadata GetRasterTaskMetadata(const ManagedTileState& mts) { | 76 RasterTaskMetadata GetRasterTaskMetadata(const ManagedTileState* mts) { |
| 77 RasterTaskMetadata raster_task_metadata; | 77 RasterTaskMetadata raster_task_metadata; |
| 78 raster_task_metadata.is_tile_in_pending_tree_now_bin = | 78 raster_task_metadata.is_tile_in_pending_tree_now_bin = |
| 79 mts.tree_bin[PENDING_TREE] == NOW_BIN; | 79 mts->tree_bin[PENDING_TREE] == NOW_BIN; |
| 80 raster_task_metadata.tile_resolution = mts.resolution; | 80 raster_task_metadata.tile_resolution = mts->resolution; |
| 81 return raster_task_metadata; | 81 return raster_task_metadata; |
| 82 } | 82 } |
| 83 | 83 |
| 84 } // namespace | 84 } // namespace |
| 85 | 85 |
| 86 scoped_ptr<base::Value> TileManagerBinAsValue(TileManagerBin bin) { | 86 scoped_ptr<base::Value> TileManagerBinAsValue(TileManagerBin bin) { |
| 87 switch (bin) { | 87 switch (bin) { |
| 88 case NOW_BIN: | 88 case NOW_BIN: |
| 89 return scoped_ptr<base::Value>(base::Value::CreateStringValue( | 89 return scoped_ptr<base::Value>(base::Value::CreateStringValue( |
| 90 "NOW_BIN")); | 90 "NOW_BIN")); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 case SET_PIXELS_STATE: | 135 case SET_PIXELS_STATE: |
| 136 return scoped_ptr<base::Value>(base::Value::CreateStringValue( | 136 return scoped_ptr<base::Value>(base::Value::CreateStringValue( |
| 137 "SET_PIXELS_STATE")); | 137 "SET_PIXELS_STATE")); |
| 138 default: | 138 default: |
| 139 DCHECK(false) << "Unrecognized TileRasterState value"; | 139 DCHECK(false) << "Unrecognized TileRasterState value"; |
| 140 return scoped_ptr<base::Value>(base::Value::CreateStringValue( | 140 return scoped_ptr<base::Value>(base::Value::CreateStringValue( |
| 141 "<unknown TileRasterState value>")); | 141 "<unknown TileRasterState value>")); |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 | 144 |
| 145 ManagedTileState::ManagedTileState() | 145 ManagedTileState::ManagedTileState(Tile* tile) |
| 146 : can_use_gpu_memory(false), | 146 : tile(tile), |
| 147 can_use_gpu_memory(false), |
| 147 can_be_freed(true), | 148 can_be_freed(true), |
| 148 resource_is_being_initialized(false), | 149 resource_is_being_initialized(false), |
| 149 contents_swizzled(false), | 150 contents_swizzled(false), |
| 150 need_to_gather_pixel_refs(true), | 151 need_to_gather_pixel_refs(true), |
| 151 gpu_memmgr_stats_bin(NEVER_BIN), | 152 gpu_memmgr_stats_bin(NEVER_BIN), |
| 152 raster_state(IDLE_STATE), | 153 raster_state(IDLE_STATE), |
| 153 resolution(NON_IDEAL_RESOLUTION), | 154 resolution(NON_IDEAL_RESOLUTION), |
| 154 time_to_needed_in_seconds(std::numeric_limits<float>::infinity()), | 155 time_to_needed_in_seconds(std::numeric_limits<float>::infinity()), |
| 155 distance_to_visible_in_pixels(std::numeric_limits<float>::infinity()) { | 156 distance_to_visible_in_pixels(std::numeric_limits<float>::infinity()) { |
| 156 for (int i = 0; i < NUM_TREES; ++i) { | 157 for (int i = 0; i < NUM_TREES; ++i) { |
| 157 tree_bin[i] = NEVER_BIN; | 158 tree_bin[i] = NEVER_BIN; |
| 158 bin[i] = NEVER_BIN; | 159 bin[i] = NEVER_BIN; |
| 159 } | 160 } |
| 161 tile->tile_manager()->RegisterManagedTile(this); |
| 160 } | 162 } |
| 161 | 163 |
| 162 ManagedTileState::~ManagedTileState() { | 164 ManagedTileState::~ManagedTileState() { |
| 165 tile->tile_manager()->UnregisterManagedTile(this); |
| 163 DCHECK(!resource); | 166 DCHECK(!resource); |
| 164 DCHECK(!resource_is_being_initialized); | 167 DCHECK(!resource_is_being_initialized); |
| 165 } | 168 } |
| 166 | 169 |
| 167 scoped_ptr<base::Value> ManagedTileState::AsValue() const { | 170 scoped_ptr<base::Value> ManagedTileState::AsValue() const { |
| 168 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 171 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 169 state->SetBoolean("can_use_gpu_memory", can_use_gpu_memory); | 172 state->SetBoolean("can_use_gpu_memory", can_use_gpu_memory); |
| 170 state->SetBoolean("can_be_freed", can_be_freed); | 173 state->SetBoolean("can_be_freed", can_be_freed); |
| 171 state->SetBoolean("has_resource", resource.get() != 0); | 174 state->SetBoolean("has_resource", resource.get() != 0); |
| 172 state->SetBoolean("resource_is_being_initialized", resource_is_being_initializ
ed); | 175 state->SetBoolean("resource_is_being_initialized", resource_is_being_initializ
ed); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 DCHECK_EQ(live_or_allocated_tiles_.size(), 0); | 220 DCHECK_EQ(live_or_allocated_tiles_.size(), 0); |
| 218 } | 221 } |
| 219 | 222 |
| 220 void TileManager::SetGlobalState( | 223 void TileManager::SetGlobalState( |
| 221 const GlobalStateThatImpactsTilePriority& global_state) { | 224 const GlobalStateThatImpactsTilePriority& global_state) { |
| 222 global_state_ = global_state; | 225 global_state_ = global_state; |
| 223 resource_pool_->SetMaxMemoryUsageBytes(global_state_.memory_limit_in_bytes); | 226 resource_pool_->SetMaxMemoryUsageBytes(global_state_.memory_limit_in_bytes); |
| 224 ScheduleManageTiles(); | 227 ScheduleManageTiles(); |
| 225 } | 228 } |
| 226 | 229 |
| 227 void TileManager::RegisterTile(Tile* tile) { | 230 scoped_refptr<ManagedTileState> TileManager::RegisterTile(Tile* tile) { |
| 228 all_tiles_.insert(tile); | 231 if (!tile->managed_state_) { |
| 232 tile->managed_state_ = new ManagedTileState(tile); |
| 233 return make_scoped_refptr(tile->managed_state_); |
| 234 } |
| 235 return tile->managed_state_; |
| 236 } |
| 229 | 237 |
| 230 const ManagedTileState& mts = tile->managed_state(); | 238 void TileManager::RegisterManagedTile(ManagedTileState* mts) { |
| 239 all_tiles_.insert(mts); |
| 231 for (int i = 0; i < NUM_TREES; ++i) | 240 for (int i = 0; i < NUM_TREES; ++i) |
| 232 ++raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; | 241 ++raster_state_count_[mts->raster_state][i][mts->tree_bin[i]]; |
| 233 | 242 |
| 234 ScheduleManageTiles(); | 243 ScheduleManageTiles(); |
| 235 } | 244 } |
| 236 | 245 |
| 237 void TileManager::UnregisterTile(Tile* tile) { | 246 void TileManager::UnregisterManagedTile(ManagedTileState* mts) { |
| 238 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); | 247 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| 239 it != tiles_with_image_decoding_tasks_.end(); it++) { | 248 it != tiles_with_image_decoding_tasks_.end(); it++) { |
| 240 if (*it == tile) { | 249 if (*it == mts) { |
| 241 tiles_with_image_decoding_tasks_.erase(it); | 250 tiles_with_image_decoding_tasks_.erase(it); |
| 242 break; | 251 break; |
| 243 } | 252 } |
| 244 } | 253 } |
| 245 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); | 254 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); |
| 246 it != tiles_that_need_to_be_rasterized_.end(); it++) { | 255 it != tiles_that_need_to_be_rasterized_.end(); it++) { |
| 247 if (*it == tile) { | 256 if (*it == mts) { |
| 248 tiles_that_need_to_be_rasterized_.erase(it); | 257 tiles_that_need_to_be_rasterized_.erase(it); |
| 249 break; | 258 break; |
| 250 } | 259 } |
| 251 } | 260 } |
| 252 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); | 261 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); |
| 253 it != live_or_allocated_tiles_.end(); it++) { | 262 it != live_or_allocated_tiles_.end(); it++) { |
| 254 if (*it == tile) { | 263 if (*it == mts) { |
| 255 live_or_allocated_tiles_.erase(it); | 264 live_or_allocated_tiles_.erase(it); |
| 256 break; | 265 break; |
| 257 } | 266 } |
| 258 } | 267 } |
| 259 TileSet::iterator it = all_tiles_.find(tile); | 268 TileSet::iterator it = all_tiles_.find(mts); |
| 260 DCHECK(it != all_tiles_.end()); | 269 DCHECK(it != all_tiles_.end()); |
| 261 const ManagedTileState& mts = tile->managed_state(); | |
| 262 for (int i = 0; i < NUM_TREES; ++i) | 270 for (int i = 0; i < NUM_TREES; ++i) |
| 263 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; | 271 --raster_state_count_[mts->raster_state][i][mts->tree_bin[i]]; |
| 264 FreeResourcesForTile(tile); | 272 FreeResourcesForTile(mts); |
| 265 all_tiles_.erase(it); | 273 all_tiles_.erase(it); |
| 274 mts->tile->managed_state_ = NULL; |
| 275 mts->tile = NULL; |
| 266 } | 276 } |
| 267 | 277 |
| 268 class BinComparator { | 278 class BinComparator { |
| 269 public: | 279 public: |
| 270 bool operator() (const Tile* a, const Tile* b) const { | 280 bool operator() (const ManagedTileState* ams, |
| 271 const ManagedTileState& ams = a->managed_state(); | 281 const ManagedTileState* bms) const { |
| 272 const ManagedTileState& bms = b->managed_state(); | 282 if (ams->bin[HIGH_PRIORITY_BIN] != bms->bin[HIGH_PRIORITY_BIN]) |
| 273 if (ams.bin[HIGH_PRIORITY_BIN] != bms.bin[HIGH_PRIORITY_BIN]) | 283 return ams->bin[HIGH_PRIORITY_BIN] < bms->bin[HIGH_PRIORITY_BIN]; |
| 274 return ams.bin[HIGH_PRIORITY_BIN] < bms.bin[HIGH_PRIORITY_BIN]; | |
| 275 | 284 |
| 276 if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN]) | 285 if (ams->bin[LOW_PRIORITY_BIN] != bms->bin[LOW_PRIORITY_BIN]) |
| 277 return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN]; | 286 return ams->bin[LOW_PRIORITY_BIN] < bms->bin[LOW_PRIORITY_BIN]; |
| 278 | 287 |
| 279 if (ams.resolution != bms.resolution) | 288 if (ams->resolution != bms->resolution) |
| 280 return ams.resolution < bms.resolution; | 289 return ams->resolution < bms->resolution; |
| 281 | 290 |
| 282 if (ams.time_to_needed_in_seconds != bms.time_to_needed_in_seconds) | 291 if (ams->time_to_needed_in_seconds != bms->time_to_needed_in_seconds) |
| 283 return ams.time_to_needed_in_seconds < bms.time_to_needed_in_seconds; | 292 return ams->time_to_needed_in_seconds < bms->time_to_needed_in_seconds; |
| 284 | 293 |
| 285 if (ams.distance_to_visible_in_pixels != bms.distance_to_visible_in_pixels) | 294 if (ams->distance_to_visible_in_pixels != bms->distance_to_visible_in_pixels
) |
| 286 return ams.distance_to_visible_in_pixels < bms.distance_to_visible_in_pixe
ls; | 295 return ams->distance_to_visible_in_pixels < bms->distance_to_visible_in_pi
xels; |
| 287 | 296 |
| 288 gfx::Rect a_rect = a->content_rect(); | 297 gfx::Rect a_rect = ams->tile->content_rect(); |
| 289 gfx::Rect b_rect = b->content_rect(); | 298 gfx::Rect b_rect = bms->tile->content_rect(); |
| 290 if (a_rect.y() != b_rect.y()) | 299 if (a_rect.y() != b_rect.y()) |
| 291 return a_rect.y() < b_rect.y(); | 300 return a_rect.y() < b_rect.y(); |
| 292 return a_rect.x() < b_rect.x(); | 301 return a_rect.x() < b_rect.x(); |
| 293 } | 302 } |
| 294 }; | 303 }; |
| 295 | 304 |
| 296 void TileManager::SortTiles() { | 305 void TileManager::SortTiles() { |
| 297 TRACE_EVENT0("cc", "TileManager::SortTiles"); | 306 TRACE_EVENT0("cc", "TileManager::SortTiles"); |
| 298 TRACE_COUNTER_ID1("cc", "LiveTileCount", this, live_or_allocated_tiles_.size()
); | 307 TRACE_COUNTER_ID1("cc", "LiveTileCount", this, live_or_allocated_tiles_.size()
); |
| 299 | 308 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 bin_map[NOW_BIN] = NOW_BIN; | 340 bin_map[NOW_BIN] = NOW_BIN; |
| 332 bin_map[SOON_BIN] = SOON_BIN; | 341 bin_map[SOON_BIN] = SOON_BIN; |
| 333 bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN; | 342 bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN; |
| 334 bin_map[NEVER_BIN] = NEVER_BIN; | 343 bin_map[NEVER_BIN] = NEVER_BIN; |
| 335 } | 344 } |
| 336 | 345 |
| 337 live_or_allocated_tiles_.clear(); | 346 live_or_allocated_tiles_.clear(); |
| 338 // For each tree, bin into different categories of tiles. | 347 // For each tree, bin into different categories of tiles. |
| 339 for (TileSet::iterator it = all_tiles_.begin(); | 348 for (TileSet::iterator it = all_tiles_.begin(); |
| 340 it != all_tiles_.end(); ++it) { | 349 it != all_tiles_.end(); ++it) { |
| 341 Tile* tile = *it; | 350 ManagedTileState* mts = *it; |
| 342 ManagedTileState& mts = tile->managed_state(); | |
| 343 | 351 |
| 344 TilePriority prio[NUM_BIN_PRIORITIES]; | 352 TilePriority prio[NUM_BIN_PRIORITIES]; |
| 345 switch (tree_priority) { | 353 switch (tree_priority) { |
| 346 case SAME_PRIORITY_FOR_BOTH_TREES: | 354 case SAME_PRIORITY_FOR_BOTH_TREES: |
| 347 prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] = | 355 prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] = |
| 348 tile->combined_priority(); | 356 mts->tile->combined_priority(); |
| 349 break; | 357 break; |
| 350 case SMOOTHNESS_TAKES_PRIORITY: | 358 case SMOOTHNESS_TAKES_PRIORITY: |
| 351 prio[HIGH_PRIORITY_BIN] = tile->priority(ACTIVE_TREE); | 359 prio[HIGH_PRIORITY_BIN] = mts->tile->priority(ACTIVE_TREE); |
| 352 prio[LOW_PRIORITY_BIN] = tile->priority(PENDING_TREE); | 360 prio[LOW_PRIORITY_BIN] = mts->tile->priority(PENDING_TREE); |
| 353 break; | 361 break; |
| 354 case NEW_CONTENT_TAKES_PRIORITY: | 362 case NEW_CONTENT_TAKES_PRIORITY: |
| 355 prio[HIGH_PRIORITY_BIN] = tile->priority(PENDING_TREE); | 363 prio[HIGH_PRIORITY_BIN] = mts->tile->priority(PENDING_TREE); |
| 356 prio[LOW_PRIORITY_BIN] = tile->priority(ACTIVE_TREE); | 364 prio[LOW_PRIORITY_BIN] = mts->tile->priority(ACTIVE_TREE); |
| 357 break; | 365 break; |
| 358 } | 366 } |
| 359 | 367 |
| 360 mts.resolution = prio[HIGH_PRIORITY_BIN].resolution; | 368 mts->resolution = prio[HIGH_PRIORITY_BIN].resolution; |
| 361 mts.time_to_needed_in_seconds = | 369 mts->time_to_needed_in_seconds = |
| 362 prio[HIGH_PRIORITY_BIN].time_to_visible_in_seconds; | 370 prio[HIGH_PRIORITY_BIN].time_to_visible_in_seconds; |
| 363 mts.distance_to_visible_in_pixels = | 371 mts->distance_to_visible_in_pixels = |
| 364 prio[HIGH_PRIORITY_BIN].distance_to_visible_in_pixels; | 372 prio[HIGH_PRIORITY_BIN].distance_to_visible_in_pixels; |
| 365 mts.bin[HIGH_PRIORITY_BIN] = BinFromTilePriority(prio[HIGH_PRIORITY_BIN]); | 373 mts->bin[HIGH_PRIORITY_BIN] = BinFromTilePriority(prio[HIGH_PRIORITY_BIN]); |
| 366 mts.bin[LOW_PRIORITY_BIN] = BinFromTilePriority(prio[LOW_PRIORITY_BIN]); | 374 mts->bin[LOW_PRIORITY_BIN] = BinFromTilePriority(prio[LOW_PRIORITY_BIN]); |
| 367 mts.gpu_memmgr_stats_bin = BinFromTilePriority(tile->combined_priority()); | 375 mts->gpu_memmgr_stats_bin = BinFromTilePriority( |
| 376 mts->tile->combined_priority()); |
| 368 | 377 |
| 369 DidTileTreeBinChange(tile, | 378 DidTileTreeBinChange( |
| 370 BinFromTilePriority(tile->priority(ACTIVE_TREE)), | 379 mts, |
| 380 BinFromTilePriority(mts->tile->priority(ACTIVE_TREE)), |
| 381 ACTIVE_TREE); |
| 382 DidTileTreeBinChange( |
| 383 mts, |
| 384 BinFromTilePriority(mts->tile->priority(PENDING_TREE)), |
| 385 PENDING_TREE); |
| 386 |
| 387 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) |
| 388 mts->bin[i] = bin_map[mts->bin[i]]; |
| 389 |
| 390 DidTileTreeBinChange(mts, bin_map[mts->tree_bin[ACTIVE_TREE]], |
| 371 ACTIVE_TREE); | 391 ACTIVE_TREE); |
| 372 DidTileTreeBinChange(tile, | 392 DidTileTreeBinChange(mts, bin_map[mts->tree_bin[PENDING_TREE]], |
| 373 BinFromTilePriority(tile->priority(PENDING_TREE)), | |
| 374 PENDING_TREE); | 393 PENDING_TREE); |
| 375 | 394 |
| 376 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) | 395 if (mts->tile->priority(ACTIVE_TREE).is_live || |
| 377 mts.bin[i] = bin_map[mts.bin[i]]; | 396 mts->tile->priority(PENDING_TREE).is_live || |
| 378 | 397 mts->resource || |
| 379 DidTileTreeBinChange(tile, bin_map[mts.tree_bin[ACTIVE_TREE]], | 398 mts->resource_is_being_initialized) { |
| 380 ACTIVE_TREE); | 399 live_or_allocated_tiles_.push_back(mts); |
| 381 DidTileTreeBinChange(tile, bin_map[mts.tree_bin[PENDING_TREE]], | |
| 382 PENDING_TREE); | |
| 383 | |
| 384 if (tile->priority(ACTIVE_TREE).is_live || | |
| 385 tile->priority(PENDING_TREE).is_live || | |
| 386 tile->managed_state().resource || | |
| 387 tile->managed_state().resource_is_being_initialized) { | |
| 388 live_or_allocated_tiles_.push_back(tile); | |
| 389 } | 400 } |
| 390 } | 401 } |
| 391 TRACE_COUNTER_ID1("cc", "LiveOrAllocatedTileCount", this, | 402 TRACE_COUNTER_ID1("cc", "LiveOrAllocatedTileCount", this, |
| 392 live_or_allocated_tiles_.size()); | 403 live_or_allocated_tiles_.size()); |
| 393 | 404 |
| 394 SortTiles(); | 405 SortTiles(); |
| 395 | 406 |
| 396 // Assign gpu memory and determine what tiles need to be rasterized. | 407 // Assign gpu memory and determine what tiles need to be rasterized. |
| 397 AssignGpuMemoryToTiles(); | 408 AssignGpuMemoryToTiles(); |
| 398 | 409 |
| 399 TRACE_EVENT_INSTANT1("cc", "DidManage", "state", | 410 TRACE_EVENT_INSTANT1("cc", "DidManage", "state", |
| 400 ValueToString(BasicStateAsValue())); | 411 ValueToString(BasicStateAsValue())); |
| 401 | 412 |
| 402 // Finally, kick the rasterizer. | 413 // Finally, kick the rasterizer. |
| 403 DispatchMoreTasks(); | 414 DispatchMoreTasks(); |
| 404 } | 415 } |
| 405 | 416 |
| 406 void TileManager::CheckForCompletedTileUploads() { | 417 void TileManager::CheckForCompletedTileUploads() { |
| 407 while (!tiles_with_pending_set_pixels_.empty()) { | 418 while (!tiles_with_pending_set_pixels_.empty()) { |
| 408 Tile* tile = tiles_with_pending_set_pixels_.front(); | 419 ManagedTileState* mts = tiles_with_pending_set_pixels_.front(); |
| 409 DCHECK(tile->managed_state().resource); | 420 DCHECK(mts->resource); |
| 410 | 421 |
| 411 // Set pixel tasks complete in the order they are posted. | 422 // Set pixel tasks complete in the order they are posted. |
| 412 if (!resource_pool_->resource_provider()->didSetPixelsComplete( | 423 if (!resource_pool_->resource_provider()->didSetPixelsComplete( |
| 413 tile->managed_state().resource->id())) { | 424 mts->resource->id())) { |
| 414 break; | 425 break; |
| 415 } | 426 } |
| 416 | 427 |
| 417 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && | 428 if (mts->tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && |
| 418 tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) | 429 mts->tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) |
| 419 client_->DidUploadVisibleHighResolutionTile(); | 430 client_->DidUploadVisibleHighResolutionTile(); |
| 420 | 431 |
| 421 // It's now safe to release the pixel buffer. | 432 // It's now safe to release the pixel buffer. |
| 422 resource_pool_->resource_provider()->releasePixelBuffer( | 433 resource_pool_->resource_provider()->releasePixelBuffer( |
| 423 tile->managed_state().resource->id()); | 434 mts->resource->id()); |
| 424 | 435 |
| 425 DidFinishTileInitialization(tile); | 436 DidFinishTileInitialization(mts); |
| 426 | 437 |
| 427 bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated(); | 438 bytes_pending_set_pixels_ -= mts->tile->bytes_consumed_if_allocated(); |
| 428 DidTileRasterStateChange(tile, IDLE_STATE); | 439 DidTileRasterStateChange(mts, IDLE_STATE); |
| 429 tiles_with_pending_set_pixels_.pop(); | 440 tiles_with_pending_set_pixels_.pop(); |
| 430 } | 441 } |
| 431 | 442 |
| 432 DispatchMoreTasks(); | 443 DispatchMoreTasks(); |
| 433 } | 444 } |
| 434 | 445 |
| 435 void TileManager::AbortPendingTileUploads() { | 446 void TileManager::AbortPendingTileUploads() { |
| 436 while (!tiles_with_pending_set_pixels_.empty()) { | 447 while (!tiles_with_pending_set_pixels_.empty()) { |
| 437 Tile* tile = tiles_with_pending_set_pixels_.front(); | 448 ManagedTileState* mts = tiles_with_pending_set_pixels_.front(); |
| 438 ManagedTileState& managed_tile_state = tile->managed_state(); | 449 DCHECK(mts->resource); |
| 439 DCHECK(managed_tile_state.resource); | |
| 440 | 450 |
| 441 resource_pool_->resource_provider()->abortSetPixels( | 451 resource_pool_->resource_provider()->abortSetPixels( |
| 442 managed_tile_state.resource->id()); | 452 mts->resource->id()); |
| 443 resource_pool_->resource_provider()->releasePixelBuffer( | 453 resource_pool_->resource_provider()->releasePixelBuffer( |
| 444 managed_tile_state.resource->id()); | 454 mts->resource->id()); |
| 445 | 455 |
| 446 managed_tile_state.resource_is_being_initialized = false; | 456 mts->resource_is_being_initialized = false; |
| 447 managed_tile_state.can_be_freed = true; | 457 mts->can_be_freed = true; |
| 448 managed_tile_state.can_use_gpu_memory = false; | 458 mts->can_use_gpu_memory = false; |
| 449 FreeResourcesForTile(tile); | 459 FreeResourcesForTile(mts); |
| 450 | 460 |
| 451 bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated(); | 461 bytes_pending_set_pixels_ -= mts->tile->bytes_consumed_if_allocated(); |
| 452 DidTileRasterStateChange(tile, IDLE_STATE); | 462 DidTileRasterStateChange(mts, IDLE_STATE); |
| 453 tiles_with_pending_set_pixels_.pop(); | 463 tiles_with_pending_set_pixels_.pop(); |
| 454 } | 464 } |
| 455 } | 465 } |
| 456 | 466 |
| 457 void TileManager::GetMemoryStats( | 467 void TileManager::GetMemoryStats( |
| 458 size_t* memoryRequiredBytes, | 468 size_t* memoryRequiredBytes, |
| 459 size_t* memoryNiceToHaveBytes, | 469 size_t* memoryNiceToHaveBytes, |
| 460 size_t* memoryUsedBytes) const { | 470 size_t* memoryUsedBytes) const { |
| 461 *memoryRequiredBytes = 0; | 471 *memoryRequiredBytes = 0; |
| 462 *memoryNiceToHaveBytes = 0; | 472 *memoryNiceToHaveBytes = 0; |
| 463 *memoryUsedBytes = 0; | 473 *memoryUsedBytes = 0; |
| 464 for (size_t i = 0; i < live_or_allocated_tiles_.size(); i++) { | 474 for (size_t i = 0; i < live_or_allocated_tiles_.size(); i++) { |
| 465 const Tile* tile = live_or_allocated_tiles_[i]; | 475 const ManagedTileState* mts = live_or_allocated_tiles_[i]; |
| 466 const ManagedTileState& mts = tile->managed_state(); | 476 size_t tile_bytes = mts->tile->bytes_consumed_if_allocated(); |
| 467 size_t tile_bytes = tile->bytes_consumed_if_allocated(); | 477 if (mts->gpu_memmgr_stats_bin == NOW_BIN) |
| 468 if (mts.gpu_memmgr_stats_bin == NOW_BIN) | |
| 469 *memoryRequiredBytes += tile_bytes; | 478 *memoryRequiredBytes += tile_bytes; |
| 470 if (mts.gpu_memmgr_stats_bin != NEVER_BIN) | 479 if (mts->gpu_memmgr_stats_bin != NEVER_BIN) |
| 471 *memoryNiceToHaveBytes += tile_bytes; | 480 *memoryNiceToHaveBytes += tile_bytes; |
| 472 if (mts.can_use_gpu_memory) | 481 if (mts->can_use_gpu_memory) |
| 473 *memoryUsedBytes += tile_bytes; | 482 *memoryUsedBytes += tile_bytes; |
| 474 } | 483 } |
| 475 } | 484 } |
| 476 | 485 |
| 477 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const { | 486 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const { |
| 478 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 487 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 479 state->SetInteger("tile_count", all_tiles_.size()); | 488 state->SetInteger("tile_count", all_tiles_.size()); |
| 480 | 489 |
| 481 state->Set("global_state", global_state_.AsValue().release()); | 490 state->Set("global_state", global_state_.AsValue().release()); |
| 482 | 491 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 | 585 |
| 577 // By clearing the tiles_that_need_to_be_rasterized_ vector and | 586 // By clearing the tiles_that_need_to_be_rasterized_ vector and |
| 578 // tiles_with_image_decoding_tasks_ list above we move all tiles | 587 // tiles_with_image_decoding_tasks_ list above we move all tiles |
| 579 // currently waiting for raster to idle state. | 588 // currently waiting for raster to idle state. |
| 580 // Call DidTileRasterStateChange() for each of these tiles to | 589 // Call DidTileRasterStateChange() for each of these tiles to |
| 581 // have this state change take effect. | 590 // have this state change take effect. |
| 582 // Some memory cannot be released. We figure out how much in this | 591 // Some memory cannot be released. We figure out how much in this |
| 583 // loop as well. | 592 // loop as well. |
| 584 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); | 593 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); |
| 585 it != live_or_allocated_tiles_.end(); ++it) { | 594 it != live_or_allocated_tiles_.end(); ++it) { |
| 586 Tile* tile = *it; | 595 ManagedTileState* mts = *it; |
| 587 if (!tile->managed_state().can_be_freed) | 596 if (!mts->can_be_freed) |
| 588 unreleasable_bytes += tile->bytes_consumed_if_allocated(); | 597 unreleasable_bytes += mts->tile->bytes_consumed_if_allocated(); |
| 589 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) | 598 if (mts->raster_state == WAITING_FOR_RASTER_STATE) |
| 590 DidTileRasterStateChange(tile, IDLE_STATE); | 599 DidTileRasterStateChange(mts, IDLE_STATE); |
| 591 } | 600 } |
| 592 | 601 |
| 593 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_
bytes; | 602 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_
bytes; |
| 594 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; | 603 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; |
| 595 size_t bytes_left = bytes_allocatable; | 604 size_t bytes_left = bytes_allocatable; |
| 596 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); it != live_or
_allocated_tiles_.end(); ++it) { | 605 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); it != live_or
_allocated_tiles_.end(); ++it) { |
| 597 Tile* tile = *it; | 606 ManagedTileState* mts = *it; |
| 598 size_t tile_bytes = tile->bytes_consumed_if_allocated(); | 607 size_t tile_bytes = mts->tile->bytes_consumed_if_allocated(); |
| 599 ManagedTileState& managed_tile_state = tile->managed_state(); | 608 if (!mts->can_be_freed) |
| 600 if (!managed_tile_state.can_be_freed) | |
| 601 continue; | 609 continue; |
| 602 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && | 610 if (mts->bin[HIGH_PRIORITY_BIN] == NEVER_BIN && |
| 603 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { | 611 mts->bin[LOW_PRIORITY_BIN] == NEVER_BIN) { |
| 604 managed_tile_state.can_use_gpu_memory = false; | 612 mts->can_use_gpu_memory = false; |
| 605 FreeResourcesForTile(tile); | 613 FreeResourcesForTile(mts); |
| 606 continue; | 614 continue; |
| 607 } | 615 } |
| 608 if (tile_bytes > bytes_left) { | 616 if (tile_bytes > bytes_left) { |
| 609 managed_tile_state.can_use_gpu_memory = false; | 617 mts->can_use_gpu_memory = false; |
| 610 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NOW_BIN || | 618 if (mts->bin[HIGH_PRIORITY_BIN] == NOW_BIN || |
| 611 managed_tile_state.bin[LOW_PRIORITY_BIN] == NOW_BIN) | 619 mts->bin[LOW_PRIORITY_BIN] == NOW_BIN) |
| 612 bytes_that_exceeded_memory_budget_in_now_bin += tile_bytes; | 620 bytes_that_exceeded_memory_budget_in_now_bin += tile_bytes; |
| 613 FreeResourcesForTile(tile); | 621 FreeResourcesForTile(mts); |
| 614 continue; | 622 continue; |
| 615 } | 623 } |
| 616 bytes_left -= tile_bytes; | 624 bytes_left -= tile_bytes; |
| 617 managed_tile_state.can_use_gpu_memory = true; | 625 mts->can_use_gpu_memory = true; |
| 618 if (!managed_tile_state.resource && | 626 if (!mts->resource && |
| 619 !managed_tile_state.resource_is_being_initialized) { | 627 !mts->resource_is_being_initialized) { |
| 620 tiles_that_need_to_be_rasterized_.push_back(tile); | 628 tiles_that_need_to_be_rasterized_.push_back(mts); |
| 621 DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); | 629 DidTileRasterStateChange(mts, WAITING_FOR_RASTER_STATE); |
| 622 } | 630 } |
| 623 } | 631 } |
| 624 | 632 |
| 625 ever_exceeded_memory_budget_ |= | 633 ever_exceeded_memory_budget_ |= |
| 626 bytes_that_exceeded_memory_budget_in_now_bin > 0; | 634 bytes_that_exceeded_memory_budget_in_now_bin > 0; |
| 627 if (ever_exceeded_memory_budget_) { | 635 if (ever_exceeded_memory_budget_) { |
| 628 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, | 636 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
| 629 "budget", global_state_.memory_limit_in_bytes, | 637 "budget", global_state_.memory_limit_in_bytes, |
| 630 "over", bytes_that_exceeded_memory_budget_in_now_bin); | 638 "over", bytes_that_exceeded_memory_budget_in_now_bin); |
| 631 } | 639 } |
| 632 memory_stats_from_last_assign_.total_budget_in_bytes = | 640 memory_stats_from_last_assign_.total_budget_in_bytes = |
| 633 global_state_.memory_limit_in_bytes; | 641 global_state_.memory_limit_in_bytes; |
| 634 memory_stats_from_last_assign_.bytes_allocated = | 642 memory_stats_from_last_assign_.bytes_allocated = |
| 635 bytes_allocatable - bytes_left; | 643 bytes_allocatable - bytes_left; |
| 636 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; | 644 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; |
| 637 memory_stats_from_last_assign_.bytes_over = | 645 memory_stats_from_last_assign_.bytes_over = |
| 638 bytes_that_exceeded_memory_budget_in_now_bin; | 646 bytes_that_exceeded_memory_budget_in_now_bin; |
| 639 | 647 |
| 640 // Reverse two tiles_that_need_* vectors such that pop_back gets | 648 // Reverse two tiles_that_need_* vectors such that pop_back gets |
| 641 // the highest priority tile. | 649 // the highest priority tile. |
| 642 std::reverse( | 650 std::reverse( |
| 643 tiles_that_need_to_be_rasterized_.begin(), | 651 tiles_that_need_to_be_rasterized_.begin(), |
| 644 tiles_that_need_to_be_rasterized_.end()); | 652 tiles_that_need_to_be_rasterized_.end()); |
| 645 } | 653 } |
| 646 | 654 |
| 647 void TileManager::FreeResourcesForTile(Tile* tile) { | 655 void TileManager::FreeResourcesForTile(ManagedTileState* mts) { |
| 648 ManagedTileState& managed_tile_state = tile->managed_state(); | 656 DCHECK(mts->can_be_freed); |
| 649 DCHECK(managed_tile_state.can_be_freed); | 657 if (mts->resource) |
| 650 if (managed_tile_state.resource) | 658 resource_pool_->ReleaseResource(mts->resource.Pass()); |
| 651 resource_pool_->ReleaseResource(managed_tile_state.resource.Pass()); | |
| 652 } | 659 } |
| 653 | 660 |
| 654 bool TileManager::CanDispatchRasterTask(Tile* tile) { | 661 bool TileManager::CanDispatchRasterTask(ManagedTileState* mts) { |
| 655 if (raster_worker_pool_->IsBusy()) | 662 if (raster_worker_pool_->IsBusy()) |
| 656 return false; | 663 return false; |
| 657 size_t new_bytes_pending = bytes_pending_set_pixels_; | 664 size_t new_bytes_pending = bytes_pending_set_pixels_; |
| 658 new_bytes_pending += tile->bytes_consumed_if_allocated(); | 665 new_bytes_pending += mts->tile->bytes_consumed_if_allocated(); |
| 659 return new_bytes_pending <= kMaxPendingUploadBytes && | 666 return new_bytes_pending <= kMaxPendingUploadBytes && |
| 660 tiles_with_pending_set_pixels_.size() < kMaxPendingUploads; | 667 tiles_with_pending_set_pixels_.size() < kMaxPendingUploads; |
| 661 } | 668 } |
| 662 | 669 |
| 663 void TileManager::DispatchMoreTasks() { | 670 void TileManager::DispatchMoreTasks() { |
| 664 // Because tiles in the image decoding list have higher priorities, we | 671 // Because tiles in the image decoding list have higher priorities, we |
| 665 // need to process those tiles first before we start to handle the tiles | 672 // need to process those tiles first before we start to handle the tiles |
| 666 // in the need_to_be_rasterized queue. | 673 // in the need_to_be_rasterized queue. |
| 667 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); | 674 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| 668 it != tiles_with_image_decoding_tasks_.end(); ) { | 675 it != tiles_with_image_decoding_tasks_.end(); ) { |
| 669 DispatchImageDecodeTasksForTile(*it); | 676 ManagedTileState* mts = *it; |
| 670 ManagedTileState& managed_state = (*it)->managed_state(); | 677 DispatchImageDecodeTasksForTile(mts); |
| 671 if (managed_state.pending_pixel_refs.empty()) { | 678 if (mts->pending_pixel_refs.empty()) { |
| 672 if (!CanDispatchRasterTask(*it)) | 679 if (!CanDispatchRasterTask(mts)) |
| 673 return; | 680 return; |
| 674 DispatchOneRasterTask(*it); | 681 DispatchOneRasterTask(mts); |
| 675 tiles_with_image_decoding_tasks_.erase(it++); | 682 tiles_with_image_decoding_tasks_.erase(it++); |
| 676 } else { | 683 } else { |
| 677 ++it; | 684 ++it; |
| 678 } | 685 } |
| 679 } | 686 } |
| 680 | 687 |
| 681 // Process all tiles in the need_to_be_rasterized queue. If a tile has | 688 // Process all tiles in the need_to_be_rasterized queue. If a tile has |
| 682 // image decoding tasks, put it to the back of the image decoding list. | 689 // image decoding tasks, put it to the back of the image decoding list. |
| 683 while (!tiles_that_need_to_be_rasterized_.empty()) { | 690 while (!tiles_that_need_to_be_rasterized_.empty()) { |
| 684 Tile* tile = tiles_that_need_to_be_rasterized_.back(); | 691 ManagedTileState* mts = tiles_that_need_to_be_rasterized_.back(); |
| 685 DispatchImageDecodeTasksForTile(tile); | 692 DispatchImageDecodeTasksForTile(mts); |
| 686 ManagedTileState& managed_state = tile->managed_state(); | 693 if (!mts->pending_pixel_refs.empty()) { |
| 687 if (!managed_state.pending_pixel_refs.empty()) { | 694 tiles_with_image_decoding_tasks_.push_back(mts); |
| 688 tiles_with_image_decoding_tasks_.push_back(tile); | |
| 689 } else { | 695 } else { |
| 690 if (!CanDispatchRasterTask(tile)) | 696 if (!CanDispatchRasterTask(mts)) |
| 691 return; | 697 return; |
| 692 DispatchOneRasterTask(tile); | 698 DispatchOneRasterTask(mts); |
| 693 } | 699 } |
| 694 tiles_that_need_to_be_rasterized_.pop_back(); | 700 tiles_that_need_to_be_rasterized_.pop_back(); |
| 695 } | 701 } |
| 696 } | 702 } |
| 697 | 703 |
| 698 void TileManager::GatherPixelRefsForTile(Tile* tile) { | 704 void TileManager::GatherPixelRefsForTile(ManagedTileState* mts) { |
| 699 TRACE_EVENT0("cc", "TileManager::GatherPixelRefsForTile"); | 705 TRACE_EVENT0("cc", "TileManager::GatherPixelRefsForTile"); |
| 700 ManagedTileState& managed_state = tile->managed_state(); | 706 if (mts->need_to_gather_pixel_refs) { |
| 701 if (managed_state.need_to_gather_pixel_refs) { | |
| 702 base::TimeTicks gather_begin_time; | 707 base::TimeTicks gather_begin_time; |
| 703 if (record_rendering_stats_) | 708 if (record_rendering_stats_) |
| 704 gather_begin_time = base::TimeTicks::HighResNow(); | 709 gather_begin_time = base::TimeTicks::HighResNow(); |
| 705 tile->picture_pile()->GatherPixelRefs( | 710 mts->tile->picture_pile()->GatherPixelRefs( |
| 706 tile->content_rect_, | 711 mts->tile->content_rect_, |
| 707 tile->contents_scale_, | 712 mts->tile->contents_scale_, |
| 708 managed_state.pending_pixel_refs); | 713 mts->pending_pixel_refs); |
| 709 managed_state.need_to_gather_pixel_refs = false; | 714 mts->need_to_gather_pixel_refs = false; |
| 710 if (record_rendering_stats_) { | 715 if (record_rendering_stats_) { |
| 711 rendering_stats_.totalImageGatheringCount++; | 716 rendering_stats_.totalImageGatheringCount++; |
| 712 rendering_stats_.totalImageGatheringTime += | 717 rendering_stats_.totalImageGatheringTime += |
| 713 base::TimeTicks::HighResNow() - gather_begin_time; | 718 base::TimeTicks::HighResNow() - gather_begin_time; |
| 714 } | 719 } |
| 715 } | 720 } |
| 716 } | 721 } |
| 717 | 722 |
| 718 void TileManager::DispatchImageDecodeTasksForTile(Tile* tile) { | 723 void TileManager::DispatchImageDecodeTasksForTile(ManagedTileState* mts) { |
| 719 GatherPixelRefsForTile(tile); | 724 GatherPixelRefsForTile(mts); |
| 720 std::list<skia::LazyPixelRef*>& pending_pixel_refs = | 725 std::list<skia::LazyPixelRef*>& pending_pixel_refs = |
| 721 tile->managed_state().pending_pixel_refs; | 726 mts->pending_pixel_refs; |
| 722 std::list<skia::LazyPixelRef*>::iterator it = pending_pixel_refs.begin(); | 727 std::list<skia::LazyPixelRef*>::iterator it = pending_pixel_refs.begin(); |
| 723 while (it != pending_pixel_refs.end()) { | 728 while (it != pending_pixel_refs.end()) { |
| 724 if (pending_decode_tasks_.end() != pending_decode_tasks_.find( | 729 if (pending_decode_tasks_.end() != pending_decode_tasks_.find( |
| 725 (*it)->getGenerationID())) { | 730 (*it)->getGenerationID())) { |
| 726 ++it; | 731 ++it; |
| 727 continue; | 732 continue; |
| 728 } | 733 } |
| 729 // TODO(qinmin): passing correct image size to PrepareToDecode(). | 734 // TODO(qinmin): passing correct image size to PrepareToDecode(). |
| 730 if ((*it)->PrepareToDecode(skia::LazyPixelRef::PrepareParams())) { | 735 if ((*it)->PrepareToDecode(skia::LazyPixelRef::PrepareParams())) { |
| 731 rendering_stats_.totalDeferredImageCacheHitCount++; | 736 rendering_stats_.totalDeferredImageCacheHitCount++; |
| 732 pending_pixel_refs.erase(it++); | 737 pending_pixel_refs.erase(it++); |
| 733 } else { | 738 } else { |
| 734 if (raster_worker_pool_->IsBusy()) | 739 if (raster_worker_pool_->IsBusy()) |
| 735 return; | 740 return; |
| 736 DispatchOneImageDecodeTask(tile, *it); | 741 DispatchOneImageDecodeTask(mts, *it); |
| 737 ++it; | 742 ++it; |
| 738 } | 743 } |
| 739 } | 744 } |
| 740 } | 745 } |
| 741 | 746 |
| 742 void TileManager::DispatchOneImageDecodeTask( | 747 void TileManager::DispatchOneImageDecodeTask( |
| 743 scoped_refptr<Tile> tile, skia::LazyPixelRef* pixel_ref) { | 748 scoped_refptr<ManagedTileState> mts, skia::LazyPixelRef* pixel_ref) { |
| 744 TRACE_EVENT0("cc", "TileManager::DispatchOneImageDecodeTask"); | 749 TRACE_EVENT0("cc", "TileManager::DispatchOneImageDecodeTask"); |
| 745 uint32_t pixel_ref_id = pixel_ref->getGenerationID(); | 750 uint32_t pixel_ref_id = pixel_ref->getGenerationID(); |
| 746 DCHECK(pending_decode_tasks_.end() == | 751 DCHECK(pending_decode_tasks_.end() == |
| 747 pending_decode_tasks_.find(pixel_ref_id)); | 752 pending_decode_tasks_.find(pixel_ref_id)); |
| 748 pending_decode_tasks_[pixel_ref_id] = pixel_ref; | 753 pending_decode_tasks_[pixel_ref_id] = pixel_ref; |
| 749 | 754 |
| 750 raster_worker_pool_->PostTaskAndReply( | 755 raster_worker_pool_->PostTaskAndReply( |
| 751 base::Bind(&TileManager::RunImageDecodeTask, pixel_ref), | 756 base::Bind(&TileManager::RunImageDecodeTask, pixel_ref), |
| 752 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 757 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
| 753 base::Unretained(this), | 758 base::Unretained(this), |
| 754 tile, | 759 mts, |
| 755 pixel_ref_id)); | 760 pixel_ref_id)); |
| 756 } | 761 } |
| 757 | 762 |
| 758 void TileManager::OnImageDecodeTaskCompleted( | 763 void TileManager::OnImageDecodeTaskCompleted( |
| 759 scoped_refptr<Tile> tile, uint32_t pixel_ref_id) { | 764 scoped_refptr<ManagedTileState> mts, uint32_t pixel_ref_id) { |
| 760 TRACE_EVENT0("cc", "TileManager::OnImageDecodeTaskCompleted"); | 765 TRACE_EVENT0("cc", "TileManager::OnImageDecodeTaskCompleted"); |
| 761 pending_decode_tasks_.erase(pixel_ref_id); | 766 pending_decode_tasks_.erase(pixel_ref_id); |
| 762 | 767 |
| 763 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); | 768 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| 764 it != tiles_with_image_decoding_tasks_.end(); ++it) { | 769 it != tiles_with_image_decoding_tasks_.end(); ++it) { |
| 765 std::list<skia::LazyPixelRef*>& pixel_refs = | 770 std::list<skia::LazyPixelRef*>& pixel_refs = |
| 766 (*it)->managed_state().pending_pixel_refs; | 771 (*it)->pending_pixel_refs; |
| 767 for (std::list<skia::LazyPixelRef*>::iterator pixel_it = | 772 for (std::list<skia::LazyPixelRef*>::iterator pixel_it = |
| 768 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { | 773 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { |
| 769 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { | 774 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { |
| 770 pixel_refs.erase(pixel_it); | 775 pixel_refs.erase(pixel_it); |
| 771 break; | 776 break; |
| 772 } | 777 } |
| 773 } | 778 } |
| 774 } | 779 } |
| 775 } | 780 } |
| 776 | 781 |
| 777 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( | 782 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( |
| 778 Tile* tile) { | 783 ManagedTileState* mts) { |
| 779 ManagedTileState& managed_tile_state = tile->managed_state(); | 784 DCHECK(mts->can_use_gpu_memory); |
| 780 DCHECK(managed_tile_state.can_use_gpu_memory); | |
| 781 scoped_ptr<ResourcePool::Resource> resource = | 785 scoped_ptr<ResourcePool::Resource> resource = |
| 782 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); | 786 resource_pool_->AcquireResource(mts->tile->tile_size_.size(), |
| 787 mts->tile->format_); |
| 783 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); | 788 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); |
| 784 | 789 |
| 785 managed_tile_state.resource_is_being_initialized = true; | 790 mts->resource_is_being_initialized = true; |
| 786 managed_tile_state.can_be_freed = false; | 791 mts->can_be_freed = false; |
| 787 | 792 |
| 788 DidTileRasterStateChange(tile, RASTER_STATE); | 793 DidTileRasterStateChange(mts, RASTER_STATE); |
| 789 return resource.Pass(); | 794 return resource.Pass(); |
| 790 } | 795 } |
| 791 | 796 |
| 792 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { | 797 void TileManager::DispatchOneRasterTask(scoped_refptr<ManagedTileState> mts) { |
| 793 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); | 798 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); |
| 794 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); | 799 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(mts); |
| 795 ResourceProvider::ResourceId resource_id = resource->id(); | 800 ResourceProvider::ResourceId resource_id = resource->id(); |
| 796 | 801 |
| 797 raster_worker_pool_->PostRasterTaskAndReply( | 802 raster_worker_pool_->PostRasterTaskAndReply( |
| 798 tile->picture_pile(), | 803 mts->tile->picture_pile(), |
| 799 base::Bind(&TileManager::PerformRaster, | 804 base::Bind(&TileManager::PerformRaster, |
| 800 resource_pool_->resource_provider()->mapPixelBuffer( | 805 resource_pool_->resource_provider()->mapPixelBuffer( |
| 801 resource_id), | 806 resource_id), |
| 802 tile->content_rect_, | 807 mts->tile->content_rect_, |
| 803 tile->contents_scale(), | 808 mts->tile->contents_scale(), |
| 804 use_cheapness_estimator_, | 809 use_cheapness_estimator_, |
| 805 GetRasterTaskMetadata(tile->managed_state())), | 810 GetRasterTaskMetadata(mts)), |
| 806 base::Bind(&TileManager::OnRasterTaskCompleted, | 811 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 807 base::Unretained(this), | 812 base::Unretained(this), |
| 808 tile, | 813 mts, |
| 809 base::Passed(&resource), | 814 base::Passed(&resource), |
| 810 manage_tiles_call_count_)); | 815 manage_tiles_call_count_)); |
| 811 } | 816 } |
| 812 | 817 |
| 813 void TileManager::PerformOneRaster(Tile* tile) { | 818 void TileManager::PerformOneRaster(ManagedTileState* mts) { |
| 814 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); | 819 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(mts); |
| 815 ResourceProvider::ResourceId resource_id = resource->id(); | 820 ResourceProvider::ResourceId resource_id = resource->id(); |
| 816 | 821 |
| 817 PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer( | 822 PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer( |
| 818 resource_id), | 823 resource_id), |
| 819 tile->content_rect_, | 824 mts->tile->content_rect_, |
| 820 tile->contents_scale(), | 825 mts->tile->contents_scale(), |
| 821 use_cheapness_estimator_, | 826 use_cheapness_estimator_, |
| 822 GetRasterTaskMetadata(tile->managed_state()), | 827 GetRasterTaskMetadata(mts->tile->managed_state()), |
| 823 tile->picture_pile(), | 828 mts->tile->picture_pile(), |
| 824 &rendering_stats_); | 829 &rendering_stats_); |
| 825 | 830 |
| 826 OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_); | 831 OnRasterCompleted(mts, resource.Pass(), manage_tiles_call_count_); |
| 827 } | 832 } |
| 828 | 833 |
| 829 void TileManager::OnRasterCompleted( | 834 void TileManager::OnRasterCompleted( |
| 830 scoped_refptr<Tile> tile, | 835 scoped_refptr<ManagedTileState> mts, |
| 831 scoped_ptr<ResourcePool::Resource> resource, | 836 scoped_ptr<ResourcePool::Resource> resource, |
| 832 int manage_tiles_call_count_when_dispatched) { | 837 int manage_tiles_call_count_when_dispatched) { |
| 833 TRACE_EVENT0("cc", "TileManager::OnRasterCompleted"); | 838 TRACE_EVENT0("cc", "TileManager::OnRasterCompleted"); |
| 834 | 839 |
| 835 // Release raster resources. | 840 // Release raster resources. |
| 836 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); | 841 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); |
| 837 | 842 |
| 838 ManagedTileState& managed_tile_state = tile->managed_state(); | 843 mts->can_be_freed = true; |
| 839 managed_tile_state.can_be_freed = true; | |
| 840 | 844 |
| 841 // Tile can be freed after the completion of the raster task. Call | 845 // Tile can be freed after the completion of the raster task. Call |
| 842 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority | 846 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
| 843 // tiles if ManageTiles() was called since task was dispatched. The result | 847 // tiles if ManageTiles() was called since task was dispatched. The result |
| 844 // of this could be that this tile is no longer allowed to use gpu | 848 // of this could be that this tile is no longer allowed to use gpu |
| 845 // memory and in that case we need to abort initialization and free all | 849 // memory and in that case we need to abort initialization and free all |
| 846 // associated resources before calling DispatchMoreTasks(). | 850 // associated resources before calling DispatchMoreTasks(). |
| 847 if (manage_tiles_call_count_when_dispatched != manage_tiles_call_count_) | 851 if (manage_tiles_call_count_when_dispatched != manage_tiles_call_count_) |
| 848 AssignGpuMemoryToTiles(); | 852 AssignGpuMemoryToTiles(); |
| 849 | 853 |
| 850 // Finish resource initialization if |can_use_gpu_memory| is true. | 854 // Finish resource initialization if |can_use_gpu_memory| is true. |
| 851 if (managed_tile_state.can_use_gpu_memory) { | 855 if (mts->can_use_gpu_memory) { |
| 852 // The component order may be bgra if we're uploading bgra pixels to rgba | 856 // The component order may be bgra if we're uploading bgra pixels to rgba |
| 853 // texture. Mark contents as swizzled if image component order is | 857 // texture. Mark contents as swizzled if image component order is |
| 854 // different than texture format. | 858 // different than texture format. |
| 855 managed_tile_state.contents_swizzled = | 859 mts->contents_swizzled = |
| 856 !PlatformColor::sameComponentOrder(tile->format_); | 860 !PlatformColor::sameComponentOrder(mts->tile->format_); |
| 857 | 861 |
| 858 // Tile resources can't be freed until upload has completed. | 862 // Tile resources can't be freed until upload has completed. |
| 859 managed_tile_state.can_be_freed = false; | 863 mts->can_be_freed = false; |
| 860 | 864 |
| 861 resource_pool_->resource_provider()->beginSetPixels(resource->id()); | 865 resource_pool_->resource_provider()->beginSetPixels(resource->id()); |
| 862 has_performed_uploads_since_last_flush_ = true; | 866 has_performed_uploads_since_last_flush_ = true; |
| 863 | 867 |
| 864 managed_tile_state.resource = resource.Pass(); | 868 mts->resource = resource.Pass(); |
| 865 | 869 |
| 866 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); | 870 bytes_pending_set_pixels_ += mts->tile->bytes_consumed_if_allocated(); |
| 867 DidTileRasterStateChange(tile, SET_PIXELS_STATE); | 871 DidTileRasterStateChange(mts, SET_PIXELS_STATE); |
| 868 tiles_with_pending_set_pixels_.push(tile); | 872 tiles_with_pending_set_pixels_.push(mts); |
| 869 } else { | 873 } else { |
| 870 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | 874 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| 871 resource_pool_->ReleaseResource(resource.Pass()); | 875 resource_pool_->ReleaseResource(resource.Pass()); |
| 872 managed_tile_state.resource_is_being_initialized = false; | 876 mts->resource_is_being_initialized = false; |
| 873 DidTileRasterStateChange(tile, IDLE_STATE); | 877 DidTileRasterStateChange(mts, IDLE_STATE); |
| 874 } | 878 } |
| 875 } | 879 } |
| 876 | 880 |
| 877 void TileManager::OnRasterTaskCompleted( | 881 void TileManager::OnRasterTaskCompleted( |
| 878 scoped_refptr<Tile> tile, | 882 scoped_refptr<ManagedTileState> mts, |
| 879 scoped_ptr<ResourcePool::Resource> resource, | 883 scoped_ptr<ResourcePool::Resource> resource, |
| 880 int manage_tiles_call_count_when_dispatched) { | 884 int manage_tiles_call_count_when_dispatched) { |
| 881 OnRasterCompleted(tile, resource.Pass(), | 885 OnRasterCompleted(mts, resource.Pass(), |
| 882 manage_tiles_call_count_when_dispatched); | 886 manage_tiles_call_count_when_dispatched); |
| 883 } | 887 } |
| 884 | 888 |
| 885 void TileManager::DidFinishTileInitialization(Tile* tile) { | 889 void TileManager::DidFinishTileInitialization(ManagedTileState* mts) { |
| 886 ManagedTileState& managed_tile_state = tile->managed_state(); | 890 DCHECK(mts->resource); |
| 887 DCHECK(managed_tile_state.resource); | 891 mts->resource_is_being_initialized = false; |
| 888 managed_tile_state.resource_is_being_initialized = false; | 892 mts->can_be_freed = true; |
| 889 managed_tile_state.can_be_freed = true; | |
| 890 } | 893 } |
| 891 | 894 |
| 892 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { | 895 void TileManager::DidTileRasterStateChange( |
| 893 ManagedTileState& mts = tile->managed_state(); | 896 ManagedTileState* mts, TileRasterState state) { |
| 894 DCHECK_LT(state, NUM_STATES); | 897 DCHECK_LT(state, NUM_STATES); |
| 895 | 898 |
| 896 for (int i = 0; i < NUM_TREES; ++i) { | 899 for (int i = 0; i < NUM_TREES; ++i) { |
| 897 // Decrement count for current state. | 900 // Decrement count for current state. |
| 898 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; | 901 --raster_state_count_[mts->raster_state][i][mts->tree_bin[i]]; |
| 899 DCHECK_GE(raster_state_count_[mts.raster_state][i][mts.tree_bin[i]], 0); | 902 DCHECK_GE(raster_state_count_[mts->raster_state][i][mts->tree_bin[i]], 0); |
| 900 | 903 |
| 901 // Increment count for new state. | 904 // Increment count for new state. |
| 902 ++raster_state_count_[state][i][mts.tree_bin[i]]; | 905 ++raster_state_count_[state][i][mts->tree_bin[i]]; |
| 903 } | 906 } |
| 904 | 907 |
| 905 mts.raster_state = state; | 908 mts->raster_state = state; |
| 906 } | 909 } |
| 907 | 910 |
| 908 void TileManager::DidTileTreeBinChange(Tile* tile, | 911 void TileManager::DidTileTreeBinChange(ManagedTileState* mts, |
| 909 TileManagerBin new_tree_bin, | 912 TileManagerBin new_tree_bin, |
| 910 WhichTree tree) { | 913 WhichTree tree) { |
| 911 ManagedTileState& mts = tile->managed_state(); | |
| 912 | |
| 913 // Decrement count for current bin. | 914 // Decrement count for current bin. |
| 914 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]]; | 915 --raster_state_count_[mts->raster_state][tree][mts->tree_bin[tree]]; |
| 915 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0); | 916 DCHECK_GE(raster_state_count_[mts->raster_state][tree][mts->tree_bin[tree]], 0
); |
| 916 | 917 |
| 917 // Increment count for new bin. | 918 // Increment count for new bin. |
| 918 ++raster_state_count_[mts.raster_state][tree][new_tree_bin]; | 919 ++raster_state_count_[mts->raster_state][tree][new_tree_bin]; |
| 919 | 920 |
| 920 mts.tree_bin[tree] = new_tree_bin; | 921 mts->tree_bin[tree] = new_tree_bin; |
| 921 } | 922 } |
| 922 | 923 |
| 923 // static | 924 // static |
| 924 void TileManager::PerformRaster(uint8* buffer, | 925 void TileManager::PerformRaster(uint8* buffer, |
| 925 const gfx::Rect& rect, | 926 const gfx::Rect& rect, |
| 926 float contents_scale, | 927 float contents_scale, |
| 927 bool use_cheapness_estimator, | 928 bool use_cheapness_estimator, |
| 928 const RasterTaskMetadata& raster_task_metadata, | 929 const RasterTaskMetadata& raster_task_metadata, |
| 929 PicturePileImpl* picture_pile, | 930 PicturePileImpl* picture_pile, |
| 930 RenderingStats* stats) { | 931 RenderingStats* stats) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 decode_begin_time = base::TimeTicks::HighResNow(); | 996 decode_begin_time = base::TimeTicks::HighResNow(); |
| 996 pixel_ref->Decode(); | 997 pixel_ref->Decode(); |
| 997 if (stats) { | 998 if (stats) { |
| 998 stats->totalDeferredImageDecodeCount++; | 999 stats->totalDeferredImageDecodeCount++; |
| 999 stats->totalDeferredImageDecodeTime += | 1000 stats->totalDeferredImageDecodeTime += |
| 1000 base::TimeTicks::HighResNow() - decode_begin_time; | 1001 base::TimeTicks::HighResNow() - decode_begin_time; |
| 1001 } | 1002 } |
| 1002 } | 1003 } |
| 1003 | 1004 |
| 1004 } // namespace cc | 1005 } // namespace cc |
| OLD | NEW |