Chromium Code Reviews| Index: cc/trees/layer_tree_host_impl.cc |
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
| index ddb4dc951a8ea75b5a68c3fd9ad5dad38e24bd21..c7a1232b868e01b72b8b2b4522e0319c38992ea3 100644 |
| --- a/cc/trees/layer_tree_host_impl.cc |
| +++ b/cc/trees/layer_tree_host_impl.cc |
| @@ -199,6 +199,12 @@ LayerTreeHostImpl::LayerTreeHostImpl( |
| : client_(client), |
| proxy_(proxy), |
| current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
| + tile_manager_( |
| + TileManager::Create(this, |
| + GetTaskRunner(), |
| + IsSynchronousSingleThreaded() |
| + ? std::numeric_limits<size_t>::max() |
| + : settings.scheduled_raster_task_limit)), |
| content_is_suitable_for_gpu_rasterization_(true), |
| has_gpu_rasterization_trigger_(false), |
| use_gpu_rasterization_(false), |
| @@ -288,7 +294,7 @@ LayerTreeHostImpl::~LayerTreeHostImpl() { |
| recycle_tree_ = nullptr; |
| pending_tree_ = nullptr; |
| active_tree_ = nullptr; |
| - DestroyTileManager(); |
| + CleanUpTileManager(); |
| } |
| void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { |
| @@ -330,9 +336,8 @@ void LayerTreeHostImpl::CommitComplete() { |
| bool update_lcd_text = true; |
| sync_tree()->UpdateDrawProperties(update_lcd_text); |
| // Start working on newly created tiles immediately if needed. |
| - if (tile_manager_ && tile_priorities_dirty_) { |
| - PrepareTiles(); |
| - } else { |
| + bool did_prepare_tiles = PrepareTiles(); |
| + if (!did_prepare_tiles) { |
|
enne (OOO)
2015/07/06 18:07:26
Would it be cleaner to just have PrepareTiles alwa
vmpstr
2015/07/06 18:41:35
Maybe. I've left a TODO here, because I think it's
|
| NotifyReadyToActivate(); |
| // Ensure we get ReadyToDraw signal even when PrepareTiles not run. This |
| @@ -408,16 +413,16 @@ void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { |
| AnimateTopControls(monotonic_time); |
| } |
| -void LayerTreeHostImpl::PrepareTiles() { |
| - if (!tile_manager_) |
| - return; |
| +bool LayerTreeHostImpl::PrepareTiles() { |
| if (!tile_priorities_dirty_) |
| - return; |
| - |
| - tile_priorities_dirty_ = false; |
| - tile_manager_->PrepareTiles(global_tile_state_); |
| + return false; |
| - client_->DidPrepareTiles(); |
| + bool did_prepare_tiles = tile_manager_->PrepareTiles(global_tile_state_); |
| + if (did_prepare_tiles) { |
| + tile_priorities_dirty_ = false; |
| + client_->DidPrepareTiles(); |
| + } |
| + return did_prepare_tiles; |
| } |
| void LayerTreeHostImpl::StartPageScaleAnimation( |
| @@ -1167,7 +1172,7 @@ size_t LayerTreeHostImpl::SourceAnimationFrameNumberForTesting() const { |
| void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( |
| const ManagedMemoryPolicy& policy) { |
| - if (!tile_manager_) |
| + if (!resource_pool_) |
| return; |
| global_tile_state_.hard_memory_limit_in_bytes = 0; |
| @@ -1319,14 +1324,17 @@ void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
| // This is short term solution to synchronously drop tile resources when |
| // using synchronous compositing to avoid memory usage regression. |
| // TODO(boliu): crbug.com/499004 to track removing this. |
| - if (!policy.bytes_limit_when_visible && tile_manager_ && |
| + if (!policy.bytes_limit_when_visible && resource_pool_ && |
| settings_.using_synchronous_renderer_compositor) { |
| ReleaseTreeResources(); |
| - // TileManager destruction will synchronoulsy wait for all tile workers to |
| + // TileManager's reset will synchronoulsy wait for all tile workers to |
| // be cancelled or completed. This allows all resources to be freed |
| - // synchronously. |
| - DestroyTileManager(); |
| - CreateAndSetTileManager(); |
| + // synchronously. Note that we don't need to use LayerTreeHostImpl |
| + // since resource_pool and tile_task_worker_pool will be the same. |
| + tile_manager_->FinishTasksAndCleanUp(); |
| + tile_manager_->SetResources(resource_pool_.get(), |
| + tile_task_worker_pool_->AsTileTaskRunner()); |
| + UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| RecreateTreeResources(); |
| } |
| } |
| @@ -1433,9 +1441,7 @@ void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) { |
| // In OOM, we now might be able to release more resources that were held |
| // because they were exported. |
| - if (tile_manager_) { |
| - DCHECK(resource_pool_); |
| - |
| + if (resource_pool_) { |
| resource_pool_->CheckBusyResources(false); |
| resource_pool_->ReduceResourceUsage(); |
| } |
| @@ -1678,11 +1684,13 @@ void LayerTreeHostImpl::UpdateTreeResourcesForGpuRasterizationIfNeeded() { |
| return; |
| // Clean up and replace existing tile manager with another one that uses |
| - // appropriate rasterizer. |
| + // appropriate rasterizer. Only do this however if we already have a |
| + // resource pool, since otherwise we might not be able to create a new |
| + // one. |
| ReleaseTreeResources(); |
| - if (tile_manager_) { |
| - DestroyTileManager(); |
| - CreateAndSetTileManager(); |
| + if (resource_pool_) { |
| + CleanUpTileManager(); |
| + RecreateTileManagerResources(); |
| } |
| RecreateTreeResources(); |
| @@ -2046,24 +2054,11 @@ void LayerTreeHostImpl::CreateAndSetRenderer() { |
| client_->UpdateRendererCapabilitiesOnImplThread(); |
| } |
| -void LayerTreeHostImpl::CreateAndSetTileManager() { |
| - DCHECK(!tile_manager_); |
| - DCHECK(output_surface_); |
| - DCHECK(resource_provider_); |
| - |
| +void LayerTreeHostImpl::RecreateTileManagerResources() { |
|
enne (OOO)
2015/07/06 18:07:26
bikeshedding: This seems less Recreate and more ju
vmpstr
2015/07/06 18:41:35
Done.
|
| CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, |
| &staging_resource_pool_); |
| - DCHECK(tile_task_worker_pool_); |
| - DCHECK(resource_pool_); |
| - |
| - DCHECK(GetTaskRunner()); |
| - size_t scheduled_raster_task_limit = |
| - IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() |
| - : settings_.scheduled_raster_task_limit; |
| - tile_manager_ = TileManager::Create( |
| - this, GetTaskRunner(), resource_pool_.get(), |
| - tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); |
| - |
| + tile_manager_->SetResources(resource_pool_.get(), |
| + tile_task_worker_pool_->AsTileTaskRunner()); |
| UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| } |
| @@ -2183,8 +2178,8 @@ void LayerTreeHostImpl::PostFrameTimingEvents( |
| main_frame_events.Pass()); |
| } |
| -void LayerTreeHostImpl::DestroyTileManager() { |
| - tile_manager_ = nullptr; |
| +void LayerTreeHostImpl::CleanUpTileManager() { |
| + tile_manager_->FinishTasksAndCleanUp(); |
| resource_pool_ = nullptr; |
| staging_resource_pool_ = nullptr; |
| tile_task_worker_pool_ = nullptr; |
| @@ -2206,7 +2201,7 @@ bool LayerTreeHostImpl::InitializeRenderer( |
| // Note: order is important here. |
| renderer_ = nullptr; |
| - DestroyTileManager(); |
| + CleanUpTileManager(); |
| resource_provider_ = nullptr; |
| output_surface_ = nullptr; |
| @@ -2231,7 +2226,7 @@ bool LayerTreeHostImpl::InitializeRenderer( |
| // Since the new renderer may be capable of MSAA, update status here. |
| UpdateGpuRasterizationStatus(); |
| - CreateAndSetTileManager(); |
| + RecreateTileManagerResources(); |
| RecreateTreeResources(); |
| // Initialize vsync parameters to sane values. |