Chromium Code Reviews| Index: cc/tiles/tile_manager.cc |
| diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc |
| index 68408e4ded02b983d804ccd6e9f0bfea2b3a7abc..723bb033595b2f4fca7bc2b29afe78793315886c 100644 |
| --- a/cc/tiles/tile_manager.cc |
| +++ b/cc/tiles/tile_manager.cc |
| @@ -23,7 +23,6 @@ |
| #include "cc/debug/frame_viewer_instrumentation.h" |
| #include "cc/debug/traced_value.h" |
| #include "cc/layers/picture_layer_impl.h" |
| -#include "cc/raster/raster_buffer.h" |
| #include "cc/raster/task_category.h" |
| #include "cc/raster/tile_task_runner.h" |
| #include "cc/tiles/tile.h" |
| @@ -41,9 +40,10 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( |
| "Compositing.%s.RasterTask.RasterUs", |
| "Compositing.%s.RasterTask.RasterPixelsPerMs"); |
| -class RasterTaskImpl : public RasterTask { |
| +class RasterTaskImpl : public Task { |
| public: |
| - RasterTaskImpl(const Resource* resource, |
| + RasterTaskImpl(RasterBufferProvider* raster_buffer_provider, |
| + const Resource* resource, |
| scoped_refptr<RasterSource> raster_source, |
| const gfx::Rect& content_rect, |
| const gfx::Rect& invalid_content_rect, |
| @@ -58,8 +58,8 @@ class RasterTaskImpl : public RasterTask { |
| uint64_t resource_content_id, |
| int source_frame_number, |
| const base::Callback<void(bool)>& reply, |
| - ImageDecodeTask::Vector* dependencies) |
| - : RasterTask(dependencies), |
| + Task::Vector* dependencies) |
| + : raster_buffer_provider_(raster_buffer_provider), |
| resource_(resource), |
| raster_source_(std::move(raster_source)), |
| content_rect_(content_rect), |
| @@ -74,9 +74,24 @@ class RasterTaskImpl : public RasterTask { |
| previous_content_id_(previous_content_id), |
| resource_content_id_(resource_content_id), |
| source_frame_number_(source_frame_number), |
| - reply_(reply) {} |
| + reply_(reply) { |
| + dependencies_ = std::move(*dependencies); |
| + } |
| // Overridden from Task: |
| + void ScheduleOnOriginThread() override { |
| + DCHECK(raster_buffer_provider_); |
| + DCHECK(!raster_buffer_); |
| + raster_buffer_ = raster_buffer_provider_->AcquireBufferForRaster( |
| + resource_, resource_content_id_, previous_content_id_); |
| + } |
| + |
| + void CompleteOnOriginThread() override { |
| + DCHECK(raster_buffer_provider_); |
| + raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer_)); |
| + reply_.Run(!HasFinishedRunning()); |
|
prashant.n
2016/04/07 09:22:13
Due to this, we need to keep scheduling and comple
|
| + } |
| + |
| void RunOnWorkerThread() override { |
| TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread", |
| "source_prepare_tiles_id", source_prepare_tiles_id_); |
| @@ -96,21 +111,14 @@ 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()); |
| - } |
| + const Task::Vector& dependencies() const { return dependencies_; } |
| protected: |
| ~RasterTaskImpl() override { DCHECK(!raster_buffer_); } |
| private: |
| + Task::Vector dependencies_; |
| + RasterBufferProvider* raster_buffer_provider_; |
| const Resource* resource_; |
| scoped_refptr<RasterSource> raster_source_; |
| gfx::Rect content_rect_; |
| @@ -142,7 +150,7 @@ const size_t kAllDoneTaskPriority = 3u; |
| size_t kTileTaskPriorityBase = 10u; |
| void InsertNodeForTask(TaskGraph* graph, |
| - TileTask* task, |
| + Task* task, |
| uint16_t category, |
| uint16_t priority, |
| size_t dependencies) { |
| @@ -155,8 +163,8 @@ void InsertNodeForTask(TaskGraph* graph, |
| } |
| void InsertNodesForRasterTask(TaskGraph* graph, |
| - RasterTask* raster_task, |
| - const ImageDecodeTask::Vector& decode_tasks, |
| + Task* raster_task, |
| + const Task::Vector& decode_tasks, |
| size_t priority, |
| bool use_gpu_rasterization, |
| bool high_priority) { |
| @@ -180,9 +188,9 @@ void InsertNodesForRasterTask(TaskGraph* graph, |
| high_priority ? TASK_CATEGORY_FOREGROUND : TASK_CATEGORY_BACKGROUND; |
| // Insert image decode tasks. |
| - for (ImageDecodeTask::Vector::const_iterator it = decode_tasks.begin(); |
| + for (Task::Vector::const_iterator it = decode_tasks.begin(); |
| it != decode_tasks.end(); ++it) { |
| - ImageDecodeTask* decode_task = it->get(); |
| + Task* decode_task = it->get(); |
| // Skip if already decoded. |
| if (decode_task->HasCompleted()) |
| @@ -218,7 +226,7 @@ void InsertNodesForRasterTask(TaskGraph* graph, |
| dependencies); |
| } |
| -class TaskSetFinishedTaskImpl : public TileTask { |
| +class TaskSetFinishedTaskImpl : public Task { |
| public: |
| explicit TaskSetFinishedTaskImpl( |
| base::SequencedTaskRunner* task_runner, |
| @@ -227,15 +235,13 @@ class TaskSetFinishedTaskImpl : public TileTask { |
| on_task_set_finished_callback_(on_task_set_finished_callback) {} |
| // Overridden from Task: |
| + void ScheduleOnOriginThread() override {} |
| + void CompleteOnOriginThread() override {} |
| void RunOnWorkerThread() override { |
| TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread"); |
| TaskSetFinished(); |
| } |
| - // Overridden from TileTask: |
| - void ScheduleOnOriginThread(TileTaskClient* client) override {} |
| - void CompleteOnOriginThread(TileTaskClient* client) override {} |
| - |
| protected: |
| ~TaskSetFinishedTaskImpl() override {} |
| @@ -740,13 +746,12 @@ void TileManager::ScheduleTasks( |
| graph_.Reset(); |
| - scoped_refptr<TileTask> required_for_activation_done_task = |
| + scoped_refptr<Task> required_for_activation_done_task = |
| CreateTaskSetFinishedTask( |
| &TileManager::DidFinishRunningTileTasksRequiredForActivation); |
| - scoped_refptr<TileTask> required_for_draw_done_task = |
| - CreateTaskSetFinishedTask( |
| - &TileManager::DidFinishRunningTileTasksRequiredForDraw); |
| - scoped_refptr<TileTask> all_done_task = |
| + scoped_refptr<Task> required_for_draw_done_task = CreateTaskSetFinishedTask( |
| + &TileManager::DidFinishRunningTileTasksRequiredForDraw); |
| + scoped_refptr<Task> all_done_task = |
| CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); |
| // Build a new task queue containing all task currently needed. Tasks |
| @@ -760,7 +765,8 @@ void TileManager::ScheduleTasks( |
| if (!tile->raster_task_) |
| tile->raster_task_ = CreateRasterTask(prioritized_tile); |
| - RasterTask* task = tile->raster_task_.get(); |
| + RasterTaskImpl* task = |
| + static_cast<RasterTaskImpl*>(tile->raster_task_.get()); |
| DCHECK(!task->HasCompleted()); |
| if (tile->required_for_activation()) { |
| @@ -826,7 +832,7 @@ void TileManager::ScheduleTasks( |
| ScheduledTasksStateAsValue()); |
| } |
| -scoped_refptr<RasterTask> TileManager::CreateRasterTask( |
| +scoped_refptr<Task> TileManager::CreateRasterTask( |
| const PrioritizedTile& prioritized_tile) { |
| Tile* tile = prioritized_tile.tile(); |
| @@ -853,7 +859,7 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask( |
| prioritized_tile.priority().resolution == LOW_RESOLUTION; |
| // Create and queue all image decode tasks that this tile depends on. |
| - ImageDecodeTask::Vector decode_tasks; |
| + Task::Vector decode_tasks; |
| std::vector<DrawImage>& images = scheduled_draw_images_[tile->id()]; |
| images.clear(); |
| if (!playback_settings.skip_images) { |
| @@ -865,7 +871,7 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask( |
| // |playback_settings| here if |images| is empty. |
| for (auto it = images.begin(); it != images.end();) { |
| - scoped_refptr<ImageDecodeTask> task; |
| + scoped_refptr<Task> task; |
| bool need_to_unref_when_finished = |
| image_decode_controller_->GetTaskForImageAndRef( |
| *it, prepare_tiles_count_, &task); |
| @@ -879,12 +885,12 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask( |
| } |
| 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(), |
| + tile_task_runner_, 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)); |
| @@ -1140,7 +1146,7 @@ TileManager::ScheduledTasksStateAsValue() const { |
| // Utility function that can be used to create a "Task set finished" task that |
| // posts |callback| to |task_runner| when run. |
| -scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| +scoped_refptr<Task> TileManager::CreateTaskSetFinishedTask( |
| void (TileManager::*callback)()) { |
| return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| task_runner_.get(), |