| Index: cc/resources/pixel_buffer_raster_worker_pool.cc
|
| diff --git a/cc/resources/pixel_buffer_raster_worker_pool.cc b/cc/resources/pixel_buffer_raster_worker_pool.cc
|
| index 5b43c0c3431ef56f6abfacd3a72dcf62b6a93ac9..2f3e4d2d28c64d67642db1d07f3610f4e5a4a959 100644
|
| --- a/cc/resources/pixel_buffer_raster_worker_pool.cc
|
| +++ b/cc/resources/pixel_buffer_raster_worker_pool.cc
|
| @@ -17,11 +17,9 @@ class PixelBufferWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
| typedef base::Callback<void(bool was_canceled, bool needs_upload)> Reply;
|
|
|
| PixelBufferWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task,
|
| - TaskVector* dependencies,
|
| uint8_t* buffer,
|
| const Reply& reply)
|
| - : internal::WorkerPoolTask(dependencies),
|
| - task_(task),
|
| + : task_(task),
|
| buffer_(buffer),
|
| reply_(reply),
|
| needs_upload_(false) {
|
| @@ -90,9 +88,7 @@ PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool(
|
| shutdown_(false),
|
| bytes_pending_upload_(0),
|
| has_performed_uploads_since_last_flush_(false),
|
| - check_for_completed_raster_tasks_pending_(false),
|
| - weak_ptr_factory_(this),
|
| - schedule_more_tasks_count_(0) {
|
| + check_for_completed_raster_tasks_pending_(false) {
|
| }
|
|
|
| PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() {
|
| @@ -118,8 +114,6 @@ void PixelBufferRasterWorkerPool::Shutdown() {
|
| completed_tasks_.push_back(task);
|
| }
|
| }
|
| - // Cancel any pending OnRasterFinished callback.
|
| - weak_ptr_factory_.InvalidateWeakPtrs();
|
| }
|
|
|
| void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
|
| @@ -129,8 +123,7 @@ void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
|
|
|
| // Build new pixel buffer task set.
|
| TaskMap new_pixel_buffer_tasks;
|
| - for (RasterTask::Queue::TaskVector::const_iterator it =
|
| - raster_tasks().begin();
|
| + for (RasterTaskVector::const_iterator it = raster_tasks().begin();
|
| it != raster_tasks().end(); ++it) {
|
| internal::RasterWorkerPoolTask* task = it->get();
|
| DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end());
|
| @@ -196,6 +189,13 @@ void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
|
| }
|
| }
|
|
|
| +void PixelBufferRasterWorkerPool::OnRasterTasksFinished() {
|
| + // Call CheckForCompletedTasks() when we've finished running all raster
|
| + // tasks needed since last time ScheduleMoreTasks() was called. This
|
| + // reduces latency when processing only a small number of raster tasks.
|
| + CheckForCompletedRasterTasks();
|
| +}
|
| +
|
| void PixelBufferRasterWorkerPool::FlushUploads() {
|
| if (!has_performed_uploads_since_last_flush_)
|
| return;
|
| @@ -306,10 +306,8 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
|
| size_t bytes_pending_upload = bytes_pending_upload_;
|
| size_t bytes_pending_raster = 0;
|
|
|
| - internal::WorkerPoolTask::TaskVector tasks;
|
| -
|
| - for (RasterTask::Queue::TaskVector::const_iterator it =
|
| - raster_tasks().begin();
|
| + RasterTaskGraph graph;
|
| + for (RasterTaskVector::const_iterator it = raster_tasks().begin();
|
| it != raster_tasks().end(); ++it) {
|
| internal::RasterWorkerPoolTask* task = it->get();
|
|
|
| @@ -354,8 +352,7 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
|
|
|
| // Use existing pixel buffer task if available.
|
| if (pixel_buffer_task) {
|
| - DCHECK(!pixel_buffer_task->HasCompleted());
|
| - tasks.push_back(pixel_buffer_task);
|
| + graph.InsertRasterTask(pixel_buffer_task, task->dependencies());
|
| continue;
|
| }
|
|
|
| @@ -368,44 +365,24 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
|
| uint8* buffer = resource_provider()->MapPixelBuffer(
|
| task->resource()->id());
|
|
|
| - // TODO(reveman): Avoid having to make a copy of dependencies.
|
| - internal::WorkerPoolTask::TaskVector dependencies = task->dependencies();
|
| scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task(
|
| new PixelBufferWorkerPoolTaskImpl(
|
| task,
|
| - &dependencies,
|
| buffer,
|
| base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted,
|
| base::Unretained(this),
|
| make_scoped_refptr(task))));
|
| -
|
| pixel_buffer_tasks_[task] = new_pixel_buffer_task;
|
| - tasks.push_back(new_pixel_buffer_task);
|
| - }
|
| -
|
| - ++schedule_more_tasks_count_;
|
| -
|
| - // We need to make sure not to schedule a check for completed raster
|
| - // tasks when |tasks| is empty as that would cause us to never stop
|
| - // checking.
|
| - if (tasks.empty()) {
|
| - ScheduleRasterTasks(RootTask());
|
| - return;
|
| + graph.InsertRasterTask(new_pixel_buffer_task.get(), task->dependencies());
|
| }
|
|
|
| - RootTask root(
|
| - base::Bind(&PixelBufferRasterWorkerPool::RunRasterFinishedTask,
|
| - base::MessageLoopProxy::current(),
|
| - base::Bind(&PixelBufferRasterWorkerPool::OnRasterFinished,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - schedule_more_tasks_count_)),
|
| - &tasks);
|
| - ScheduleRasterTasks(root);
|
| + SetRasterTaskGraph(&graph);
|
|
|
| // At least one task that could need an upload is now pending, schedule
|
| // a check for completed raster tasks to ensure this upload is dispatched
|
| // without too much latency.
|
| - ScheduleCheckForCompletedRasterTasks();
|
| + if (bytes_pending_raster)
|
| + ScheduleCheckForCompletedRasterTasks();
|
| }
|
|
|
| void PixelBufferRasterWorkerPool::OnRasterTaskCompleted(
|
| @@ -438,25 +415,4 @@ void PixelBufferRasterWorkerPool::OnRasterTaskCompleted(
|
| tasks_with_pending_upload_.push_back(task);
|
| }
|
|
|
| -void PixelBufferRasterWorkerPool::OnRasterFinished(
|
| - int64 schedule_more_tasks_count) {
|
| - TRACE_EVENT1("cc",
|
| - "PixelBufferRasterWorkerPool::OnRasterFinishedTasks",
|
| - "schedule_more_tasks_count", schedule_more_tasks_count);
|
| - DCHECK_GE(schedule_more_tasks_count_, schedule_more_tasks_count);
|
| - // Call CheckForCompletedTasks() when we've finished running all raster
|
| - // tasks needed since last time ScheduleMoreTasks() was called. This
|
| - // reduces latency when processing only a small number of raster tasks.
|
| - if (schedule_more_tasks_count_ == schedule_more_tasks_count)
|
| - CheckForCompletedRasterTasks();
|
| -}
|
| -
|
| -// static
|
| -void PixelBufferRasterWorkerPool::RunRasterFinishedTask(
|
| - scoped_refptr<base::MessageLoopProxy> origin_loop,
|
| - const base::Closure& on_raster_finished_callback) {
|
| - TRACE_EVENT0("cc", "RasterWorkerPool::RunRasterFinishedTask");
|
| - origin_loop->PostTask(FROM_HERE, on_raster_finished_callback);
|
| -}
|
| -
|
| } // namespace cc
|
|
|