1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/resources/direct_raster_worker_pool.h"
7 #include "cc/output/context_provider.h"
8 #include "cc/resources/resource.h"
9 #include "cc/resources/resource_provider.h"
10 #include "gpu/command_buffer/client/gles2_interface.h"
11 #include "third_party/skia/include/gpu/GrContext.h"
16 scoped_ptr<RasterWorkerPool> DirectRasterWorkerPool::Create(
17 ResourceProvider* resource_provider,
18 ContextProvider* context_provider) {
19 return make_scoped_ptr<RasterWorkerPool>(
20 new DirectRasterWorkerPool(resource_provider, context_provider));
23 DirectRasterWorkerPool::DirectRasterWorkerPool(
24 ResourceProvider* resource_provider,
25 ContextProvider* context_provider)
26 : RasterWorkerPool(NULL, resource_provider),
27 context_provider_(context_provider),
28 run_tasks_on_origin_thread_pending_(false),
29 raster_tasks_pending_(false),
30 raster_tasks_required_for_activation_pending_(false),
31 weak_factory_(this) {}
33 DirectRasterWorkerPool::~DirectRasterWorkerPool() {
34 DCHECK_EQ(0u, completed_tasks_.size());
37 void DirectRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
38 TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks");
40 raster_tasks_pending_ = true;
41 raster_tasks_required_for_activation_pending_ = true;
43 scoped_refptr<internal::WorkerPoolTask>
44 new_raster_required_for_activation_finished_task(
45 CreateRasterRequiredForActivationFinishedTask(
46 queue->required_for_activation_count()));
47 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task(
48 CreateRasterFinishedTask());
50 // Need to cancel tasks not present in new queue if we haven't had a
51 // chance to run the previous set of tasks yet.
52 // TODO(reveman): Remove this once only tasks for which
53 // ::ScheduleOnOriginThread has been called need to be canceled.
54 if (run_tasks_on_origin_thread_pending_) {
55 for (RasterTaskQueueIterator it(&raster_tasks_); it; ++it) {
56 internal::RasterWorkerPoolTask* task = *it;
58 if (std::find_if(queue->tasks_.begin(),
60 RasterTask::Queue::QueuedTask::TaskComparator(task)) ==
62 completed_tasks_.push_back(task);
66 ScheduleRunTasksOnOriginThread();
68 raster_tasks_.Swap(queue);
70 set_raster_finished_task(new_raster_finished_task);
71 set_raster_required_for_activation_finished_task(
72 new_raster_required_for_activation_finished_task);
75 unsigned DirectRasterWorkerPool::GetResourceTarget() const {
79 ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const {
80 return resource_provider()->best_texture_format();
83 void DirectRasterWorkerPool::CheckForCompletedTasks() {
84 TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks");
86 for (internal::WorkerPoolTask::Vector::const_iterator it =
87 completed_tasks_.begin();
88 it != completed_tasks_.end();
90 internal::WorkerPoolTask* task = it->get();
92 task->RunReplyOnOriginThread();
94 completed_tasks_.clear();
97 SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster(
98 internal::RasterWorkerPoolTask* task) {
99 return resource_provider()->MapDirectRasterBuffer(task->resource()->id());
102 void DirectRasterWorkerPool::OnRasterCompleted(
103 internal::RasterWorkerPoolTask* task,
104 const PicturePileImpl::Analysis& analysis) {
105 resource_provider()->UnmapDirectRasterBuffer(task->resource()->id());
108 void DirectRasterWorkerPool::OnRasterTasksFinished() {
109 DCHECK(raster_tasks_pending_);
110 raster_tasks_pending_ = false;
111 client()->DidFinishRunningTasks();
114 void DirectRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
115 DCHECK(raster_tasks_required_for_activation_pending_);
116 raster_tasks_required_for_activation_pending_ = false;
117 client()->DidFinishRunningTasksRequiredForActivation();
120 void DirectRasterWorkerPool::ScheduleRunTasksOnOriginThread() {
121 if (run_tasks_on_origin_thread_pending_)
124 base::MessageLoopProxy::current()->PostTask(
126 base::Bind(&DirectRasterWorkerPool::RunTasksOnOriginThread,
127 weak_factory_.GetWeakPtr()));
128 run_tasks_on_origin_thread_pending_ = true;
131 void DirectRasterWorkerPool::RunTasksOnOriginThread() {
132 DCHECK(run_tasks_on_origin_thread_pending_);
133 run_tasks_on_origin_thread_pending_ = false;
135 if (!raster_tasks_.tasks_.empty()) {
136 GrContext* gr_context = context_provider_->GrContext();
137 // TODO(alokp): Implement TestContextProvider::GrContext().
139 gr_context->resetContext();
141 for (RasterTaskQueueIterator it(&raster_tasks_); it; ++it) {
142 internal::RasterWorkerPoolTask* task = *it;
143 DCHECK(!task->HasCompleted());
145 // First need to run all dependencies.
146 for (internal::WorkerPoolTask::Vector::const_iterator it =
147 task->dependencies().begin();
148 it != task->dependencies().end();
150 internal::WorkerPoolTask* dependency = it->get();
152 if (dependency->HasCompleted())
155 RunTaskOnOriginThread(dependency);
157 completed_tasks_.push_back(dependency);
160 RunTaskOnOriginThread(task);
162 completed_tasks_.push_back(task);
165 // TODO(alokp): Implement TestContextProvider::GrContext().
170 RunTaskOnOriginThread(raster_required_for_activation_finished_task());
171 RunTaskOnOriginThread(raster_finished_task());