| Index: cc/tiles/tile_manager.cc
|
| diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
|
| index e92a3df33b30d368d9a0058b51b60785663f0eba..23d2eca12bc23f35ee754226ba18be01066341ca 100644
|
| --- a/cc/tiles/tile_manager.cc
|
| +++ b/cc/tiles/tile_manager.cc
|
| @@ -228,24 +228,19 @@ RasterTaskCompletionStatsAsValue(const RasterTaskCompletionStats& stats) {
|
| scoped_ptr<TileManager> TileManager::Create(
|
| TileManagerClient* client,
|
| base::SequencedTaskRunner* task_runner,
|
| - ResourcePool* resource_pool,
|
| - TileTaskRunner* tile_task_runner,
|
| size_t scheduled_raster_task_limit) {
|
| - return make_scoped_ptr(new TileManager(client, task_runner, resource_pool,
|
| - tile_task_runner,
|
| - scheduled_raster_task_limit));
|
| + return make_scoped_ptr(
|
| + new TileManager(client, task_runner, scheduled_raster_task_limit));
|
| }
|
|
|
| TileManager::TileManager(
|
| TileManagerClient* client,
|
| const scoped_refptr<base::SequencedTaskRunner>& task_runner,
|
| - ResourcePool* resource_pool,
|
| - TileTaskRunner* tile_task_runner,
|
| size_t scheduled_raster_task_limit)
|
| : client_(client),
|
| task_runner_(task_runner),
|
| - resource_pool_(resource_pool),
|
| - tile_task_runner_(tile_task_runner),
|
| + resource_pool_(nullptr),
|
| + tile_task_runner_(nullptr),
|
| scheduled_raster_task_limit_(scheduled_raster_task_limit),
|
| all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
|
| did_check_for_completed_tasks_since_last_schedule_tasks_(true),
|
| @@ -259,12 +254,16 @@ TileManager::TileManager(
|
| base::Unretained(this))),
|
| has_scheduled_tile_tasks_(false),
|
| prepare_tiles_count_(0u) {
|
| - tile_task_runner_->SetClient(this);
|
| }
|
|
|
| TileManager::~TileManager() {
|
| - // Reset global state and manage. This should cause
|
| - // our memory usage to drop to zero.
|
| + FinishTasksAndCleanUp();
|
| +}
|
| +
|
| +void TileManager::FinishTasksAndCleanUp() {
|
| + if (!tile_task_runner_)
|
| + return;
|
| +
|
| global_state_ = GlobalStateThatImpactsTilePriority();
|
|
|
| TileTaskQueue empty;
|
| @@ -278,6 +277,23 @@ TileManager::~TileManager() {
|
|
|
| FreeResourcesForReleasedTiles();
|
| CleanUpReleasedTiles();
|
| +
|
| + tile_task_runner_ = nullptr;
|
| + resource_pool_ = nullptr;
|
| + more_tiles_need_prepare_check_notifier_.Cancel();
|
| + signals_check_notifier_.Cancel();
|
| +}
|
| +
|
| +void TileManager::SetResources(ResourcePool* resource_pool,
|
| + TileTaskRunner* tile_task_runner,
|
| + size_t scheduled_raster_task_limit) {
|
| + DCHECK(!tile_task_runner_);
|
| + DCHECK(tile_task_runner);
|
| +
|
| + scheduled_raster_task_limit_ = scheduled_raster_task_limit;
|
| + resource_pool_ = resource_pool;
|
| + tile_task_runner_ = tile_task_runner;
|
| + tile_task_runner_->SetClient(this);
|
| }
|
|
|
| void TileManager::Release(Tile* tile) {
|
| @@ -324,6 +340,8 @@ void TileManager::CleanUpReleasedTiles() {
|
| void TileManager::DidFinishRunningTileTasks(TaskSet task_set) {
|
| TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set",
|
| TaskSetName(task_set));
|
| + DCHECK(resource_pool_);
|
| + DCHECK(tile_task_runner_);
|
|
|
| switch (task_set) {
|
| case ALL: {
|
| @@ -360,13 +378,19 @@ void TileManager::DidFinishRunningTileTasks(TaskSet task_set) {
|
| NOTREACHED();
|
| }
|
|
|
| -void TileManager::PrepareTiles(
|
| +bool TileManager::PrepareTiles(
|
| const GlobalStateThatImpactsTilePriority& state) {
|
| ++prepare_tiles_count_;
|
|
|
| TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id",
|
| prepare_tiles_count_);
|
|
|
| + if (!tile_task_runner_) {
|
| + TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted",
|
| + TRACE_EVENT_SCOPE_THREAD);
|
| + return false;
|
| + }
|
| +
|
| signals_.reset();
|
| global_state_ = state;
|
|
|
| @@ -403,11 +427,17 @@ void TileManager::PrepareTiles(
|
| TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
|
| resource_pool_->total_memory_usage_bytes() -
|
| resource_pool_->acquired_memory_usage_bytes());
|
| + return true;
|
| }
|
|
|
| void TileManager::Flush() {
|
| TRACE_EVENT0("cc", "TileManager::Flush");
|
|
|
| + if (!tile_task_runner_) {
|
| + TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD);
|
| + return;
|
| + }
|
| +
|
| tile_task_runner_->CheckForCompletedTasks();
|
|
|
| did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
| @@ -504,6 +534,9 @@ void TileManager::AssignGpuMemoryToTiles(
|
| PrioritizedTileVector* tiles_that_need_to_be_rasterized) {
|
| TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles");
|
|
|
| + DCHECK(resource_pool_);
|
| + DCHECK(tile_task_runner_);
|
| +
|
| // Maintain the list of released resources that can potentially be re-used
|
| // or deleted. If this operation becomes expensive too, only do this after
|
| // some resource(s) was returned. Note that in that case, one also need to
|
| @@ -821,6 +854,9 @@ ScopedTilePtr TileManager::CreateTile(const gfx::Size& desired_texture_size,
|
| int layer_id,
|
| int source_frame_number,
|
| int flags) {
|
| + // We need to have a tile task worker pool to do anything meaningful with
|
| + // tiles.
|
| + DCHECK(tile_task_runner_);
|
| ScopedTilePtr tile(new Tile(this, desired_texture_size, content_rect,
|
| contents_scale, layer_id, source_frame_number,
|
| flags));
|
|
|