| Index: cc/resources/raster_worker_pool.cc
|
| diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
|
| index 7f98a161e937f5d6dedd1063d6199a95821dd910..09b65bc06b84fa04f8eea4f6bbc17572b7851bce 100644
|
| --- a/cc/resources/raster_worker_pool.cc
|
| +++ b/cc/resources/raster_worker_pool.cc
|
| @@ -179,14 +179,15 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| // Overridden from internal::WorkerPoolTask:
|
| virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client)
|
| OVERRIDE {
|
| - DCHECK(!use_gpu_rasterization());
|
| - if (buffer_)
|
| + if (use_gpu_rasterization())
|
| return;
|
| + DCHECK(!buffer_);
|
| buffer_ = client->AcquireBufferForRaster(this, &stride_);
|
| }
|
| virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client)
|
| OVERRIDE {
|
| - DCHECK(!use_gpu_rasterization());
|
| + if (use_gpu_rasterization())
|
| + return;
|
| buffer_ = NULL;
|
| client->OnRasterCompleted(this, analysis_);
|
| }
|
| @@ -458,18 +459,28 @@ int g_num_raster_threads = 0;
|
|
|
| namespace internal {
|
|
|
| -WorkerPoolTask::WorkerPoolTask() : did_complete_(false) {}
|
| +WorkerPoolTask::WorkerPoolTask() : did_schedule_(false), did_complete_(false) {}
|
|
|
| WorkerPoolTask::~WorkerPoolTask() {
|
| - DCHECK_EQ(did_schedule_, did_complete_);
|
| + DCHECK(!did_schedule_);
|
| DCHECK(!did_run_ || did_complete_);
|
| }
|
|
|
| +void WorkerPoolTask::WillSchedule() { DCHECK(!did_schedule_); }
|
| +
|
| +void WorkerPoolTask::DidSchedule() {
|
| + did_schedule_ = true;
|
| + did_complete_ = false;
|
| +}
|
| +
|
| +bool WorkerPoolTask::HasBeenScheduled() const { return did_schedule_; }
|
| +
|
| void WorkerPoolTask::WillComplete() { DCHECK(!did_complete_); }
|
|
|
| void WorkerPoolTask::DidComplete() {
|
| DCHECK(did_schedule_);
|
| DCHECK(!did_complete_);
|
| + did_schedule_ = false;
|
| did_complete_ = true;
|
| }
|
|
|
| @@ -622,6 +633,19 @@ void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) {
|
| TRACE_EVENT1(
|
| "cc", "RasterWorkerPool::SetTaskGraph", "num_tasks", graph->size());
|
|
|
| + for (internal::GraphNode::Map::iterator it = graph->begin();
|
| + it != graph->end();
|
| + ++it) {
|
| + internal::WorkerPoolTask* task =
|
| + static_cast<internal::WorkerPoolTask*>(it->first);
|
| +
|
| + if (!task->HasBeenScheduled()) {
|
| + task->WillSchedule();
|
| + task->ScheduleOnOriginThread(this);
|
| + task->DidSchedule();
|
| + }
|
| + }
|
| +
|
| g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph);
|
| }
|
|
|
| @@ -645,11 +669,16 @@ void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) {
|
| internal::RasterWorkerPoolTask* task = it->get();
|
| DCHECK(task->use_gpu_rasterization());
|
|
|
| + task->WillSchedule();
|
| + task->ScheduleOnOriginThread(this);
|
| task->DidSchedule();
|
| +
|
| task->WillRun();
|
| task->RunOnOriginThread(resource_provider_, context_provider_);
|
| task->DidRun();
|
| +
|
| task->WillComplete();
|
| + task->CompleteOnOriginThread(this);
|
| task->DidComplete();
|
|
|
| completed_gpu_raster_tasks_.push_back(task);
|
| @@ -735,8 +764,6 @@ internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask(
|
| const internal::Task::Vector& decode_tasks,
|
| unsigned priority,
|
| TaskGraph* graph) {
|
| - DCHECK(!raster_task->HasCompleted());
|
| -
|
| internal::GraphNode* raster_node =
|
| CreateGraphNodeForTask(raster_task, priority, graph);
|
|
|
|
|