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 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 353 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 353 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 354 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 354 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 355 tile_task_runner_->CheckForCompletedTasks(); | 355 tile_task_runner_->CheckForCompletedTasks(); |
| 356 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 356 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 357 } | 357 } |
| 358 | 358 |
| 359 FreeResourcesForReleasedTiles(); | 359 FreeResourcesForReleasedTiles(); |
| 360 CleanUpReleasedTiles(); | 360 CleanUpReleasedTiles(); |
| 361 | 361 |
| 362 TileVector tiles_that_need_to_be_rasterized; | 362 TileVector tiles_that_need_to_be_rasterized; |
| 363 RasterTilePriorityQueue raster_priority_queue; | 363 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
| 364 client_->BuildRasterQueue(&raster_priority_queue, | 364 client_->BuildRasterQueue(global_state_.tree_priority, |
| 365 global_state_.tree_priority, | 365 RasterTilePriorityQueue::Type::ALL)); |
| 366 RasterTilePriorityQueue::Type::ALL); | 366 AssignGpuMemoryToTiles(raster_priority_queue.get(), |
| 367 AssignGpuMemoryToTiles(&raster_priority_queue, scheduled_raster_task_limit_, | 367 scheduled_raster_task_limit_, |
| 368 &tiles_that_need_to_be_rasterized); | 368 &tiles_that_need_to_be_rasterized); |
| 369 | 369 |
| 370 // Schedule tile tasks. | 370 // Schedule tile tasks. |
| 371 ScheduleTasks(tiles_that_need_to_be_rasterized); | 371 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 372 | 372 |
| 373 did_notify_ready_to_activate_ = false; | 373 did_notify_ready_to_activate_ = false; |
| 374 did_notify_ready_to_draw_ = false; | 374 did_notify_ready_to_draw_ = false; |
| 375 } else { | 375 } else { |
| 376 if (global_state_.hard_memory_limit_in_bytes == 0) { | 376 if (global_state_.hard_memory_limit_in_bytes == 0) { |
| 377 // TODO(vmpstr): Add a function to unconditionally create an eviction | 377 // TODO(vmpstr): Add a function to unconditionally create an eviction |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 404 TRACE_EVENT0("cc", "TileManager::SynchronouslyRasterizeTiles"); | 404 TRACE_EVENT0("cc", "TileManager::SynchronouslyRasterizeTiles"); |
| 405 | 405 |
| 406 DCHECK(rasterizer_->GetPrepareTilesMode() != | 406 DCHECK(rasterizer_->GetPrepareTilesMode() != |
| 407 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES); | 407 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES); |
| 408 | 408 |
| 409 global_state_ = state; | 409 global_state_ = state; |
| 410 | 410 |
| 411 FreeResourcesForReleasedTiles(); | 411 FreeResourcesForReleasedTiles(); |
| 412 CleanUpReleasedTiles(); | 412 CleanUpReleasedTiles(); |
| 413 | 413 |
| 414 RasterTilePriorityQueue required_for_draw_queue; | 414 scoped_ptr<RasterTilePriorityQueue> required_for_draw_queue( |
| 415 client_->BuildRasterQueue(&required_for_draw_queue, | 415 client_->BuildRasterQueue( |
| 416 global_state_.tree_priority, | 416 global_state_.tree_priority, |
| 417 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 417 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW)); |
| 418 TileVector tiles_that_need_to_be_rasterized; | 418 TileVector tiles_that_need_to_be_rasterized; |
| 419 AssignGpuMemoryToTiles(&required_for_draw_queue, | 419 AssignGpuMemoryToTiles(required_for_draw_queue.get(), |
| 420 std::numeric_limits<size_t>::max(), | 420 std::numeric_limits<size_t>::max(), |
| 421 &tiles_that_need_to_be_rasterized); | 421 &tiles_that_need_to_be_rasterized); |
| 422 | 422 |
| 423 // We must reduce the amount of unused resources before calling | 423 // We must reduce the amount of unused resources before calling |
| 424 // RunTasks to prevent usage from rising above limits. | 424 // RunTasks to prevent usage from rising above limits. |
| 425 resource_pool_->ReduceResourceUsage(); | 425 resource_pool_->ReduceResourceUsage(); |
| 426 | 426 |
| 427 // Run and complete all raster task synchronously. | 427 // Run and complete all raster task synchronously. |
| 428 rasterizer_->RasterizeTiles( | 428 rasterizer_->RasterizeTiles( |
| 429 tiles_that_need_to_be_rasterized, resource_pool_, | 429 tiles_that_need_to_be_rasterized, resource_pool_, |
| 430 base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this))); | 430 base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this))); |
| 431 | 431 |
| 432 // Use on-demand raster for any required-for-draw tiles that have not been | 432 // Use on-demand raster for any required-for-draw tiles that have not been |
| 433 // assigned memory after reaching a steady memory state. | 433 // assigned memory after reaching a steady memory state. |
| 434 // TODO(hendrikw): Figure out why this would improve jank on some tests - See | 434 // TODO(hendrikw): Figure out why this would improve jank on some tests - See |
| 435 // crbug.com/449288 | 435 // crbug.com/449288 |
| 436 required_for_draw_queue.Reset(); | 436 required_for_draw_queue.reset( |
|
danakj
2015/01/22 20:24:16
why not queue =
vmpstr
2015/01/22 22:44:35
Done.
| |
| 437 client_->BuildRasterQueue(&required_for_draw_queue, | 437 client_->BuildRasterQueue( |
| 438 global_state_.tree_priority, | 438 global_state_.tree_priority, |
| 439 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 439 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW).release()); |
| 440 | 440 |
| 441 // Use on-demand raster for any tiles that have not been been assigned | 441 // Use on-demand raster for any tiles that have not been been assigned |
| 442 // memory. This ensures that we draw even when OOM. | 442 // memory. This ensures that we draw even when OOM. |
| 443 for (; !required_for_draw_queue.IsEmpty(); required_for_draw_queue.Pop()) { | 443 for (; !required_for_draw_queue->IsEmpty(); required_for_draw_queue->Pop()) { |
| 444 Tile* tile = required_for_draw_queue.Top(); | 444 Tile* tile = required_for_draw_queue->Top(); |
| 445 tile->draw_info().set_rasterize_on_demand(); | 445 tile->draw_info().set_rasterize_on_demand(); |
| 446 client_->NotifyTileStateChanged(tile); | 446 client_->NotifyTileStateChanged(tile); |
| 447 } | 447 } |
| 448 | 448 |
| 449 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state", | 449 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state", |
| 450 BasicStateAsValue()); | 450 BasicStateAsValue()); |
| 451 | 451 |
| 452 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, | 452 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
| 453 resource_pool_->total_memory_usage_bytes() - | 453 resource_pool_->total_memory_usage_bytes() - |
| 454 resource_pool_->acquired_memory_usage_bytes()); | 454 resource_pool_->acquired_memory_usage_bytes()); |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 937 NotifyReadyToDraw(); | 937 NotifyReadyToDraw(); |
| 938 } | 938 } |
| 939 | 939 |
| 940 void TileManager::CheckIfMoreTilesNeedToBePrepared() { | 940 void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
| 941 tile_task_runner_->CheckForCompletedTasks(); | 941 tile_task_runner_->CheckForCompletedTasks(); |
| 942 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 942 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 943 | 943 |
| 944 // When OOM, keep re-assigning memory until we reach a steady state | 944 // When OOM, keep re-assigning memory until we reach a steady state |
| 945 // where top-priority tiles are initialized. | 945 // where top-priority tiles are initialized. |
| 946 TileVector tiles_that_need_to_be_rasterized; | 946 TileVector tiles_that_need_to_be_rasterized; |
| 947 RasterTilePriorityQueue raster_priority_queue; | 947 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
| 948 client_->BuildRasterQueue(&raster_priority_queue, global_state_.tree_priority, | 948 client_->BuildRasterQueue(global_state_.tree_priority, |
| 949 RasterTilePriorityQueue::Type::ALL); | 949 RasterTilePriorityQueue::Type::ALL)); |
| 950 AssignGpuMemoryToTiles(&raster_priority_queue, scheduled_raster_task_limit_, | 950 AssignGpuMemoryToTiles(raster_priority_queue.get(), |
| 951 scheduled_raster_task_limit_, | |
| 951 &tiles_that_need_to_be_rasterized); | 952 &tiles_that_need_to_be_rasterized); |
| 952 | 953 |
| 953 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 954 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
| 954 // steady memory state. Keep scheduling tasks until we reach this state. | 955 // steady memory state. Keep scheduling tasks until we reach this state. |
| 955 if (!tiles_that_need_to_be_rasterized.empty()) { | 956 if (!tiles_that_need_to_be_rasterized.empty()) { |
| 956 ScheduleTasks(tiles_that_need_to_be_rasterized); | 957 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 957 return; | 958 return; |
| 958 } | 959 } |
| 959 | 960 |
| 960 FreeResourcesForReleasedTiles(); | 961 FreeResourcesForReleasedTiles(); |
| 961 | 962 |
| 962 resource_pool_->ReduceResourceUsage(); | 963 resource_pool_->ReduceResourceUsage(); |
| 963 | 964 |
| 964 // We don't reserve memory for required-for-activation tiles during | 965 // We don't reserve memory for required-for-activation tiles during |
| 965 // accelerated gestures, so we just postpone activation when we don't | 966 // accelerated gestures, so we just postpone activation when we don't |
| 966 // have these tiles, and activate after the accelerated gesture. | 967 // have these tiles, and activate after the accelerated gesture. |
| 967 // Likewise if we don't allow any tiles (as is the case when we're | 968 // Likewise if we don't allow any tiles (as is the case when we're |
| 968 // invisible), if we have tiles that aren't ready, then we shouldn't | 969 // invisible), if we have tiles that aren't ready, then we shouldn't |
| 969 // activate as activation can cause checkerboards. | 970 // activate as activation can cause checkerboards. |
| 970 bool allow_rasterize_on_demand = | 971 bool allow_rasterize_on_demand = |
| 971 global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY && | 972 global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY && |
| 972 global_state_.memory_limit_policy != ALLOW_NOTHING; | 973 global_state_.memory_limit_policy != ALLOW_NOTHING; |
| 973 | 974 |
| 974 // Use on-demand raster for any required-for-activation tiles that have | 975 // Use on-demand raster for any required-for-activation tiles that have |
| 975 // not been been assigned memory after reaching a steady memory state. This | 976 // not been been assigned memory after reaching a steady memory state. This |
| 976 // ensures that we activate even when OOM. Note that we can't reuse the queue | 977 // ensures that we activate even when OOM. Note that we can't reuse the queue |
| 977 // we used for AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call | 978 // we used for AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call |
| 978 // could have evicted some tiles that would not be picked up by the old raster | 979 // could have evicted some tiles that would not be picked up by the old raster |
| 979 // queue. | 980 // queue. |
| 980 RasterTilePriorityQueue required_for_activation_queue; | 981 scoped_ptr<RasterTilePriorityQueue> required_for_activation_queue( |
| 981 client_->BuildRasterQueue( | 982 client_->BuildRasterQueue( |
| 982 &required_for_activation_queue, global_state_.tree_priority, | 983 global_state_.tree_priority, |
| 983 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 984 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); |
| 984 | 985 |
| 985 // If we have tiles to mark as rasterize on demand, but we don't allow | 986 // If we have tiles to mark as rasterize on demand, but we don't allow |
| 986 // rasterize on demand, then skip activation and return early. | 987 // rasterize on demand, then skip activation and return early. |
| 987 if (!required_for_activation_queue.IsEmpty() && !allow_rasterize_on_demand) | 988 if (!required_for_activation_queue->IsEmpty() && !allow_rasterize_on_demand) |
| 988 return; | 989 return; |
| 989 | 990 |
| 990 // Mark required tiles as rasterize on demand. | 991 // Mark required tiles as rasterize on demand. |
| 991 for (; !required_for_activation_queue.IsEmpty(); | 992 for (; !required_for_activation_queue->IsEmpty(); |
| 992 required_for_activation_queue.Pop()) { | 993 required_for_activation_queue->Pop()) { |
| 993 Tile* tile = required_for_activation_queue.Top(); | 994 Tile* tile = required_for_activation_queue->Top(); |
| 994 tile->draw_info().set_rasterize_on_demand(); | 995 tile->draw_info().set_rasterize_on_demand(); |
| 995 client_->NotifyTileStateChanged(tile); | 996 client_->NotifyTileStateChanged(tile); |
| 996 } | 997 } |
| 997 | 998 |
| 998 DCHECK(IsReadyToActivate()); | 999 DCHECK(IsReadyToActivate()); |
| 999 ready_to_activate_check_notifier_.Schedule(); | 1000 ready_to_activate_check_notifier_.Schedule(); |
| 1000 } | 1001 } |
| 1001 | 1002 |
| 1002 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { | 1003 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { |
| 1003 } | 1004 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1043 result -= other; | 1044 result -= other; |
| 1044 return result; | 1045 return result; |
| 1045 } | 1046 } |
| 1046 | 1047 |
| 1047 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 1048 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
| 1048 return memory_bytes_ > limit.memory_bytes_ || | 1049 return memory_bytes_ > limit.memory_bytes_ || |
| 1049 resource_count_ > limit.resource_count_; | 1050 resource_count_ > limit.resource_count_; |
| 1050 } | 1051 } |
| 1051 | 1052 |
| 1052 } // namespace cc | 1053 } // namespace cc |
| OLD | NEW |