| Index: cc/tiles/tile_manager.cc
 | 
| diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
 | 
| index 58fc640d8ddabec0022996ae04e2099c2d801543..e757f11d230ab5726c7c75fc219b0672ff7c608d 100644
 | 
| --- a/cc/tiles/tile_manager.cc
 | 
| +++ b/cc/tiles/tile_manager.cc
 | 
| @@ -43,7 +43,7 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER(
 | 
|  
 | 
|  class RasterTaskImpl : public TileTask {
 | 
|   public:
 | 
| -  RasterTaskImpl(const Resource* resource,
 | 
| +  RasterTaskImpl(Resource* resource,
 | 
|                   scoped_refptr<RasterSource> raster_source,
 | 
|                   const gfx::Rect& content_rect,
 | 
|                   const gfx::Rect& invalid_content_rect,
 | 
| @@ -52,15 +52,17 @@ class RasterTaskImpl : public TileTask {
 | 
|                   TileResolution tile_resolution,
 | 
|                   int layer_id,
 | 
|                   uint64_t source_prepare_tiles_id,
 | 
| -                 const void* tile,
 | 
| +                 Tile* tile,
 | 
|                   uint64_t new_content_id,
 | 
|                   uint64_t previous_content_id,
 | 
|                   uint64_t resource_content_id,
 | 
|                   int source_frame_number,
 | 
| -                 const base::Callback<void(bool)>& reply,
 | 
| +                 std::unique_ptr<RasterBuffer> raster_buffer,
 | 
|                   TileTask::Vector* dependencies,
 | 
|                   bool supports_concurrent_execution)
 | 
| -      : TileTask(supports_concurrent_execution, dependencies),
 | 
| +      : TileTask(TileTask::Type::RASTER,
 | 
| +                 supports_concurrent_execution,
 | 
| +                 dependencies),
 | 
|          resource_(resource),
 | 
|          raster_source_(std::move(raster_source)),
 | 
|          content_rect_(content_rect),
 | 
| @@ -75,7 +77,7 @@ class RasterTaskImpl : public TileTask {
 | 
|          previous_content_id_(previous_content_id),
 | 
|          resource_content_id_(resource_content_id),
 | 
|          source_frame_number_(source_frame_number),
 | 
| -        reply_(reply) {}
 | 
| +        raster_buffer_(std::move(raster_buffer)) {}
 | 
|  
 | 
|    // Overridden from Task:
 | 
|    void RunOnWorkerThread() override {
 | 
| @@ -97,22 +99,13 @@ class RasterTaskImpl : public TileTask {
 | 
|                               contents_scale_, playback_settings_);
 | 
|    }
 | 
|  
 | 
| -  // Overridden from TileTask:
 | 
| -  void ScheduleOnOriginThread(RasterBufferProvider* provider) override {
 | 
| -    DCHECK(!raster_buffer_);
 | 
| -    raster_buffer_ = provider->AcquireBufferForRaster(
 | 
| -        resource_, resource_content_id_, previous_content_id_);
 | 
| -  }
 | 
| -  void CompleteOnOriginThread(RasterBufferProvider* provider) override {
 | 
| -    provider->ReleaseBufferForRaster(std::move(raster_buffer_));
 | 
| -    reply_.Run(!state().IsFinished());
 | 
| -  }
 | 
| -
 | 
|   protected:
 | 
|    ~RasterTaskImpl() override { DCHECK(!raster_buffer_); }
 | 
|  
 | 
| - private:
 | 
| -  const Resource* resource_;
 | 
| +  // TODO(prashant.n) Move this class from unnamed namespace to
 | 
| +  // tile_task_manager.cc and use friend class. crbug.com/599863.
 | 
| + public:
 | 
| +  Resource* resource_;
 | 
|    scoped_refptr<RasterSource> raster_source_;
 | 
|    gfx::Rect content_rect_;
 | 
|    gfx::Rect invalid_content_rect_;
 | 
| @@ -121,14 +114,14 @@ class RasterTaskImpl : public TileTask {
 | 
|    TileResolution tile_resolution_;
 | 
|    int layer_id_;
 | 
|    uint64_t source_prepare_tiles_id_;
 | 
| -  const void* tile_;
 | 
| +  Tile* tile_;
 | 
|    uint64_t new_content_id_;
 | 
|    uint64_t previous_content_id_;
 | 
|    uint64_t resource_content_id_;
 | 
|    int source_frame_number_;
 | 
| -  const base::Callback<void(bool)> reply_;
 | 
|    std::unique_ptr<RasterBuffer> raster_buffer_;
 | 
|  
 | 
| + private:
 | 
|    DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
 | 
|  };
 | 
|  
 | 
| @@ -188,7 +181,7 @@ void InsertNodeForDecodeTask(TaskGraph* graph,
 | 
|    if (task->dependencies().size()) {
 | 
|      DCHECK_EQ(task->dependencies().size(), 1u);
 | 
|      auto* dependency = task->dependencies()[0].get();
 | 
| -    if (!dependency->HasCompleted()) {
 | 
| +    if (!dependency->state().IsCompleted()) {
 | 
|        InsertNodeForDecodeTask(graph, dependency, use_foreground_category,
 | 
|                                priority);
 | 
|        graph->edges.push_back(TaskGraph::Edge(dependency, task));
 | 
| @@ -213,7 +206,7 @@ void InsertNodesForRasterTask(TaskGraph* graph,
 | 
|      TileTask* decode_task = it->get();
 | 
|  
 | 
|      // Skip if already decoded.
 | 
| -    if (decode_task->HasCompleted())
 | 
| +    if (decode_task->state().IsCompleted())
 | 
|        continue;
 | 
|  
 | 
|      dependencies++;
 | 
| @@ -256,7 +249,7 @@ class TaskSetFinishedTaskImpl : public TileTask {
 | 
|    explicit TaskSetFinishedTaskImpl(
 | 
|        base::SequencedTaskRunner* task_runner,
 | 
|        const base::Closure& on_task_set_finished_callback)
 | 
| -      : TileTask(true),
 | 
| +      : TileTask(TileTask::Type::DEFAULT, true),
 | 
|          task_runner_(task_runner),
 | 
|          on_task_set_finished_callback_(on_task_set_finished_callback) {}
 | 
|  
 | 
| @@ -266,10 +259,6 @@ class TaskSetFinishedTaskImpl : public TileTask {
 | 
|      TaskSetFinished();
 | 
|    }
 | 
|  
 | 
| -  // Overridden from TileTask:
 | 
| -  void ScheduleOnOriginThread(RasterBufferProvider* provider) override {}
 | 
| -  void CompleteOnOriginThread(RasterBufferProvider* provider) override {}
 | 
| -
 | 
|   protected:
 | 
|    ~TaskSetFinishedTaskImpl() override {}
 | 
|  
 | 
| @@ -357,7 +346,7 @@ void TileManager::FinishTasksAndCleanUp() {
 | 
|    // |orphan_tasks_|.
 | 
|    orphan_tasks_.clear();
 | 
|  
 | 
| -  tile_task_manager_->CheckForCompletedTasks();
 | 
| +  CheckForCompletedTasks();
 | 
|  
 | 
|    FreeResourcesForReleasedTiles();
 | 
|    CleanUpReleasedTiles();
 | 
| @@ -469,10 +458,8 @@ bool TileManager::PrepareTiles(
 | 
|  
 | 
|    // We need to call CheckForCompletedTasks() once in-between each call
 | 
|    // to ScheduleTasks() to prevent canceled tasks from being scheduled.
 | 
| -  if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
 | 
| -    tile_task_manager_->CheckForCompletedTasks();
 | 
| -    did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
 | 
| -  }
 | 
| +  if (!did_check_for_completed_tasks_since_last_schedule_tasks_)
 | 
| +    CheckForCompletedTasks();
 | 
|  
 | 
|    FreeResourcesForReleasedTiles();
 | 
|    CleanUpReleasedTiles();
 | 
| @@ -507,9 +494,7 @@ void TileManager::Flush() {
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  tile_task_manager_->CheckForCompletedTasks();
 | 
| -
 | 
| -  did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
 | 
| +  CheckForCompletedTasks();
 | 
|  
 | 
|    TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
 | 
|                         RasterTaskCompletionStatsAsValue(flush_stats_));
 | 
| @@ -795,7 +780,7 @@ void TileManager::ScheduleTasks(
 | 
|        tile->raster_task_ = CreateRasterTask(prioritized_tile);
 | 
|  
 | 
|      TileTask* task = tile->raster_task_.get();
 | 
| -    DCHECK(!task->HasCompleted());
 | 
| +    DCHECK(!task->state().IsCompleted());
 | 
|  
 | 
|      if (tile->required_for_activation()) {
 | 
|        required_for_activate_count++;
 | 
| @@ -915,57 +900,88 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
 | 
|    }
 | 
|  
 | 
|    bool supports_concurrent_execution = !use_gpu_rasterization_;
 | 
| +  std::unique_ptr<RasterBuffer> raster_buffer =
 | 
| +      tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster(
 | 
| +          resource, resource_content_id, tile->invalidated_id());
 | 
|    return make_scoped_refptr(new RasterTaskImpl(
 | 
|        resource, prioritized_tile.raster_source(), tile->content_rect(),
 | 
|        tile->invalidated_content_rect(), tile->contents_scale(),
 | 
|        playback_settings, prioritized_tile.priority().resolution,
 | 
| -      tile->layer_id(), prepare_tiles_count_, static_cast<const void*>(tile),
 | 
| -      tile->id(), tile->invalidated_id(), resource_content_id,
 | 
| -      tile->source_frame_number(),
 | 
| -      base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this),
 | 
| -                 tile->id(), resource),
 | 
| -      &decode_tasks, supports_concurrent_execution));
 | 
| +      tile->layer_id(), prepare_tiles_count_, tile, tile->id(),
 | 
| +      tile->invalidated_id(), resource_content_id, tile->source_frame_number(),
 | 
| +      std::move(raster_buffer), &decode_tasks, supports_concurrent_execution));
 | 
|  }
 | 
|  
 | 
| -void TileManager::OnRasterTaskCompleted(
 | 
| -    Tile::Id tile_id,
 | 
| -    Resource* resource,
 | 
| -    bool was_canceled) {
 | 
| -  DCHECK(tiles_.find(tile_id) != tiles_.end());
 | 
| +void TileManager::CheckForCompletedTasks() {
 | 
| +  Task::Vector completed_tasks;
 | 
| +  tile_task_manager_->CollectCompletedTasks(&completed_tasks);
 | 
| +
 | 
| +  for (auto task : completed_tasks) {
 | 
| +    TileTask* tile_task = static_cast<TileTask*>(task.get());
 | 
| +    switch (tile_task->type()) {
 | 
| +      case TileTask::Type::RASTER:
 | 
| +        OnRasterTaskCompleted(tile_task);
 | 
| +        break;
 | 
| +      case TileTask::Type::IMAGE_DECODE:
 | 
| +        image_decode_controller_->OnImageDecodeTaskCompleted(tile_task);
 | 
| +        break;
 | 
| +      case TileTask::Type::IMAGE_UPLOAD:
 | 
| +        image_decode_controller_->OnImageUploadTaskCompleted(tile_task);
 | 
| +        break;
 | 
| +      case TileTask::Type::DEFAULT:
 | 
| +        // Do nothing.
 | 
| +        break;
 | 
| +      default:
 | 
| +        NOTREACHED();
 | 
| +    }
 | 
|  
 | 
| -  Tile* tile = tiles_[tile_id];
 | 
| -  TileDrawInfo& draw_info = tile->draw_info();
 | 
| -  DCHECK(tile->raster_task_.get());
 | 
| -  orphan_tasks_.push_back(tile->raster_task_);
 | 
| -  tile->raster_task_ = nullptr;
 | 
| +    task->state().DidComplete();
 | 
| +  }
 | 
| +
 | 
| +  completed_tasks.clear();
 | 
| +  did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
 | 
| +}
 | 
| +
 | 
| +void TileManager::OnRasterTaskCompleted(TileTask* task) {
 | 
| +  DCHECK(task);
 | 
| +  RasterTaskImpl* raster_task = static_cast<RasterTaskImpl*>(task);
 | 
| +  tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster(
 | 
| +      std::move(raster_task->raster_buffer_));
 | 
| +
 | 
| +  DCHECK(tiles_.find(raster_task->tile_->id()) != tiles_.end());
 | 
| +  TileDrawInfo& draw_info = raster_task->tile_->draw_info();
 | 
| +  DCHECK(raster_task->tile_->raster_task_.get());
 | 
| +  orphan_tasks_.push_back(raster_task->tile_->raster_task_);
 | 
| +  raster_task->tile_->raster_task_ = nullptr;
 | 
|  
 | 
|    // Unref all the images.
 | 
| -  auto images_it = scheduled_draw_images_.find(tile->id());
 | 
| +  auto images_it = scheduled_draw_images_.find(raster_task->tile_->id());
 | 
|    const std::vector<DrawImage>& images = images_it->second;
 | 
|    for (const auto& image : images)
 | 
|      image_decode_controller_->UnrefImage(image);
 | 
|    scheduled_draw_images_.erase(images_it);
 | 
|  
 | 
| -  if (was_canceled) {
 | 
| +  if (raster_task->state().IsCanceled()) {
 | 
|      ++flush_stats_.canceled_count;
 | 
|      // TODO(ericrk): If more partial raster work is done in the future, it may
 | 
|      // be worth returning the resource to the pool with its previous ID (not
 | 
|      // currently tracked). crrev.com/1370333002/#ps40001 has a possible method
 | 
|      // of achieving this.
 | 
| -    resource_pool_->ReleaseResource(resource, 0 /* content_id */);
 | 
| +    resource_pool_->ReleaseResource(raster_task->resource_, 0 /* content_id */);
 | 
|      return;
 | 
|    }
 | 
|  
 | 
|    ++flush_stats_.completed_count;
 | 
|  
 | 
|    draw_info.set_use_resource();
 | 
| -  draw_info.resource_ = resource;
 | 
| -  draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
 | 
| +  draw_info.resource_ = raster_task->resource_;
 | 
| +  draw_info.contents_swizzled_ =
 | 
| +      DetermineResourceRequiresSwizzle(raster_task->tile_);
 | 
|  
 | 
|    DCHECK(draw_info.IsReadyToDraw());
 | 
|    draw_info.set_was_ever_ready_to_draw();
 | 
|  
 | 
| -  client_->NotifyTileStateChanged(tile);
 | 
| +  client_->NotifyTileStateChanged(raster_task->tile_);
 | 
|  }
 | 
|  
 | 
|  ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info,
 | 
| @@ -1028,8 +1044,7 @@ bool TileManager::IsReadyToDraw() const {
 | 
|  
 | 
|  void TileManager::CheckAndIssueSignals() {
 | 
|    TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals");
 | 
| -  tile_task_manager_->CheckForCompletedTasks();
 | 
| -  did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
 | 
| +  CheckForCompletedTasks();
 | 
|  
 | 
|    // Ready to activate.
 | 
|    if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
 | 
| @@ -1068,8 +1083,7 @@ void TileManager::CheckAndIssueSignals() {
 | 
|  }
 | 
|  
 | 
|  void TileManager::CheckIfMoreTilesNeedToBePrepared() {
 | 
| -  tile_task_manager_->CheckForCompletedTasks();
 | 
| -  did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
 | 
| +  CheckForCompletedTasks();
 | 
|  
 | 
|    // When OOM, keep re-assigning memory until we reach a steady state
 | 
|    // where top-priority tiles are initialized.
 | 
| 
 |