| Index: cc/resources/tile_manager.cc
|
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
|
| index d83b8243682e717fd3cf33b585742eff0c9d5472..d4fe7f3657e06f5be2bcd5e86f22fd4cc623d916 100644
|
| --- a/cc/resources/tile_manager.cc
|
| +++ b/cc/resources/tile_manager.cc
|
| @@ -209,14 +209,12 @@ scoped_ptr<TileManager> TileManager::Create(
|
| base::SequencedTaskRunner* task_runner,
|
| ResourcePool* resource_pool,
|
| Rasterizer* rasterizer,
|
| + GpuRasterizer* gpu_rasterizer,
|
| RenderingStatsInstrumentation* rendering_stats_instrumentation,
|
| size_t scheduled_raster_task_limit) {
|
| - return make_scoped_ptr(new TileManager(client,
|
| - task_runner,
|
| - resource_pool,
|
| - rasterizer,
|
| - rendering_stats_instrumentation,
|
| - scheduled_raster_task_limit));
|
| + return make_scoped_ptr(new TileManager(
|
| + client, task_runner, resource_pool, rasterizer, gpu_rasterizer,
|
| + rendering_stats_instrumentation, scheduled_raster_task_limit));
|
| }
|
|
|
| TileManager::TileManager(
|
| @@ -224,12 +222,14 @@ TileManager::TileManager(
|
| const scoped_refptr<base::SequencedTaskRunner>& task_runner,
|
| ResourcePool* resource_pool,
|
| Rasterizer* rasterizer,
|
| + GpuRasterizer* gpu_rasterizer,
|
| RenderingStatsInstrumentation* rendering_stats_instrumentation,
|
| size_t scheduled_raster_task_limit)
|
| : client_(client),
|
| task_runner_(task_runner),
|
| resource_pool_(resource_pool),
|
| rasterizer_(rasterizer),
|
| + gpu_rasterizer_(gpu_rasterizer),
|
| scheduled_raster_task_limit_(scheduled_raster_task_limit),
|
| all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
|
| rendering_stats_instrumentation_(rendering_stats_instrumentation),
|
| @@ -329,8 +329,12 @@ void TileManager::DidFinishRunningTasks(TaskSet task_set) {
|
| rasterizer_->CheckForCompletedTasks();
|
| did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
|
|
| + client_->BuildRasterQueue(&raster_priority_queue_,
|
| + global_state_.tree_priority);
|
| TileVector tiles_that_need_to_be_rasterized;
|
| - AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized);
|
| + AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
|
| + scheduled_raster_task_limit_);
|
| + raster_priority_queue_.Reset();
|
|
|
| // |tiles_that_need_to_be_rasterized| will be empty when we reach a
|
| // steady memory state. Keep scheduling tasks until we reach this state.
|
| @@ -354,12 +358,11 @@ void TileManager::DidFinishRunningTasks(TaskSet task_set) {
|
| global_state_.memory_limit_policy != ALLOW_NOTHING;
|
|
|
| // Use on-demand raster for any required-for-activation tiles that have
|
| - // not
|
| - // been been assigned memory after reaching a steady memory state. This
|
| - // ensures that we activate even when OOM. Note that we have to rebuilt
|
| - // the
|
| - // queue in case the last AssignGpuMemoryToTiles evicted some tiles that
|
| - // would otherwise not be picked up by the old raster queue.
|
| + // not been been assigned memory after reaching a steady memory
|
| + // state. This ensures that we activate even when OOM. Note that we have
|
| + // to rebuilt the queue in case the last AssignGpuMemoryToTiles evicted
|
| + // some tiles that would otherwise not be picked up by the old raster
|
| + // queue.
|
| client_->BuildRasterQueue(&raster_priority_queue_,
|
| global_state_.tree_priority);
|
| bool ready_to_activate = true;
|
| @@ -398,6 +401,55 @@ void TileManager::DidFinishRunningTasks(TaskSet task_set) {
|
| NOTREACHED();
|
| }
|
|
|
| +void TileManager::RasterizeTiles(
|
| + const GlobalStateThatImpactsTilePriority& state) {
|
| + DCHECK(gpu_rasterizer_);
|
| + TRACE_EVENT0("cc", "TileManager::RasterizeTiles");
|
| +
|
| + global_state_ = state;
|
| +
|
| + FreeResourcesForReleasedTiles();
|
| + CleanUpReleasedTiles();
|
| +
|
| + client_->BuildRasterQueue(&raster_priority_queue_,
|
| + global_state_.tree_priority);
|
| + TileVector tiles_that_need_to_be_rasterized;
|
| + AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
|
| + std::numeric_limits<size_t>::max());
|
| +
|
| + // We must reduce the amount of unused resoruces before calling
|
| + // RunTasks to prevent usage from rising above limits.
|
| + resource_pool_->ReduceResourceUsage();
|
| +
|
| + // Run and complete all raster task synchronously.
|
| + gpu_rasterizer_->RasterizeTiles(tiles_that_need_to_be_rasterized,
|
| + resource_pool_, this);
|
| +
|
| + // Use on-demand raster for any tiles that have not been been assigned
|
| + // memory. This ensures that we draw even when OOM.
|
| + while (!raster_priority_queue_.IsEmpty()) {
|
| + Tile* tile = raster_priority_queue_.Top();
|
| + ManagedTileState& mts = tile->managed_state();
|
| +
|
| + if (!mts.draw_info.IsReadyToDraw()) {
|
| + mts.draw_info.set_rasterize_on_demand();
|
| + client_->NotifyTileStateChanged(tile);
|
| + }
|
| + raster_priority_queue_.Pop();
|
| + }
|
| + raster_priority_queue_.Reset();
|
| +
|
| + if (IsReadyToDraw())
|
| + client_->NotifyReadyToDraw();
|
| +
|
| + TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state",
|
| + BasicStateAsValue());
|
| +
|
| + TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
|
| + resource_pool_->total_memory_usage_bytes() -
|
| + resource_pool_->acquired_memory_usage_bytes());
|
| +}
|
| +
|
| void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) {
|
| TRACE_EVENT0("cc", "TileManager::ManageTiles");
|
|
|
| @@ -413,8 +465,12 @@ void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) {
|
| FreeResourcesForReleasedTiles();
|
| CleanUpReleasedTiles();
|
|
|
| + client_->BuildRasterQueue(&raster_priority_queue_,
|
| + global_state_.tree_priority);
|
| TileVector tiles_that_need_to_be_rasterized;
|
| - AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized);
|
| + AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
|
| + scheduled_raster_task_limit_);
|
| + raster_priority_queue_.Reset();
|
|
|
| // Finally, schedule rasterizer tasks.
|
| ScheduleTasks(tiles_that_need_to_be_rasterized);
|
| @@ -531,7 +587,8 @@ bool TileManager::TilePriorityViolatesMemoryPolicy(
|
| }
|
|
|
| void TileManager::AssignGpuMemoryToTiles(
|
| - TileVector* tiles_that_need_to_be_rasterized) {
|
| + TileVector* tiles_that_need_to_be_rasterized,
|
| + size_t scheduled_raster_task_limit) {
|
| TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles");
|
|
|
| // Maintain the list of released resources that can potentially be re-used
|
| @@ -555,8 +612,6 @@ void TileManager::AssignGpuMemoryToTiles(
|
| resource_pool_->acquired_resource_count());
|
|
|
| eviction_priority_queue_is_up_to_date_ = false;
|
| - client_->BuildRasterQueue(&raster_priority_queue_,
|
| - global_state_.tree_priority);
|
|
|
| while (!raster_priority_queue_.IsEmpty()) {
|
| Tile* tile = raster_priority_queue_.Top();
|
| @@ -572,7 +627,7 @@ void TileManager::AssignGpuMemoryToTiles(
|
|
|
| // We won't be able to schedule this tile, so break out early.
|
| if (tiles_that_need_to_be_rasterized->size() >=
|
| - scheduled_raster_task_limit_) {
|
| + scheduled_raster_task_limit) {
|
| all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
|
| break;
|
| }
|
| @@ -637,8 +692,6 @@ void TileManager::AssignGpuMemoryToTiles(
|
| memory_stats_from_last_assign_.had_enough_memory =
|
| had_enough_memory_to_schedule_tiles_needed_now;
|
|
|
| - raster_priority_queue_.Reset();
|
| -
|
| TRACE_EVENT_END2("cc",
|
| "TileManager::AssignGpuMemoryToTiles",
|
| "all_tiles_that_need_to_be_rasterized_are_scheduled",
|
| @@ -794,6 +847,13 @@ void TileManager::OnImageDecodeTaskCompleted(int layer_id,
|
| pixel_ref_tasks.erase(task_it);
|
| }
|
|
|
| +void TileManager::CompleteRasterTask(
|
| + Tile::Id tile_id,
|
| + scoped_ptr<ScopedResource> resource,
|
| + const RasterSource::SolidColorAnalysis& analysis) {
|
| + OnRasterTaskCompleted(tile_id, resource.Pass(), analysis, false);
|
| +}
|
| +
|
| void TileManager::OnRasterTaskCompleted(
|
| Tile::Id tile_id,
|
| scoped_ptr<ScopedResource> resource,
|
|
|