OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/resources/image_raster_worker_pool.h" | 5 #include "cc/resources/zero_copy_raster_worker_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/debug/trace_event_argument.h" | 10 #include "base/debug/trace_event_argument.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "cc/debug/traced_value.h" | 12 #include "cc/debug/traced_value.h" |
13 #include "cc/resources/raster_buffer.h" | 13 #include "cc/resources/raster_buffer.h" |
14 #include "cc/resources/resource.h" | 14 #include "cc/resources/resource.h" |
15 #include "third_party/skia/include/utils/SkNullCanvas.h" | 15 #include "third_party/skia/include/utils/SkNullCanvas.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 int stride_; | 58 int stride_; |
59 uint8_t* buffer_; | 59 uint8_t* buffer_; |
60 SkBitmap bitmap_; | 60 SkBitmap bitmap_; |
61 | 61 |
62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
63 }; | 63 }; |
64 | 64 |
65 } // namespace | 65 } // namespace |
66 | 66 |
67 // static | 67 // static |
68 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( | 68 scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create( |
69 base::SequencedTaskRunner* task_runner, | 69 base::SequencedTaskRunner* task_runner, |
70 TaskGraphRunner* task_graph_runner, | 70 TaskGraphRunner* task_graph_runner, |
71 ResourceProvider* resource_provider) { | 71 ResourceProvider* resource_provider) { |
72 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( | 72 return make_scoped_ptr<RasterWorkerPool>(new ZeroCopyRasterWorkerPool( |
73 task_runner, task_graph_runner, resource_provider)); | 73 task_runner, task_graph_runner, resource_provider)); |
74 } | 74 } |
75 | 75 |
76 ImageRasterWorkerPool::ImageRasterWorkerPool( | 76 ZeroCopyRasterWorkerPool::ZeroCopyRasterWorkerPool( |
77 base::SequencedTaskRunner* task_runner, | 77 base::SequencedTaskRunner* task_runner, |
78 TaskGraphRunner* task_graph_runner, | 78 TaskGraphRunner* task_graph_runner, |
79 ResourceProvider* resource_provider) | 79 ResourceProvider* resource_provider) |
80 : task_runner_(task_runner), | 80 : task_runner_(task_runner), |
81 task_graph_runner_(task_graph_runner), | 81 task_graph_runner_(task_graph_runner), |
82 namespace_token_(task_graph_runner->GetNamespaceToken()), | 82 namespace_token_(task_graph_runner->GetNamespaceToken()), |
83 resource_provider_(resource_provider), | 83 resource_provider_(resource_provider), |
84 raster_finished_weak_ptr_factory_(this) {} | 84 raster_finished_weak_ptr_factory_(this) { |
| 85 } |
85 | 86 |
86 ImageRasterWorkerPool::~ImageRasterWorkerPool() {} | 87 ZeroCopyRasterWorkerPool::~ZeroCopyRasterWorkerPool() { |
| 88 } |
87 | 89 |
88 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; } | 90 Rasterizer* ZeroCopyRasterWorkerPool::AsRasterizer() { |
| 91 return this; |
| 92 } |
89 | 93 |
90 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) { | 94 void ZeroCopyRasterWorkerPool::SetClient(RasterizerClient* client) { |
91 client_ = client; | 95 client_ = client; |
92 } | 96 } |
93 | 97 |
94 void ImageRasterWorkerPool::Shutdown() { | 98 void ZeroCopyRasterWorkerPool::Shutdown() { |
95 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown"); | 99 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::Shutdown"); |
96 | 100 |
97 TaskGraph empty; | 101 TaskGraph empty; |
98 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 102 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
99 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 103 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
100 } | 104 } |
101 | 105 |
102 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 106 void ZeroCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
103 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); | 107 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::ScheduleTasks"); |
104 | 108 |
105 if (raster_pending_.none()) | 109 if (raster_pending_.none()) |
106 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 110 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
107 | 111 |
108 // Mark all task sets as pending. | 112 // Mark all task sets as pending. |
109 raster_pending_.set(); | 113 raster_pending_.set(); |
110 | 114 |
111 unsigned priority = kRasterTaskPriorityBase; | 115 unsigned priority = kRasterTaskPriorityBase; |
112 | 116 |
113 graph_.Reset(); | 117 graph_.Reset(); |
114 | 118 |
115 // Cancel existing OnRasterFinished callbacks. | 119 // Cancel existing OnRasterFinished callbacks. |
116 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 120 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
117 | 121 |
118 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 122 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; |
119 | 123 |
120 size_t task_count[kNumberOfTaskSets] = {0}; | 124 size_t task_count[kNumberOfTaskSets] = {0}; |
121 | 125 |
122 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 126 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
123 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 127 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( |
124 task_runner_.get(), | 128 task_runner_.get(), |
125 base::Bind(&ImageRasterWorkerPool::OnRasterFinished, | 129 base::Bind(&ZeroCopyRasterWorkerPool::OnRasterFinished, |
126 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 130 raster_finished_weak_ptr_factory_.GetWeakPtr(), |
127 task_set)); | 131 task_set)); |
128 } | 132 } |
129 | 133 |
130 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 134 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
131 it != queue->items.end(); | 135 it != queue->items.end(); |
132 ++it) { | 136 ++it) { |
133 const RasterTaskQueue::Item& item = *it; | 137 const RasterTaskQueue::Item& item = *it; |
134 RasterTask* task = item.task; | 138 RasterTask* task = item.task; |
135 DCHECK(!task->HasCompleted()); | 139 DCHECK(!task->HasCompleted()); |
(...skipping 22 matching lines...) Expand all Loading... |
158 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 162 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
159 | 163 |
160 std::copy(new_raster_finished_tasks, | 164 std::copy(new_raster_finished_tasks, |
161 new_raster_finished_tasks + kNumberOfTaskSets, | 165 new_raster_finished_tasks + kNumberOfTaskSets, |
162 raster_finished_tasks_); | 166 raster_finished_tasks_); |
163 | 167 |
164 TRACE_EVENT_ASYNC_STEP_INTO1( | 168 TRACE_EVENT_ASYNC_STEP_INTO1( |
165 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 169 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
166 } | 170 } |
167 | 171 |
168 void ImageRasterWorkerPool::CheckForCompletedTasks() { | 172 void ZeroCopyRasterWorkerPool::CheckForCompletedTasks() { |
169 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks"); | 173 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::CheckForCompletedTasks"); |
170 | 174 |
171 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 175 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
172 &completed_tasks_); | 176 &completed_tasks_); |
173 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 177 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
174 it != completed_tasks_.end(); | 178 it != completed_tasks_.end(); |
175 ++it) { | 179 ++it) { |
176 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | 180 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); |
177 | 181 |
178 task->WillComplete(); | 182 task->WillComplete(); |
179 task->CompleteOnOriginThread(this); | 183 task->CompleteOnOriginThread(this); |
180 task->DidComplete(); | 184 task->DidComplete(); |
181 | 185 |
182 task->RunReplyOnOriginThread(); | 186 task->RunReplyOnOriginThread(); |
183 } | 187 } |
184 completed_tasks_.clear(); | 188 completed_tasks_.clear(); |
185 } | 189 } |
186 | 190 |
187 scoped_ptr<RasterBuffer> ImageRasterWorkerPool::AcquireBufferForRaster( | 191 scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster( |
188 const Resource* resource) { | 192 const Resource* resource) { |
189 // RasterBuffer implementation depends on an image having been acquired for | 193 // RasterBuffer implementation depends on an image having been acquired for |
190 // the resource. | 194 // the resource. |
191 resource_provider_->AcquireImage(resource->id()); | 195 resource_provider_->AcquireImage(resource->id()); |
192 | 196 |
193 return make_scoped_ptr<RasterBuffer>( | 197 return make_scoped_ptr<RasterBuffer>( |
194 new RasterBufferImpl(resource_provider_, resource)); | 198 new RasterBufferImpl(resource_provider_, resource)); |
195 } | 199 } |
196 | 200 |
197 void ImageRasterWorkerPool::ReleaseBufferForRaster( | 201 void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster( |
198 scoped_ptr<RasterBuffer> buffer) { | 202 scoped_ptr<RasterBuffer> buffer) { |
199 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 203 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
200 } | 204 } |
201 | 205 |
202 void ImageRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 206 void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
203 TRACE_EVENT1( | 207 TRACE_EVENT1( |
204 "cc", "ImageRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 208 "cc", "ZeroCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set); |
205 | 209 |
206 DCHECK(raster_pending_[task_set]); | 210 DCHECK(raster_pending_[task_set]); |
207 raster_pending_[task_set] = false; | 211 raster_pending_[task_set] = false; |
208 if (raster_pending_.any()) { | 212 if (raster_pending_.any()) { |
209 TRACE_EVENT_ASYNC_STEP_INTO1( | 213 TRACE_EVENT_ASYNC_STEP_INTO1( |
210 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 214 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
211 } else { | 215 } else { |
212 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 216 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
213 } | 217 } |
214 client_->DidFinishRunningTasks(task_set); | 218 client_->DidFinishRunningTasks(task_set); |
215 } | 219 } |
216 | 220 |
217 scoped_refptr<base::debug::ConvertableToTraceFormat> | 221 scoped_refptr<base::debug::ConvertableToTraceFormat> |
218 ImageRasterWorkerPool::StateAsValue() const { | 222 ZeroCopyRasterWorkerPool::StateAsValue() const { |
219 scoped_refptr<base::debug::TracedValue> state = | 223 scoped_refptr<base::debug::TracedValue> state = |
220 new base::debug::TracedValue(); | 224 new base::debug::TracedValue(); |
221 | 225 |
222 state->BeginArray("tasks_pending"); | 226 state->BeginArray("tasks_pending"); |
223 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 227 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
224 state->AppendBoolean(raster_pending_[task_set]); | 228 state->AppendBoolean(raster_pending_[task_set]); |
225 state->EndArray(); | 229 state->EndArray(); |
226 return state; | 230 return state; |
227 } | 231 } |
228 | 232 |
229 } // namespace cc | 233 } // namespace cc |
OLD | NEW |