1 // Copyright 2013 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/image_raster_worker_pool.h"
7 #include "base/debug/trace_event.h"
8 #include "base/debug/trace_event_argument.h"
9 #include "cc/debug/traced_value.h"
10 #include "cc/resources/resource.h"
15 scoped_ptr
<RasterWorkerPool
> ImageRasterWorkerPool::Create(
16 base::SequencedTaskRunner
* task_runner
,
17 TaskGraphRunner
* task_graph_runner
,
18 ResourceProvider
* resource_provider
) {
19 return make_scoped_ptr
<RasterWorkerPool
>(new ImageRasterWorkerPool(
20 task_runner
, task_graph_runner
, resource_provider
));
23 ImageRasterWorkerPool::ImageRasterWorkerPool(
24 base::SequencedTaskRunner
* task_runner
,
25 TaskGraphRunner
* task_graph_runner
,
26 ResourceProvider
* resource_provider
)
27 : task_runner_(task_runner
),
28 task_graph_runner_(task_graph_runner
),
29 namespace_token_(task_graph_runner
->GetNamespaceToken()),
30 resource_provider_(resource_provider
),
31 raster_tasks_pending_(false),
32 raster_tasks_required_for_activation_pending_(false),
33 raster_finished_weak_ptr_factory_(this) {}
35 ImageRasterWorkerPool::~ImageRasterWorkerPool() {}
37 Rasterizer
* ImageRasterWorkerPool::AsRasterizer() { return this; }
39 void ImageRasterWorkerPool::SetClient(RasterizerClient
* client
) {
43 void ImageRasterWorkerPool::Shutdown() {
44 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown");
47 task_graph_runner_
->ScheduleTasks(namespace_token_
, &empty
);
48 task_graph_runner_
->WaitForTasksToFinishRunning(namespace_token_
);
51 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue
* queue
) {
52 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
54 DCHECK_EQ(queue
->required_for_activation_count
,
56 std::count_if(queue
->items
.begin(),
58 RasterTaskQueue::Item::IsRequiredForActivation
)));
60 if (!raster_tasks_pending_
)
61 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
63 raster_tasks_pending_
= true;
64 raster_tasks_required_for_activation_pending_
= true;
66 unsigned priority
= kRasterTaskPriorityBase
;
70 // Cancel existing OnRasterFinished callbacks.
71 raster_finished_weak_ptr_factory_
.InvalidateWeakPtrs();
73 scoped_refptr
<RasterizerTask
>
74 new_raster_required_for_activation_finished_task(
75 CreateRasterRequiredForActivationFinishedTask(
76 queue
->required_for_activation_count
,
79 &ImageRasterWorkerPool::OnRasterRequiredForActivationFinished
,
80 raster_finished_weak_ptr_factory_
.GetWeakPtr())));
81 scoped_refptr
<RasterizerTask
> new_raster_finished_task(
82 CreateRasterFinishedTask(
84 base::Bind(&ImageRasterWorkerPool::OnRasterFinished
,
85 raster_finished_weak_ptr_factory_
.GetWeakPtr())));
87 for (RasterTaskQueue::Item::Vector::const_iterator it
= queue
->items
.begin();
88 it
!= queue
->items
.end();
90 const RasterTaskQueue::Item
& item
= *it
;
91 RasterTask
* task
= item
.task
;
92 DCHECK(!task
->HasCompleted());
94 if (item
.required_for_activation
) {
95 graph_
.edges
.push_back(TaskGraph::Edge(
96 task
, new_raster_required_for_activation_finished_task
.get()));
99 InsertNodesForRasterTask(&graph_
, task
, task
->dependencies(), priority
++);
101 graph_
.edges
.push_back(
102 TaskGraph::Edge(task
, new_raster_finished_task
.get()));
105 InsertNodeForTask(&graph_
,
106 new_raster_required_for_activation_finished_task
.get(),
107 kRasterRequiredForActivationFinishedTaskPriority
,
108 queue
->required_for_activation_count
);
109 InsertNodeForTask(&graph_
,
110 new_raster_finished_task
.get(),
111 kRasterFinishedTaskPriority
,
112 queue
->items
.size());
114 ScheduleTasksOnOriginThread(this, &graph_
);
115 task_graph_runner_
->ScheduleTasks(namespace_token_
, &graph_
);
117 raster_finished_task_
= new_raster_finished_task
;
118 raster_required_for_activation_finished_task_
=
119 new_raster_required_for_activation_finished_task
;
121 TRACE_EVENT_ASYNC_STEP_INTO1(
122 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
125 void ImageRasterWorkerPool::CheckForCompletedTasks() {
126 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks");
128 task_graph_runner_
->CollectCompletedTasks(namespace_token_
,
130 for (Task::Vector::const_iterator it
= completed_tasks_
.begin();
131 it
!= completed_tasks_
.end();
133 RasterizerTask
* task
= static_cast<RasterizerTask
*>(it
->get());
135 task
->WillComplete();
136 task
->CompleteOnOriginThread(this);
139 task
->RunReplyOnOriginThread();
141 completed_tasks_
.clear();
144 SkCanvas
* ImageRasterWorkerPool::AcquireCanvasForRaster(RasterTask
* task
) {
145 return resource_provider_
->MapImageRasterBuffer(task
->resource()->id());
148 void ImageRasterWorkerPool::ReleaseCanvasForRaster(RasterTask
* task
) {
149 resource_provider_
->UnmapImageRasterBuffer(task
->resource()->id());
151 // Map/UnmapImageRasterBuffer provides direct access to the memory used by the
152 // GPU. Read lock fences are required to ensure that we're not trying to map a
153 // resource that is currently in-use by the GPU.
154 resource_provider_
->EnableReadLockFences(task
->resource()->id());
157 void ImageRasterWorkerPool::OnRasterFinished() {
158 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished");
160 DCHECK(raster_tasks_pending_
);
161 raster_tasks_pending_
= false;
162 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
163 client_
->DidFinishRunningTasks();
166 void ImageRasterWorkerPool::OnRasterRequiredForActivationFinished() {
168 "ImageRasterWorkerPool::OnRasterRequiredForActivationFinished");
170 DCHECK(raster_tasks_required_for_activation_pending_
);
171 raster_tasks_required_for_activation_pending_
= false;
172 TRACE_EVENT_ASYNC_STEP_INTO1(
173 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
174 client_
->DidFinishRunningTasksRequiredForActivation();
177 scoped_refptr
<base::debug::ConvertableToTraceFormat
>
178 ImageRasterWorkerPool::StateAsValue() const {
179 scoped_refptr
<base::debug::TracedValue
> state
=
180 new base::debug::TracedValue();
182 state
->SetBoolean("tasks_required_for_activation_pending",
183 raster_tasks_required_for_activation_pending_
);