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/tiles/tile_manager.h" | 5 #include "cc/tiles/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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 base::saturated_cast<int>(stats.completed_count)); | 221 base::saturated_cast<int>(stats.completed_count)); |
| 222 state->SetInteger("canceled_count", | 222 state->SetInteger("canceled_count", |
| 223 base::saturated_cast<int>(stats.canceled_count)); | 223 base::saturated_cast<int>(stats.canceled_count)); |
| 224 return state; | 224 return state; |
| 225 } | 225 } |
| 226 | 226 |
| 227 // static | 227 // static |
| 228 scoped_ptr<TileManager> TileManager::Create( | 228 scoped_ptr<TileManager> TileManager::Create( |
| 229 TileManagerClient* client, | 229 TileManagerClient* client, |
| 230 base::SequencedTaskRunner* task_runner, | 230 base::SequencedTaskRunner* task_runner, |
| 231 ResourcePool* resource_pool, | |
| 232 TileTaskRunner* tile_task_runner, | |
| 233 size_t scheduled_raster_task_limit) { | 231 size_t scheduled_raster_task_limit) { |
| 234 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, | 232 return make_scoped_ptr( |
| 235 tile_task_runner, | 233 new TileManager(client, task_runner, scheduled_raster_task_limit)); |
| 236 scheduled_raster_task_limit)); | |
| 237 } | 234 } |
| 238 | 235 |
| 239 TileManager::TileManager( | 236 TileManager::TileManager( |
| 240 TileManagerClient* client, | 237 TileManagerClient* client, |
| 241 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | 238 const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
| 242 ResourcePool* resource_pool, | |
| 243 TileTaskRunner* tile_task_runner, | |
| 244 size_t scheduled_raster_task_limit) | 239 size_t scheduled_raster_task_limit) |
| 245 : client_(client), | 240 : client_(client), |
| 246 task_runner_(task_runner), | 241 task_runner_(task_runner), |
| 247 resource_pool_(resource_pool), | 242 resource_pool_(nullptr), |
| 248 tile_task_runner_(tile_task_runner), | 243 tile_task_runner_(nullptr), |
| 249 scheduled_raster_task_limit_(scheduled_raster_task_limit), | 244 scheduled_raster_task_limit_(scheduled_raster_task_limit), |
| 250 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), | 245 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), |
| 251 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 246 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
| 252 did_oom_on_last_assign_(false), | 247 did_oom_on_last_assign_(false), |
| 253 more_tiles_need_prepare_check_notifier_( | 248 more_tiles_need_prepare_check_notifier_( |
| 254 task_runner_.get(), | 249 task_runner_.get(), |
| 255 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, | 250 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, |
| 256 base::Unretained(this))), | 251 base::Unretained(this))), |
| 257 signals_check_notifier_(task_runner_.get(), | 252 signals_check_notifier_(task_runner_.get(), |
| 258 base::Bind(&TileManager::CheckAndIssueSignals, | 253 base::Bind(&TileManager::CheckAndIssueSignals, |
| 259 base::Unretained(this))), | 254 base::Unretained(this))), |
| 260 has_scheduled_tile_tasks_(false), | 255 has_scheduled_tile_tasks_(false), |
| 261 prepare_tiles_count_(0u) { | 256 prepare_tiles_count_(0u) { |
| 262 tile_task_runner_->SetClient(this); | |
| 263 } | 257 } |
| 264 | 258 |
| 265 TileManager::~TileManager() { | 259 TileManager::~TileManager() { |
| 266 // Reset global state and manage. This should cause | 260 } |
|
enne (OOO)
2015/07/06 18:07:25
Should this call FinishTasksAndCleanUp? Or at leas
vmpstr
2015/07/06 18:41:35
Done.
| |
| 267 // our memory usage to drop to zero. | 261 |
| 262 void TileManager::FinishTasksAndCleanUp() { | |
| 263 if (!tile_task_runner_) | |
| 264 return; | |
| 265 | |
| 268 global_state_ = GlobalStateThatImpactsTilePriority(); | 266 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 269 | 267 |
| 270 TileTaskQueue empty; | 268 TileTaskQueue empty; |
| 271 tile_task_runner_->ScheduleTasks(&empty); | 269 tile_task_runner_->ScheduleTasks(&empty); |
| 272 orphan_raster_tasks_.clear(); | 270 orphan_raster_tasks_.clear(); |
| 273 | 271 |
| 274 // This should finish all pending tasks and release any uninitialized | 272 // This should finish all pending tasks and release any uninitialized |
| 275 // resources. | 273 // resources. |
| 276 tile_task_runner_->Shutdown(); | 274 tile_task_runner_->Shutdown(); |
| 277 tile_task_runner_->CheckForCompletedTasks(); | 275 tile_task_runner_->CheckForCompletedTasks(); |
| 278 | 276 |
| 279 FreeResourcesForReleasedTiles(); | 277 FreeResourcesForReleasedTiles(); |
| 280 CleanUpReleasedTiles(); | 278 CleanUpReleasedTiles(); |
| 279 | |
| 280 tile_task_runner_ = nullptr; | |
| 281 resource_pool_ = nullptr; | |
| 282 more_tiles_need_prepare_check_notifier_.Cancel(); | |
| 283 signals_check_notifier_.Cancel(); | |
| 284 } | |
| 285 | |
| 286 void TileManager::SetResources(ResourcePool* resource_pool, | |
| 287 TileTaskRunner* tile_task_runner) { | |
| 288 DCHECK(!tile_task_runner_); | |
| 289 DCHECK(tile_task_runner); | |
| 290 | |
| 291 resource_pool_ = resource_pool; | |
| 292 tile_task_runner_ = tile_task_runner; | |
| 293 tile_task_runner_->SetClient(this); | |
| 281 } | 294 } |
| 282 | 295 |
| 283 void TileManager::Release(Tile* tile) { | 296 void TileManager::Release(Tile* tile) { |
| 284 released_tiles_.push_back(tile); | 297 released_tiles_.push_back(tile); |
| 285 } | 298 } |
| 286 | 299 |
| 287 TaskSetCollection TileManager::TasksThatShouldBeForcedToComplete() const { | 300 TaskSetCollection TileManager::TasksThatShouldBeForcedToComplete() const { |
| 288 TaskSetCollection tasks_that_should_be_forced_to_complete; | 301 TaskSetCollection tasks_that_should_be_forced_to_complete; |
| 289 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) | 302 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) |
| 290 tasks_that_should_be_forced_to_complete[REQUIRED_FOR_ACTIVATION] = true; | 303 tasks_that_should_be_forced_to_complete[REQUIRED_FOR_ACTIVATION] = true; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 317 } | 330 } |
| 318 | 331 |
| 319 delete tile; | 332 delete tile; |
| 320 } | 333 } |
| 321 released_tiles_.swap(tiles_to_retain); | 334 released_tiles_.swap(tiles_to_retain); |
| 322 } | 335 } |
| 323 | 336 |
| 324 void TileManager::DidFinishRunningTileTasks(TaskSet task_set) { | 337 void TileManager::DidFinishRunningTileTasks(TaskSet task_set) { |
| 325 TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set", | 338 TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set", |
| 326 TaskSetName(task_set)); | 339 TaskSetName(task_set)); |
| 340 DCHECK(resource_pool_); | |
| 341 DCHECK(tile_task_runner_); | |
| 327 | 342 |
| 328 switch (task_set) { | 343 switch (task_set) { |
| 329 case ALL: { | 344 case ALL: { |
| 330 has_scheduled_tile_tasks_ = false; | 345 has_scheduled_tile_tasks_ = false; |
| 331 | 346 |
| 332 bool memory_usage_above_limit = | 347 bool memory_usage_above_limit = |
| 333 resource_pool_->total_memory_usage_bytes() > | 348 resource_pool_->total_memory_usage_bytes() > |
| 334 global_state_.soft_memory_limit_in_bytes; | 349 global_state_.soft_memory_limit_in_bytes; |
| 335 | 350 |
| 336 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && | 351 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 353 | 368 |
| 354 case REQUIRED_FOR_DRAW: | 369 case REQUIRED_FOR_DRAW: |
| 355 signals_.ready_to_draw = true; | 370 signals_.ready_to_draw = true; |
| 356 signals_check_notifier_.Schedule(); | 371 signals_check_notifier_.Schedule(); |
| 357 return; | 372 return; |
| 358 } | 373 } |
| 359 | 374 |
| 360 NOTREACHED(); | 375 NOTREACHED(); |
| 361 } | 376 } |
| 362 | 377 |
| 363 void TileManager::PrepareTiles( | 378 bool TileManager::PrepareTiles( |
| 364 const GlobalStateThatImpactsTilePriority& state) { | 379 const GlobalStateThatImpactsTilePriority& state) { |
| 365 ++prepare_tiles_count_; | 380 ++prepare_tiles_count_; |
| 366 | 381 |
| 367 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", | 382 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", |
| 368 prepare_tiles_count_); | 383 prepare_tiles_count_); |
| 369 | 384 |
| 385 if (!tile_task_runner_) { | |
| 386 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted", | |
| 387 TRACE_EVENT_SCOPE_THREAD); | |
| 388 return false; | |
| 389 } | |
| 390 | |
| 370 signals_.reset(); | 391 signals_.reset(); |
| 371 global_state_ = state; | 392 global_state_ = state; |
| 372 | 393 |
| 373 // We need to call CheckForCompletedTasks() once in-between each call | 394 // We need to call CheckForCompletedTasks() once in-between each call |
| 374 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 395 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 375 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 396 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 376 tile_task_runner_->CheckForCompletedTasks(); | 397 tile_task_runner_->CheckForCompletedTasks(); |
| 377 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 398 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 378 } | 399 } |
| 379 | 400 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 396 | 417 |
| 397 // Schedule tile tasks. | 418 // Schedule tile tasks. |
| 398 ScheduleTasks(tiles_that_need_to_be_rasterized); | 419 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 399 | 420 |
| 400 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, | 421 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
| 401 "state", BasicStateAsValue()); | 422 "state", BasicStateAsValue()); |
| 402 | 423 |
| 403 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, | 424 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
| 404 resource_pool_->total_memory_usage_bytes() - | 425 resource_pool_->total_memory_usage_bytes() - |
| 405 resource_pool_->acquired_memory_usage_bytes()); | 426 resource_pool_->acquired_memory_usage_bytes()); |
| 427 return true; | |
| 406 } | 428 } |
| 407 | 429 |
| 408 void TileManager::Flush() { | 430 void TileManager::Flush() { |
| 409 TRACE_EVENT0("cc", "TileManager::Flush"); | 431 TRACE_EVENT0("cc", "TileManager::Flush"); |
| 410 | 432 |
| 433 if (!tile_task_runner_) { | |
| 434 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); | |
| 435 return; | |
| 436 } | |
| 437 | |
| 411 tile_task_runner_->CheckForCompletedTasks(); | 438 tile_task_runner_->CheckForCompletedTasks(); |
| 412 | 439 |
| 413 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 440 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 414 | 441 |
| 415 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", | 442 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", |
| 416 RasterTaskCompletionStatsAsValue(flush_stats_)); | 443 RasterTaskCompletionStatsAsValue(flush_stats_)); |
| 417 flush_stats_ = RasterTaskCompletionStats(); | 444 flush_stats_ = RasterTaskCompletionStats(); |
| 418 } | 445 } |
| 419 | 446 |
| 420 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | 447 scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 497 NOTREACHED(); | 524 NOTREACHED(); |
| 498 return true; | 525 return true; |
| 499 } | 526 } |
| 500 | 527 |
| 501 void TileManager::AssignGpuMemoryToTiles( | 528 void TileManager::AssignGpuMemoryToTiles( |
| 502 RasterTilePriorityQueue* raster_priority_queue, | 529 RasterTilePriorityQueue* raster_priority_queue, |
| 503 size_t scheduled_raster_task_limit, | 530 size_t scheduled_raster_task_limit, |
| 504 PrioritizedTileVector* tiles_that_need_to_be_rasterized) { | 531 PrioritizedTileVector* tiles_that_need_to_be_rasterized) { |
| 505 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); | 532 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| 506 | 533 |
| 534 DCHECK(resource_pool_); | |
| 535 DCHECK(tile_task_runner_); | |
| 536 | |
| 507 // Maintain the list of released resources that can potentially be re-used | 537 // Maintain the list of released resources that can potentially be re-used |
| 508 // or deleted. If this operation becomes expensive too, only do this after | 538 // or deleted. If this operation becomes expensive too, only do this after |
| 509 // some resource(s) was returned. Note that in that case, one also need to | 539 // some resource(s) was returned. Note that in that case, one also need to |
| 510 // invalidate when releasing some resource from the pool. | 540 // invalidate when releasing some resource from the pool. |
| 511 resource_pool_->CheckBusyResources(false); | 541 resource_pool_->CheckBusyResources(false); |
| 512 | 542 |
| 513 // Now give memory out to the tiles until we're out, and build | 543 // Now give memory out to the tiles until we're out, and build |
| 514 // the needs-to-be-rasterized queue. | 544 // the needs-to-be-rasterized queue. |
| 515 unsigned schedule_priority = 1u; | 545 unsigned schedule_priority = 1u; |
| 516 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 546 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 814 | 844 |
| 815 client_->NotifyTileStateChanged(tile); | 845 client_->NotifyTileStateChanged(tile); |
| 816 } | 846 } |
| 817 | 847 |
| 818 ScopedTilePtr TileManager::CreateTile(const gfx::Size& desired_texture_size, | 848 ScopedTilePtr TileManager::CreateTile(const gfx::Size& desired_texture_size, |
| 819 const gfx::Rect& content_rect, | 849 const gfx::Rect& content_rect, |
| 820 float contents_scale, | 850 float contents_scale, |
| 821 int layer_id, | 851 int layer_id, |
| 822 int source_frame_number, | 852 int source_frame_number, |
| 823 int flags) { | 853 int flags) { |
| 854 // We need to have a tile task worker pool to do anything meaningful with | |
| 855 // tiles. | |
| 856 DCHECK(tile_task_runner_); | |
| 824 ScopedTilePtr tile(new Tile(this, desired_texture_size, content_rect, | 857 ScopedTilePtr tile(new Tile(this, desired_texture_size, content_rect, |
| 825 contents_scale, layer_id, source_frame_number, | 858 contents_scale, layer_id, source_frame_number, |
| 826 flags)); | 859 flags)); |
| 827 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 860 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
| 828 | 861 |
| 829 tiles_[tile->id()] = tile.get(); | 862 tiles_[tile->id()] = tile.get(); |
| 830 used_layer_counts_[tile->layer_id()]++; | 863 used_layer_counts_[tile->layer_id()]++; |
| 831 return tile; | 864 return tile; |
| 832 } | 865 } |
| 833 | 866 |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1057 void TileManager::Signals::reset() { | 1090 void TileManager::Signals::reset() { |
| 1058 ready_to_activate = false; | 1091 ready_to_activate = false; |
| 1059 did_notify_ready_to_activate = false; | 1092 did_notify_ready_to_activate = false; |
| 1060 ready_to_draw = false; | 1093 ready_to_draw = false; |
| 1061 did_notify_ready_to_draw = false; | 1094 did_notify_ready_to_draw = false; |
| 1062 all_tile_tasks_completed = false; | 1095 all_tile_tasks_completed = false; |
| 1063 did_notify_all_tile_tasks_completed = false; | 1096 did_notify_all_tile_tasks_completed = false; |
| 1064 } | 1097 } |
| 1065 | 1098 |
| 1066 } // namespace cc | 1099 } // namespace cc |
| OLD | NEW |