| Index: cc/tiles/tile_manager.cc
|
| diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
|
| index 2af48b5fcf490ad6517bf2b493e9586a9f54efd9..2ab6189dc2b005b7bda803510e62bad3b84a2ebb 100644
|
| --- a/cc/tiles/tile_manager.cc
|
| +++ b/cc/tiles/tile_manager.cc
|
| @@ -44,7 +44,7 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER(
|
|
|
| class RasterTaskImpl : public RasterTask {
|
| public:
|
| - RasterTaskImpl(const Resource* resource,
|
| + RasterTaskImpl(Resource* resource,
|
| scoped_refptr<RasterSource> raster_source,
|
| const gfx::Rect& content_rect,
|
| const gfx::Rect& invalid_content_rect,
|
| @@ -53,12 +53,12 @@ class RasterTaskImpl : public RasterTask {
|
| 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,
|
| ImageDecodeTask::Vector* dependencies)
|
| : RasterTask(dependencies),
|
| resource_(resource),
|
| @@ -75,7 +75,9 @@ class RasterTaskImpl : public RasterTask {
|
| 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)) {
|
| + SetTaskTypeId(kRasterTaskTypeId);
|
| + }
|
|
|
| // Overridden from Task:
|
| void RunOnWorkerThread() override {
|
| @@ -97,22 +99,11 @@ class RasterTaskImpl : public RasterTask {
|
| contents_scale_, playback_settings_);
|
| }
|
|
|
| - // Overridden from TileTask:
|
| - void ScheduleOnOriginThread(TileTaskClient* client) override {
|
| - DCHECK(!raster_buffer_);
|
| - raster_buffer_ = client->AcquireBufferForRaster(
|
| - resource_, resource_content_id_, previous_content_id_);
|
| - }
|
| - void CompleteOnOriginThread(TileTaskClient* client) override {
|
| - client->ReleaseBufferForRaster(std::move(raster_buffer_));
|
| - reply_.Run(!HasFinishedRunning());
|
| - }
|
| -
|
| protected:
|
| - ~RasterTaskImpl() override { DCHECK(!raster_buffer_); }
|
| + ~RasterTaskImpl() override {}
|
|
|
| - private:
|
| - const Resource* resource_;
|
| + public:
|
| + Resource* resource_;
|
| scoped_refptr<RasterSource> raster_source_;
|
| gfx::Rect content_rect_;
|
| gfx::Rect invalid_content_rect_;
|
| @@ -121,14 +112,14 @@ class RasterTaskImpl : public RasterTask {
|
| 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);
|
| };
|
|
|
| @@ -233,10 +224,6 @@ class TaskSetFinishedTaskImpl : public TileTask {
|
| TaskSetFinished();
|
| }
|
|
|
| - // Overridden from TileTask:
|
| - void ScheduleOnOriginThread(TileTaskClient* client) override {}
|
| - void CompleteOnOriginThread(TileTaskClient* client) override {}
|
| -
|
| protected:
|
| ~TaskSetFinishedTaskImpl() override {}
|
|
|
| @@ -292,7 +279,7 @@ TileManager::TileManager(TileManagerClient* client,
|
| use_partial_raster_(use_partial_raster),
|
| use_gpu_rasterization_(false),
|
| all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
|
| - did_check_for_completed_tasks_since_last_schedule_tasks_(true),
|
| + did_check_and_process_completed_tasks_since_last_schedule_tasks_(true),
|
| did_oom_on_last_assign_(false),
|
| more_tiles_need_prepare_check_notifier_(
|
| task_runner_.get(),
|
| @@ -324,7 +311,7 @@ void TileManager::FinishTasksAndCleanUp() {
|
| // |orphan_tasks_|.
|
| orphan_tasks_.clear();
|
|
|
| - tile_task_runner_->CheckForCompletedTasks();
|
| + CheckAndProcessCompletedTasks();
|
|
|
| FreeResourcesForReleasedTiles();
|
| CleanUpReleasedTiles();
|
| @@ -434,12 +421,10 @@ bool TileManager::PrepareTiles(
|
| signals_.reset();
|
| global_state_ = state;
|
|
|
| - // We need to call CheckForCompletedTasks() once in-between each call
|
| + // We need to call CheckAndProcessCompletedTasks() 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_runner_->CheckForCompletedTasks();
|
| - did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
| - }
|
| + if (!did_check_and_process_completed_tasks_since_last_schedule_tasks_)
|
| + CheckAndProcessCompletedTasks();
|
|
|
| FreeResourcesForReleasedTiles();
|
| CleanUpReleasedTiles();
|
| @@ -474,9 +459,7 @@ void TileManager::Flush() {
|
| return;
|
| }
|
|
|
| - tile_task_runner_->CheckForCompletedTasks();
|
| -
|
| - did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
| + CheckAndProcessCompletedTasks();
|
|
|
| TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
|
| RasterTaskCompletionStatsAsValue(flush_stats_));
|
| @@ -718,7 +701,7 @@ void TileManager::ScheduleTasks(
|
| TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count",
|
| tiles_that_need_to_be_rasterized.size());
|
|
|
| - DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
|
| + DCHECK(did_check_and_process_completed_tasks_since_last_schedule_tasks_);
|
|
|
| if (!has_scheduled_tile_tasks_) {
|
| TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
|
| @@ -821,7 +804,7 @@ void TileManager::ScheduleTasks(
|
| required_for_draw_done_task_ = std::move(required_for_draw_done_task);
|
| all_done_task_ = std::move(all_done_task);
|
|
|
| - did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
|
| + did_check_and_process_completed_tasks_since_last_schedule_tasks_ = false;
|
|
|
| TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
|
| ScheduledTasksStateAsValue());
|
| @@ -879,25 +862,45 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask(
|
| it = images.erase(it);
|
| }
|
|
|
| + std::unique_ptr<RasterBuffer> raster_buffer =
|
| + tile_task_runner_->AsTileTaskClient()->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));
|
| + 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));
|
| }
|
|
|
| -void TileManager::OnRasterTaskCompleted(
|
| - Tile::Id tile_id,
|
| - Resource* resource,
|
| - bool was_canceled) {
|
| - DCHECK(tiles_.find(tile_id) != tiles_.end());
|
| +void TileManager::CheckAndProcessCompletedTasks() {
|
| + Task::Vector completed_tasks;
|
| + tile_task_runner_->CollectCompletedTasks(&completed_tasks);
|
| +
|
| + for (auto task : completed_tasks) {
|
| + if (task->GetTaskTypeId() == kImageDecodeTaskTypeId) {
|
| + image_decode_controller_->CompleteTask(task.get());
|
| + } else if (task->GetTaskTypeId() == kRasterTaskTypeId) {
|
| + RasterTaskImpl* raster_task = static_cast<RasterTaskImpl*>(task.get());
|
| + DCHECK(raster_task);
|
| + CompleteRasterTask(raster_task->tile_, raster_task->resource_,
|
| + !raster_task->HasFinishedRunning());
|
| + }
|
| +
|
| + static_cast<TileTask*>(task.get())->DidComplete();
|
| + }
|
| +
|
| + completed_tasks.clear();
|
| +
|
| + did_check_and_process_completed_tasks_since_last_schedule_tasks_ = true;
|
| +}
|
| +
|
| +void TileManager::CompleteRasterTask(Tile* tile,
|
| + Resource* resource,
|
| + bool was_canceled) {
|
| + DCHECK(tiles_.find(tile->id()) == tiles_.end());
|
|
|
| - Tile* tile = tiles_[tile_id];
|
| TileDrawInfo& draw_info = tile->draw_info();
|
| DCHECK(tile->raster_task_.get());
|
| orphan_tasks_.push_back(tile->raster_task_);
|
| @@ -992,8 +995,7 @@ bool TileManager::IsReadyToDraw() const {
|
|
|
| void TileManager::CheckAndIssueSignals() {
|
| TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals");
|
| - tile_task_runner_->CheckForCompletedTasks();
|
| - did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
| + CheckAndProcessCompletedTasks();
|
|
|
| // Ready to activate.
|
| if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
|
| @@ -1032,8 +1034,7 @@ void TileManager::CheckAndIssueSignals() {
|
| }
|
|
|
| void TileManager::CheckIfMoreTilesNeedToBePrepared() {
|
| - tile_task_runner_->CheckForCompletedTasks();
|
| - did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
| + CheckAndProcessCompletedTasks();
|
|
|
| // When OOM, keep re-assigning memory until we reach a steady state
|
| // where top-priority tiles are initialized.
|
|
|