| 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.
|
|
|