OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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_copy_raster_worker_pool.h" | 5 #include "cc/resources/one_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_pool.h" | 14 #include "cc/resources/resource_pool.h" |
15 #include "cc/resources/scoped_resource.h" | 15 #include "cc/resources/scoped_resource.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 uint8_t* buffer_; | 77 uint8_t* buffer_; |
78 int stride_; | 78 int stride_; |
79 SkBitmap bitmap_; | 79 SkBitmap bitmap_; |
80 | 80 |
81 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 81 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
82 }; | 82 }; |
83 | 83 |
84 } // namespace | 84 } // namespace |
85 | 85 |
86 // static | 86 // static |
87 scoped_ptr<RasterWorkerPool> ImageCopyRasterWorkerPool::Create( | 87 scoped_ptr<RasterWorkerPool> OneCopyRasterWorkerPool::Create( |
88 base::SequencedTaskRunner* task_runner, | 88 base::SequencedTaskRunner* task_runner, |
89 TaskGraphRunner* task_graph_runner, | 89 TaskGraphRunner* task_graph_runner, |
90 ContextProvider* context_provider, | 90 ContextProvider* context_provider, |
91 ResourceProvider* resource_provider, | 91 ResourceProvider* resource_provider, |
92 ResourcePool* resource_pool) { | 92 ResourcePool* resource_pool) { |
93 return make_scoped_ptr<RasterWorkerPool>( | 93 return make_scoped_ptr<RasterWorkerPool>( |
94 new ImageCopyRasterWorkerPool(task_runner, | 94 new OneCopyRasterWorkerPool(task_runner, |
95 task_graph_runner, | 95 task_graph_runner, |
96 context_provider, | 96 context_provider, |
97 resource_provider, | 97 resource_provider, |
98 resource_pool)); | 98 resource_pool)); |
99 } | 99 } |
100 | 100 |
101 ImageCopyRasterWorkerPool::ImageCopyRasterWorkerPool( | 101 OneCopyRasterWorkerPool::OneCopyRasterWorkerPool( |
102 base::SequencedTaskRunner* task_runner, | 102 base::SequencedTaskRunner* task_runner, |
103 TaskGraphRunner* task_graph_runner, | 103 TaskGraphRunner* task_graph_runner, |
104 ContextProvider* context_provider, | 104 ContextProvider* context_provider, |
105 ResourceProvider* resource_provider, | 105 ResourceProvider* resource_provider, |
106 ResourcePool* resource_pool) | 106 ResourcePool* resource_pool) |
107 : task_runner_(task_runner), | 107 : task_runner_(task_runner), |
108 task_graph_runner_(task_graph_runner), | 108 task_graph_runner_(task_graph_runner), |
109 namespace_token_(task_graph_runner->GetNamespaceToken()), | 109 namespace_token_(task_graph_runner->GetNamespaceToken()), |
110 context_provider_(context_provider), | 110 context_provider_(context_provider), |
111 resource_provider_(resource_provider), | 111 resource_provider_(resource_provider), |
112 resource_pool_(resource_pool), | 112 resource_pool_(resource_pool), |
113 raster_finished_weak_ptr_factory_(this) { | 113 raster_finished_weak_ptr_factory_(this) { |
114 DCHECK(context_provider_); | 114 DCHECK(context_provider_); |
115 } | 115 } |
116 | 116 |
117 ImageCopyRasterWorkerPool::~ImageCopyRasterWorkerPool() { | 117 OneCopyRasterWorkerPool::~OneCopyRasterWorkerPool() { |
118 } | 118 } |
119 | 119 |
120 Rasterizer* ImageCopyRasterWorkerPool::AsRasterizer() { return this; } | 120 Rasterizer* OneCopyRasterWorkerPool::AsRasterizer() { |
| 121 return this; |
| 122 } |
121 | 123 |
122 void ImageCopyRasterWorkerPool::SetClient(RasterizerClient* client) { | 124 void OneCopyRasterWorkerPool::SetClient(RasterizerClient* client) { |
123 client_ = client; | 125 client_ = client; |
124 } | 126 } |
125 | 127 |
126 void ImageCopyRasterWorkerPool::Shutdown() { | 128 void OneCopyRasterWorkerPool::Shutdown() { |
127 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::Shutdown"); | 129 TRACE_EVENT0("cc", "OneCopyRasterWorkerPool::Shutdown"); |
128 | 130 |
129 TaskGraph empty; | 131 TaskGraph empty; |
130 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 132 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
131 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 133 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
132 } | 134 } |
133 | 135 |
134 void ImageCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 136 void OneCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
135 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::ScheduleTasks"); | 137 TRACE_EVENT0("cc", "OneCopyRasterWorkerPool::ScheduleTasks"); |
136 | 138 |
137 if (raster_pending_.none()) | 139 if (raster_pending_.none()) |
138 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 140 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
139 | 141 |
140 // Mark all task sets as pending. | 142 // Mark all task sets as pending. |
141 raster_pending_.set(); | 143 raster_pending_.set(); |
142 | 144 |
143 unsigned priority = kRasterTaskPriorityBase; | 145 unsigned priority = kRasterTaskPriorityBase; |
144 | 146 |
145 graph_.Reset(); | 147 graph_.Reset(); |
146 | 148 |
147 // Cancel existing OnRasterFinished callbacks. | 149 // Cancel existing OnRasterFinished callbacks. |
148 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 150 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
149 | 151 |
150 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 152 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; |
151 | 153 |
152 size_t task_count[kNumberOfTaskSets] = {0}; | 154 size_t task_count[kNumberOfTaskSets] = {0}; |
153 | 155 |
154 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 156 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
155 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 157 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( |
156 task_runner_.get(), | 158 task_runner_.get(), |
157 base::Bind(&ImageCopyRasterWorkerPool::OnRasterFinished, | 159 base::Bind(&OneCopyRasterWorkerPool::OnRasterFinished, |
158 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 160 raster_finished_weak_ptr_factory_.GetWeakPtr(), |
159 task_set)); | 161 task_set)); |
160 } | 162 } |
161 | 163 |
162 resource_pool_->CheckBusyResources(); | 164 resource_pool_->CheckBusyResources(); |
163 | 165 |
164 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 166 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
165 it != queue->items.end(); | 167 it != queue->items.end(); |
166 ++it) { | 168 ++it) { |
167 const RasterTaskQueue::Item& item = *it; | 169 const RasterTaskQueue::Item& item = *it; |
(...skipping 26 matching lines...) Expand all Loading... |
194 std::copy(new_raster_finished_tasks, | 196 std::copy(new_raster_finished_tasks, |
195 new_raster_finished_tasks + kNumberOfTaskSets, | 197 new_raster_finished_tasks + kNumberOfTaskSets, |
196 raster_finished_tasks_); | 198 raster_finished_tasks_); |
197 | 199 |
198 resource_pool_->ReduceResourceUsage(); | 200 resource_pool_->ReduceResourceUsage(); |
199 | 201 |
200 TRACE_EVENT_ASYNC_STEP_INTO1( | 202 TRACE_EVENT_ASYNC_STEP_INTO1( |
201 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 203 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
202 } | 204 } |
203 | 205 |
204 void ImageCopyRasterWorkerPool::CheckForCompletedTasks() { | 206 void OneCopyRasterWorkerPool::CheckForCompletedTasks() { |
205 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::CheckForCompletedTasks"); | 207 TRACE_EVENT0("cc", "OneCopyRasterWorkerPool::CheckForCompletedTasks"); |
206 | 208 |
207 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 209 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
208 &completed_tasks_); | 210 &completed_tasks_); |
209 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 211 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
210 it != completed_tasks_.end(); | 212 it != completed_tasks_.end(); |
211 ++it) { | 213 ++it) { |
212 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | 214 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); |
213 | 215 |
214 task->WillComplete(); | 216 task->WillComplete(); |
215 task->CompleteOnOriginThread(this); | 217 task->CompleteOnOriginThread(this); |
216 task->DidComplete(); | 218 task->DidComplete(); |
217 | 219 |
218 task->RunReplyOnOriginThread(); | 220 task->RunReplyOnOriginThread(); |
219 } | 221 } |
220 completed_tasks_.clear(); | 222 completed_tasks_.clear(); |
221 | 223 |
222 context_provider_->ContextGL()->ShallowFlushCHROMIUM(); | 224 context_provider_->ContextGL()->ShallowFlushCHROMIUM(); |
223 } | 225 } |
224 | 226 |
225 scoped_ptr<RasterBuffer> ImageCopyRasterWorkerPool::AcquireBufferForRaster( | 227 scoped_ptr<RasterBuffer> OneCopyRasterWorkerPool::AcquireBufferForRaster( |
226 const Resource* resource) { | 228 const Resource* resource) { |
227 DCHECK_EQ(resource->format(), resource_pool_->resource_format()); | 229 DCHECK_EQ(resource->format(), resource_pool_->resource_format()); |
228 return make_scoped_ptr<RasterBuffer>( | 230 return make_scoped_ptr<RasterBuffer>( |
229 new RasterBufferImpl(resource_provider_, resource_pool_, resource)); | 231 new RasterBufferImpl(resource_provider_, resource_pool_, resource)); |
230 } | 232 } |
231 | 233 |
232 void ImageCopyRasterWorkerPool::ReleaseBufferForRaster( | 234 void OneCopyRasterWorkerPool::ReleaseBufferForRaster( |
233 scoped_ptr<RasterBuffer> buffer) { | 235 scoped_ptr<RasterBuffer> buffer) { |
234 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 236 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
235 } | 237 } |
236 | 238 |
237 void ImageCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 239 void OneCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
238 TRACE_EVENT1("cc", | 240 TRACE_EVENT1( |
239 "ImageCopyRasterWorkerPool::OnRasterFinished", | 241 "cc", "OneCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set); |
240 "task_set", | |
241 task_set); | |
242 | 242 |
243 DCHECK(raster_pending_[task_set]); | 243 DCHECK(raster_pending_[task_set]); |
244 raster_pending_[task_set] = false; | 244 raster_pending_[task_set] = false; |
245 if (raster_pending_.any()) { | 245 if (raster_pending_.any()) { |
246 TRACE_EVENT_ASYNC_STEP_INTO1( | 246 TRACE_EVENT_ASYNC_STEP_INTO1( |
247 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 247 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
248 } else { | 248 } else { |
249 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 249 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
250 } | 250 } |
251 client_->DidFinishRunningTasks(task_set); | 251 client_->DidFinishRunningTasks(task_set); |
252 } | 252 } |
253 | 253 |
254 scoped_refptr<base::debug::ConvertableToTraceFormat> | 254 scoped_refptr<base::debug::ConvertableToTraceFormat> |
255 ImageCopyRasterWorkerPool::StateAsValue() const { | 255 OneCopyRasterWorkerPool::StateAsValue() const { |
256 scoped_refptr<base::debug::TracedValue> state = | 256 scoped_refptr<base::debug::TracedValue> state = |
257 new base::debug::TracedValue(); | 257 new base::debug::TracedValue(); |
258 | 258 |
259 state->BeginArray("tasks_pending"); | 259 state->BeginArray("tasks_pending"); |
260 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 260 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
261 state->AppendBoolean(raster_pending_[task_set]); | 261 state->AppendBoolean(raster_pending_[task_set]); |
262 state->EndArray(); | 262 state->EndArray(); |
263 state->BeginDictionary("staging_state"); | 263 state->BeginDictionary("staging_state"); |
264 StagingStateAsValueInto(state.get()); | 264 StagingStateAsValueInto(state.get()); |
265 state->EndDictionary(); | 265 state->EndDictionary(); |
266 | 266 |
267 return state; | 267 return state; |
268 } | 268 } |
269 void ImageCopyRasterWorkerPool::StagingStateAsValueInto( | 269 void OneCopyRasterWorkerPool::StagingStateAsValueInto( |
270 base::debug::TracedValue* staging_state) const { | 270 base::debug::TracedValue* staging_state) const { |
271 staging_state->SetInteger("staging_resource_count", | 271 staging_state->SetInteger("staging_resource_count", |
272 resource_pool_->total_resource_count()); | 272 resource_pool_->total_resource_count()); |
273 staging_state->SetInteger("bytes_used_for_staging_resources", | 273 staging_state->SetInteger("bytes_used_for_staging_resources", |
274 resource_pool_->total_memory_usage_bytes()); | 274 resource_pool_->total_memory_usage_bytes()); |
275 staging_state->SetInteger("pending_copy_count", | 275 staging_state->SetInteger("pending_copy_count", |
276 resource_pool_->total_resource_count() - | 276 resource_pool_->total_resource_count() - |
277 resource_pool_->acquired_resource_count()); | 277 resource_pool_->acquired_resource_count()); |
278 staging_state->SetInteger("bytes_pending_copy", | 278 staging_state->SetInteger("bytes_pending_copy", |
279 resource_pool_->total_memory_usage_bytes() - | 279 resource_pool_->total_memory_usage_bytes() - |
280 resource_pool_->acquired_memory_usage_bytes()); | 280 resource_pool_->acquired_memory_usage_bytes()); |
281 } | 281 } |
282 | 282 |
283 } // namespace cc | 283 } // namespace cc |
OLD | NEW |