Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: cc/resources/pixel_buffer_raster_worker_pool.cc

Issue 228173002: cc: Separate RasterWorkerPool interface from implementation details. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Name interface Rasterizer instead and keep RasterWorkerPool name for the implementation Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/pixel_buffer_raster_worker_pool.h" 5 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/containers/stack_container.h" 9 #include "base/containers/stack_container.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
11 #include "cc/debug/traced_value.h" 11 #include "cc/debug/traced_value.h"
12 #include "cc/resources/resource.h" 12 #include "cc/resources/resource.h"
13 13
14 namespace cc { 14 namespace cc {
15 namespace { 15 namespace {
16 16
17 const int kCheckForCompletedRasterTasksDelayMs = 6; 17 const int kCheckForCompletedRasterTasksDelayMs = 6;
18 18
19 const size_t kMaxScheduledRasterTasks = 48; 19 const size_t kMaxScheduledRasterTasks = 48;
20 20
21 typedef base::StackVector<internal::WorkerPoolTask*, kMaxScheduledRasterTasks> 21 typedef base::StackVector<internal::RasterTask*, kMaxScheduledRasterTasks>
22 WorkerPoolTaskVector; 22 RasterTaskVector;
23 23
24 } // namespace 24 } // namespace
25 25
26 // static 26 // static
27 scoped_ptr<PixelBufferRasterWorkerPool> PixelBufferRasterWorkerPool::Create( 27 scoped_ptr<RasterWorkerPool> PixelBufferRasterWorkerPool::Create(
28 base::SequencedTaskRunner* task_runner, 28 base::SequencedTaskRunner* task_runner,
29 internal::TaskGraphRunner* task_graph_runner,
29 ResourceProvider* resource_provider, 30 ResourceProvider* resource_provider,
30 size_t max_transfer_buffer_usage_bytes) { 31 size_t max_transfer_buffer_usage_bytes) {
31 return make_scoped_ptr( 32 return make_scoped_ptr<RasterWorkerPool>(
32 new PixelBufferRasterWorkerPool(task_runner, 33 new PixelBufferRasterWorkerPool(task_runner,
33 GetTaskGraphRunner(), 34 task_graph_runner,
34 resource_provider, 35 resource_provider,
35 max_transfer_buffer_usage_bytes)); 36 max_transfer_buffer_usage_bytes));
36 } 37 }
37 38
38 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( 39 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool(
39 base::SequencedTaskRunner* task_runner, 40 base::SequencedTaskRunner* task_runner,
40 internal::TaskGraphRunner* task_graph_runner, 41 internal::TaskGraphRunner* task_graph_runner,
41 ResourceProvider* resource_provider, 42 ResourceProvider* resource_provider,
42 size_t max_transfer_buffer_usage_bytes) 43 size_t max_transfer_buffer_usage_bytes)
43 : task_runner_(task_runner), 44 : task_runner_(task_runner),
(...skipping 17 matching lines...) Expand all
61 62
62 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { 63 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() {
63 DCHECK(!check_for_completed_raster_tasks_pending_); 64 DCHECK(!check_for_completed_raster_tasks_pending_);
64 DCHECK_EQ(0u, raster_task_states_.size()); 65 DCHECK_EQ(0u, raster_task_states_.size());
65 DCHECK_EQ(0u, raster_tasks_with_pending_upload_.size()); 66 DCHECK_EQ(0u, raster_tasks_with_pending_upload_.size());
66 DCHECK_EQ(0u, completed_raster_tasks_.size()); 67 DCHECK_EQ(0u, completed_raster_tasks_.size());
67 DCHECK_EQ(0u, completed_image_decode_tasks_.size()); 68 DCHECK_EQ(0u, completed_image_decode_tasks_.size());
68 DCHECK_EQ(0u, raster_tasks_required_for_activation_count_); 69 DCHECK_EQ(0u, raster_tasks_required_for_activation_count_);
69 } 70 }
70 71
71 void PixelBufferRasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { 72 Rasterizer* PixelBufferRasterWorkerPool::AsRasterizer() { return this; }
73
74 void PixelBufferRasterWorkerPool::SetClient(RasterizerClient* client) {
72 client_ = client; 75 client_ = client;
73 } 76 }
74 77
75 void PixelBufferRasterWorkerPool::Shutdown() { 78 void PixelBufferRasterWorkerPool::Shutdown() {
76 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::Shutdown"); 79 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::Shutdown");
77 80
78 shutdown_ = true; 81 shutdown_ = true;
79 82
80 internal::TaskGraph empty; 83 internal::TaskGraph empty;
81 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); 84 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
82 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 85 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
83 86
84 CheckForCompletedWorkerPoolTasks(); 87 CheckForCompletedRasterizerTasks();
85 CheckForCompletedUploads(); 88 CheckForCompletedUploads();
86 89
87 check_for_completed_raster_tasks_pending_ = false; 90 check_for_completed_raster_tasks_pending_ = false;
88 91
89 for (RasterTaskState::Vector::iterator it = raster_task_states_.begin(); 92 for (RasterTaskState::Vector::iterator it = raster_task_states_.begin();
90 it != raster_task_states_.end(); 93 it != raster_task_states_.end();
91 ++it) { 94 ++it) {
92 RasterTaskState& state = *it; 95 RasterTaskState& state = *it;
93 96
94 // All unscheduled tasks need to be canceled. 97 // All unscheduled tasks need to be canceled.
(...skipping 20 matching lines...) Expand all
115 should_notify_client_if_no_tasks_are_pending_ = true; 118 should_notify_client_if_no_tasks_are_pending_ = true;
116 should_notify_client_if_no_tasks_required_for_activation_are_pending_ = true; 119 should_notify_client_if_no_tasks_required_for_activation_are_pending_ = true;
117 120
118 raster_tasks_required_for_activation_count_ = 0u; 121 raster_tasks_required_for_activation_count_ = 0u;
119 122
120 // Update raster task state and remove items from old queue. 123 // Update raster task state and remove items from old queue.
121 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 124 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
122 it != queue->items.end(); 125 it != queue->items.end();
123 ++it) { 126 ++it) {
124 const RasterTaskQueue::Item& item = *it; 127 const RasterTaskQueue::Item& item = *it;
125 internal::WorkerPoolTask* task = item.task; 128 internal::RasterTask* task = item.task;
126 129
127 // Remove any old items that are associated with this task. The result is 130 // Remove any old items that are associated with this task. The result is
128 // that the old queue is left with all items not present in this queue, 131 // that the old queue is left with all items not present in this queue,
129 // which we use below to determine what tasks need to be canceled. 132 // which we use below to determine what tasks need to be canceled.
130 RasterTaskQueue::Item::Vector::iterator old_it = 133 RasterTaskQueue::Item::Vector::iterator old_it =
131 std::find_if(raster_tasks_.items.begin(), 134 std::find_if(raster_tasks_.items.begin(),
132 raster_tasks_.items.end(), 135 raster_tasks_.items.end(),
133 RasterTaskQueue::Item::TaskComparator(task)); 136 RasterTaskQueue::Item::TaskComparator(task));
134 if (old_it != raster_tasks_.items.end()) { 137 if (old_it != raster_tasks_.items.end()) {
135 std::swap(*old_it, raster_tasks_.items.back()); 138 std::swap(*old_it, raster_tasks_.items.back());
(...skipping 23 matching lines...) Expand all
159 RasterTaskState(task, item.required_for_activation)); 162 RasterTaskState(task, item.required_for_activation));
160 raster_tasks_required_for_activation_count_ += item.required_for_activation; 163 raster_tasks_required_for_activation_count_ += item.required_for_activation;
161 } 164 }
162 165
163 // Determine what tasks in old queue need to be canceled. 166 // Determine what tasks in old queue need to be canceled.
164 for (RasterTaskQueue::Item::Vector::const_iterator it = 167 for (RasterTaskQueue::Item::Vector::const_iterator it =
165 raster_tasks_.items.begin(); 168 raster_tasks_.items.begin();
166 it != raster_tasks_.items.end(); 169 it != raster_tasks_.items.end();
167 ++it) { 170 ++it) {
168 const RasterTaskQueue::Item& item = *it; 171 const RasterTaskQueue::Item& item = *it;
169 internal::WorkerPoolTask* task = item.task; 172 internal::RasterTask* task = item.task;
170 173
171 RasterTaskState::Vector::iterator state_it = 174 RasterTaskState::Vector::iterator state_it =
172 std::find_if(raster_task_states_.begin(), 175 std::find_if(raster_task_states_.begin(),
173 raster_task_states_.end(), 176 raster_task_states_.end(),
174 RasterTaskState::TaskComparator(task)); 177 RasterTaskState::TaskComparator(task));
175 // We've already processed completion if we can't find a RasterTaskState for 178 // We've already processed completion if we can't find a RasterTaskState for
176 // this task. 179 // this task.
177 if (state_it == raster_task_states_.end()) 180 if (state_it == raster_task_states_.end())
178 continue; 181 continue;
179 182
(...skipping 11 matching lines...) Expand all
191 194
192 // No longer required for activation. 195 // No longer required for activation.
193 state.required_for_activation = false; 196 state.required_for_activation = false;
194 } 197 }
195 198
196 raster_tasks_.Swap(queue); 199 raster_tasks_.Swap(queue);
197 200
198 // Check for completed tasks when ScheduleTasks() is called as 201 // Check for completed tasks when ScheduleTasks() is called as
199 // priorities might have changed and this maximizes the number 202 // priorities might have changed and this maximizes the number
200 // of top priority tasks that are scheduled. 203 // of top priority tasks that are scheduled.
201 CheckForCompletedWorkerPoolTasks(); 204 CheckForCompletedRasterizerTasks();
202 CheckForCompletedUploads(); 205 CheckForCompletedUploads();
203 FlushUploads(); 206 FlushUploads();
204 207
205 // Schedule new tasks. 208 // Schedule new tasks.
206 ScheduleMoreTasks(); 209 ScheduleMoreTasks();
207 210
208 // Cancel any pending check for completed raster tasks and schedule 211 // Cancel any pending check for completed raster tasks and schedule
209 // another check. 212 // another check.
210 check_for_completed_raster_tasks_time_ = base::TimeTicks(); 213 check_for_completed_raster_tasks_time_ = base::TimeTicks();
211 ScheduleCheckForCompletedRasterTasks(); 214 ScheduleCheckForCompletedRasterTasks();
(...skipping 11 matching lines...) Expand all
223 return GL_TEXTURE_2D; 226 return GL_TEXTURE_2D;
224 } 227 }
225 228
226 ResourceFormat PixelBufferRasterWorkerPool::GetResourceFormat() const { 229 ResourceFormat PixelBufferRasterWorkerPool::GetResourceFormat() const {
227 return resource_provider_->memory_efficient_texture_format(); 230 return resource_provider_->memory_efficient_texture_format();
228 } 231 }
229 232
230 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { 233 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
231 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); 234 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks");
232 235
233 CheckForCompletedWorkerPoolTasks(); 236 CheckForCompletedRasterizerTasks();
234 CheckForCompletedUploads(); 237 CheckForCompletedUploads();
235 FlushUploads(); 238 FlushUploads();
236 239
237 for (internal::WorkerPoolTask::Vector::const_iterator it = 240 for (internal::RasterizerTask::Vector::const_iterator it =
238 completed_image_decode_tasks_.begin(); 241 completed_image_decode_tasks_.begin();
239 it != completed_image_decode_tasks_.end(); 242 it != completed_image_decode_tasks_.end();
240 ++it) { 243 ++it) {
241 internal::WorkerPoolTask* task = it->get(); 244 internal::RasterizerTask* task = it->get();
242 task->RunReplyOnOriginThread(); 245 task->RunReplyOnOriginThread();
243 } 246 }
244 completed_image_decode_tasks_.clear(); 247 completed_image_decode_tasks_.clear();
245 248
246 for (internal::WorkerPoolTask::Vector::const_iterator it = 249 for (internal::RasterTask::Vector::const_iterator it =
247 completed_raster_tasks_.begin(); 250 completed_raster_tasks_.begin();
248 it != completed_raster_tasks_.end(); 251 it != completed_raster_tasks_.end();
249 ++it) { 252 ++it) {
250 internal::WorkerPoolTask* task = it->get(); 253 internal::RasterTask* task = it->get();
251 RasterTaskState::Vector::iterator state_it = 254 RasterTaskState::Vector::iterator state_it =
252 std::find_if(raster_task_states_.begin(), 255 std::find_if(raster_task_states_.begin(),
253 raster_task_states_.end(), 256 raster_task_states_.end(),
254 RasterTaskState::TaskComparator(task)); 257 RasterTaskState::TaskComparator(task));
255 DCHECK(state_it != raster_task_states_.end()); 258 DCHECK(state_it != raster_task_states_.end());
256 DCHECK_EQ(RasterTaskState::COMPLETED, state_it->type); 259 DCHECK_EQ(RasterTaskState::COMPLETED, state_it->type);
257 260
258 std::swap(*state_it, raster_task_states_.back()); 261 std::swap(*state_it, raster_task_states_.back());
259 raster_task_states_.pop_back(); 262 raster_task_states_.pop_back();
260 263
261 task->RunReplyOnOriginThread(); 264 task->RunReplyOnOriginThread();
262 } 265 }
263 completed_raster_tasks_.clear(); 266 completed_raster_tasks_.clear();
264 } 267 }
265 268
266 SkCanvas* PixelBufferRasterWorkerPool::AcquireCanvasForRaster( 269 SkCanvas* PixelBufferRasterWorkerPool::AcquireCanvasForRaster(
267 internal::WorkerPoolTask* task, 270 internal::RasterTask* task) {
268 const Resource* resource) {
269 RasterTaskState::Vector::iterator it = 271 RasterTaskState::Vector::iterator it =
270 std::find_if(raster_task_states_.begin(), 272 std::find_if(raster_task_states_.begin(),
271 raster_task_states_.end(), 273 raster_task_states_.end(),
272 RasterTaskState::TaskComparator(task)); 274 RasterTaskState::TaskComparator(task));
273 DCHECK(it != raster_task_states_.end()); 275 DCHECK(it != raster_task_states_.end());
274 DCHECK(!it->resource); 276 resource_provider_->AcquirePixelRasterBuffer(task->resource()->id());
275 it->resource = resource; 277 return resource_provider_->MapPixelRasterBuffer(task->resource()->id());
276 resource_provider_->AcquirePixelRasterBuffer(resource->id());
277 return resource_provider_->MapPixelRasterBuffer(resource->id());
278 } 278 }
279 279
280 void PixelBufferRasterWorkerPool::ReleaseCanvasForRaster( 280 void PixelBufferRasterWorkerPool::ReleaseCanvasForRaster(
281 internal::WorkerPoolTask* task, 281 internal::RasterTask* task) {
282 const Resource* resource) {
283 RasterTaskState::Vector::iterator it = 282 RasterTaskState::Vector::iterator it =
284 std::find_if(raster_task_states_.begin(), 283 std::find_if(raster_task_states_.begin(),
285 raster_task_states_.end(), 284 raster_task_states_.end(),
286 RasterTaskState::TaskComparator(task)); 285 RasterTaskState::TaskComparator(task));
287 DCHECK(it != raster_task_states_.end()); 286 DCHECK(it != raster_task_states_.end());
288 DCHECK(it->resource == resource); 287 resource_provider_->ReleasePixelRasterBuffer(task->resource()->id());
289 resource_provider_->ReleasePixelRasterBuffer(resource->id());
290 } 288 }
291 289
292 void PixelBufferRasterWorkerPool::OnRasterFinished() { 290 void PixelBufferRasterWorkerPool::OnRasterFinished() {
293 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::OnRasterFinished"); 291 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::OnRasterFinished");
294 292
295 // |should_notify_client_if_no_tasks_are_pending_| can be set to false as 293 // |should_notify_client_if_no_tasks_are_pending_| can be set to false as
296 // a result of a scheduled CheckForCompletedRasterTasks() call. No need to 294 // a result of a scheduled CheckForCompletedRasterTasks() call. No need to
297 // perform another check in that case as we've already notified the client. 295 // perform another check in that case as we've already notified the client.
298 if (!should_notify_client_if_no_tasks_are_pending_) 296 if (!should_notify_client_if_no_tasks_are_pending_)
299 return; 297 return;
(...skipping 25 matching lines...) Expand all
325 323
326 void PixelBufferRasterWorkerPool::FlushUploads() { 324 void PixelBufferRasterWorkerPool::FlushUploads() {
327 if (!has_performed_uploads_since_last_flush_) 325 if (!has_performed_uploads_since_last_flush_)
328 return; 326 return;
329 327
330 resource_provider_->ShallowFlushIfSupported(); 328 resource_provider_->ShallowFlushIfSupported();
331 has_performed_uploads_since_last_flush_ = false; 329 has_performed_uploads_since_last_flush_ = false;
332 } 330 }
333 331
334 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { 332 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
335 internal::WorkerPoolTask::Vector tasks_with_completed_uploads; 333 internal::RasterTask::Vector tasks_with_completed_uploads;
336 334
337 // First check if any have completed. 335 // First check if any have completed.
338 while (!raster_tasks_with_pending_upload_.empty()) { 336 while (!raster_tasks_with_pending_upload_.empty()) {
339 internal::WorkerPoolTask* task = 337 internal::RasterTask* task =
340 raster_tasks_with_pending_upload_.front().get(); 338 raster_tasks_with_pending_upload_.front().get();
341 RasterTaskState::Vector::const_iterator it = 339 RasterTaskState::Vector::const_iterator it =
342 std::find_if(raster_task_states_.begin(), 340 std::find_if(raster_task_states_.begin(),
343 raster_task_states_.end(), 341 raster_task_states_.end(),
344 RasterTaskState::TaskComparator(task)); 342 RasterTaskState::TaskComparator(task));
345 DCHECK(it != raster_task_states_.end()); 343 DCHECK(it != raster_task_states_.end());
346 DCHECK_EQ(RasterTaskState::UPLOADING, it->type); 344 DCHECK_EQ(RasterTaskState::UPLOADING, it->type);
347 345
348 // Uploads complete in the order they are issued. 346 // Uploads complete in the order they are issued.
349 if (!resource_provider_->DidSetPixelsComplete(it->resource->id())) 347 if (!resource_provider_->DidSetPixelsComplete(task->resource()->id()))
350 break; 348 break;
351 349
352 tasks_with_completed_uploads.push_back(task); 350 tasks_with_completed_uploads.push_back(task);
353 raster_tasks_with_pending_upload_.pop_front(); 351 raster_tasks_with_pending_upload_.pop_front();
354 } 352 }
355 353
356 DCHECK(client_); 354 DCHECK(client_);
357 bool should_force_some_uploads_to_complete = 355 bool should_force_some_uploads_to_complete =
358 shutdown_ || client_->ShouldForceTasksRequiredForActivationToComplete(); 356 shutdown_ || client_->ShouldForceTasksRequiredForActivationToComplete();
359 357
360 if (should_force_some_uploads_to_complete) { 358 if (should_force_some_uploads_to_complete) {
361 internal::WorkerPoolTask::Vector tasks_with_uploads_to_force; 359 internal::RasterTask::Vector tasks_with_uploads_to_force;
362 TaskDeque::iterator it = raster_tasks_with_pending_upload_.begin(); 360 RasterTaskDeque::iterator it = raster_tasks_with_pending_upload_.begin();
363 while (it != raster_tasks_with_pending_upload_.end()) { 361 while (it != raster_tasks_with_pending_upload_.end()) {
364 internal::WorkerPoolTask* task = it->get(); 362 internal::RasterTask* task = it->get();
365 RasterTaskState::Vector::const_iterator state_it = 363 RasterTaskState::Vector::const_iterator state_it =
366 std::find_if(raster_task_states_.begin(), 364 std::find_if(raster_task_states_.begin(),
367 raster_task_states_.end(), 365 raster_task_states_.end(),
368 RasterTaskState::TaskComparator(task)); 366 RasterTaskState::TaskComparator(task));
369 DCHECK(state_it != raster_task_states_.end()); 367 DCHECK(state_it != raster_task_states_.end());
370 368
371 // Force all uploads required for activation to complete. 369 // Force all uploads required for activation to complete.
372 // During shutdown, force all pending uploads to complete. 370 // During shutdown, force all pending uploads to complete.
373 if (shutdown_ || state_it->required_for_activation) { 371 if (shutdown_ || state_it->required_for_activation) {
374 tasks_with_uploads_to_force.push_back(task); 372 tasks_with_uploads_to_force.push_back(task);
375 tasks_with_completed_uploads.push_back(task); 373 tasks_with_completed_uploads.push_back(task);
376 it = raster_tasks_with_pending_upload_.erase(it); 374 it = raster_tasks_with_pending_upload_.erase(it);
377 continue; 375 continue;
378 } 376 }
379 377
380 ++it; 378 ++it;
381 } 379 }
382 380
383 // Force uploads in reverse order. Since forcing can cause a wait on 381 // Force uploads in reverse order. Since forcing can cause a wait on
384 // all previous uploads, we would rather wait only once downstream. 382 // all previous uploads, we would rather wait only once downstream.
385 for (internal::WorkerPoolTask::Vector::reverse_iterator it = 383 for (internal::RasterTask::Vector::reverse_iterator it =
386 tasks_with_uploads_to_force.rbegin(); 384 tasks_with_uploads_to_force.rbegin();
387 it != tasks_with_uploads_to_force.rend(); 385 it != tasks_with_uploads_to_force.rend();
388 ++it) { 386 ++it) {
389 internal::WorkerPoolTask* task = it->get(); 387 internal::RasterTask* task = it->get();
390 RasterTaskState::Vector::const_iterator state_it = 388 RasterTaskState::Vector::const_iterator state_it =
391 std::find_if(raster_task_states_.begin(), 389 std::find_if(raster_task_states_.begin(),
vmpstr 2014/04/10 18:21:18 This whole find can now be a part of a dcheck
reveman 2014/04/10 19:38:15 Removed this and unnecessary find_if above. We sti
392 raster_task_states_.end(), 390 raster_task_states_.end(),
393 RasterTaskState::TaskComparator(task)); 391 RasterTaskState::TaskComparator(task));
394 DCHECK(state_it != raster_task_states_.end()); 392 DCHECK(state_it != raster_task_states_.end());
395 DCHECK(state_it->resource);
396 393
397 resource_provider_->ForceSetPixelsToComplete(state_it->resource->id()); 394 resource_provider_->ForceSetPixelsToComplete(task->resource()->id());
398 has_performed_uploads_since_last_flush_ = true; 395 has_performed_uploads_since_last_flush_ = true;
399 } 396 }
400 } 397 }
401 398
402 // Release shared memory and move tasks with completed uploads 399 // Release shared memory and move tasks with completed uploads
403 // to |completed_raster_tasks_|. 400 // to |completed_raster_tasks_|.
404 for (internal::WorkerPoolTask::Vector::const_iterator it = 401 for (internal::RasterTask::Vector::const_iterator it =
405 tasks_with_completed_uploads.begin(); 402 tasks_with_completed_uploads.begin();
406 it != tasks_with_completed_uploads.end(); 403 it != tasks_with_completed_uploads.end();
407 ++it) { 404 ++it) {
408 internal::WorkerPoolTask* task = it->get(); 405 internal::RasterTask* task = it->get();
409 RasterTaskState::Vector::iterator state_it = 406 RasterTaskState::Vector::iterator state_it =
410 std::find_if(raster_task_states_.begin(), 407 std::find_if(raster_task_states_.begin(),
411 raster_task_states_.end(), 408 raster_task_states_.end(),
412 RasterTaskState::TaskComparator(task)); 409 RasterTaskState::TaskComparator(task));
413 DCHECK(state_it != raster_task_states_.end()); 410 DCHECK(state_it != raster_task_states_.end());
414 RasterTaskState& state = *state_it; 411 RasterTaskState& state = *state_it;
415 412
416 bytes_pending_upload_ -= state.resource->bytes(); 413 bytes_pending_upload_ -= task->resource()->bytes();
417 414
418 task->WillComplete(); 415 task->WillComplete();
419 task->CompleteOnOriginThread(this); 416 task->CompleteOnOriginThread(this);
420 task->DidComplete(); 417 task->DidComplete();
421 418
422 DCHECK(std::find(completed_raster_tasks_.begin(), 419 DCHECK(std::find(completed_raster_tasks_.begin(),
423 completed_raster_tasks_.end(), 420 completed_raster_tasks_.end(),
424 task) == completed_raster_tasks_.end()); 421 task) == completed_raster_tasks_.end());
425 completed_raster_tasks_.push_back(task); 422 completed_raster_tasks_.push_back(task);
426 state.type = RasterTaskState::COMPLETED; 423 state.type = RasterTaskState::COMPLETED;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 CheckForCompletedRasterTasks(); 469 CheckForCompletedRasterTasks();
473 } 470 }
474 471
475 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { 472 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() {
476 TRACE_EVENT0("cc", 473 TRACE_EVENT0("cc",
477 "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); 474 "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks");
478 475
479 DCHECK(should_notify_client_if_no_tasks_are_pending_); 476 DCHECK(should_notify_client_if_no_tasks_are_pending_);
480 check_for_completed_raster_tasks_time_ = base::TimeTicks(); 477 check_for_completed_raster_tasks_time_ = base::TimeTicks();
481 478
482 CheckForCompletedWorkerPoolTasks(); 479 CheckForCompletedRasterizerTasks();
483 CheckForCompletedUploads(); 480 CheckForCompletedUploads();
484 FlushUploads(); 481 FlushUploads();
485 482
486 // Determine what client notifications to generate. 483 // Determine what client notifications to generate.
487 bool will_notify_client_that_no_tasks_required_for_activation_are_pending = 484 bool will_notify_client_that_no_tasks_required_for_activation_are_pending =
488 (should_notify_client_if_no_tasks_required_for_activation_are_pending_ && 485 (should_notify_client_if_no_tasks_required_for_activation_are_pending_ &&
489 !raster_required_for_activation_finished_task_pending_ && 486 !raster_required_for_activation_finished_task_pending_ &&
490 !HasPendingTasksRequiredForActivation()); 487 !HasPendingTasksRequiredForActivation());
491 bool will_notify_client_that_no_tasks_are_pending = 488 bool will_notify_client_that_no_tasks_are_pending =
492 (should_notify_client_if_no_tasks_are_pending_ && 489 (should_notify_client_if_no_tasks_are_pending_ &&
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 if (will_notify_client_that_no_tasks_are_pending) { 521 if (will_notify_client_that_no_tasks_are_pending) {
525 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 522 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
526 DCHECK(!HasPendingTasksRequiredForActivation()); 523 DCHECK(!HasPendingTasksRequiredForActivation());
527 client_->DidFinishRunningTasks(); 524 client_->DidFinishRunningTasks();
528 } 525 }
529 } 526 }
530 527
531 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { 528 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
532 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); 529 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
533 530
534 WorkerPoolTaskVector tasks; 531 RasterTaskVector tasks;
535 WorkerPoolTaskVector tasks_required_for_activation; 532 RasterTaskVector tasks_required_for_activation;
536 533
537 unsigned priority = kRasterTaskPriorityBase; 534 unsigned priority = kRasterTaskPriorityBase;
538 535
539 graph_.Reset(); 536 graph_.Reset();
540 537
541 size_t bytes_pending_upload = bytes_pending_upload_; 538 size_t bytes_pending_upload = bytes_pending_upload_;
542 bool did_throttle_raster_tasks = false; 539 bool did_throttle_raster_tasks = false;
543 bool did_throttle_raster_tasks_required_for_activation = false; 540 bool did_throttle_raster_tasks_required_for_activation = false;
544 541
545 for (RasterTaskQueue::Item::Vector::const_iterator it = 542 for (RasterTaskQueue::Item::Vector::const_iterator it =
546 raster_tasks_.items.begin(); 543 raster_tasks_.items.begin();
547 it != raster_tasks_.items.end(); 544 it != raster_tasks_.items.end();
548 ++it) { 545 ++it) {
549 const RasterTaskQueue::Item& item = *it; 546 const RasterTaskQueue::Item& item = *it;
550 internal::RasterWorkerPoolTask* task = item.task; 547 internal::RasterTask* task = item.task;
551 548
552 // |raster_task_states_| contains the state of all tasks that we have not 549 // |raster_task_states_| contains the state of all tasks that we have not
553 // yet run reply callbacks for. 550 // yet run reply callbacks for.
554 RasterTaskState::Vector::iterator state_it = 551 RasterTaskState::Vector::iterator state_it =
555 std::find_if(raster_task_states_.begin(), 552 std::find_if(raster_task_states_.begin(),
556 raster_task_states_.end(), 553 raster_task_states_.end(),
557 RasterTaskState::TaskComparator(task)); 554 RasterTaskState::TaskComparator(task));
558 if (state_it == raster_task_states_.end()) 555 if (state_it == raster_task_states_.end())
559 continue; 556 continue;
560 557
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 601 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
605 602
606 tasks.container().push_back(task); 603 tasks.container().push_back(task);
607 if (item.required_for_activation) 604 if (item.required_for_activation)
608 tasks_required_for_activation.container().push_back(task); 605 tasks_required_for_activation.container().push_back(task);
609 } 606 }
610 607
611 // Cancel existing OnRasterFinished callbacks. 608 // Cancel existing OnRasterFinished callbacks.
612 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 609 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
613 610
614 scoped_refptr<internal::WorkerPoolTask> 611 scoped_refptr<internal::RasterizerTask>
615 new_raster_required_for_activation_finished_task; 612 new_raster_required_for_activation_finished_task;
616 613
617 size_t scheduled_raster_task_required_for_activation_count = 614 size_t scheduled_raster_task_required_for_activation_count =
618 tasks_required_for_activation.container().size(); 615 tasks_required_for_activation.container().size();
619 DCHECK_LE(scheduled_raster_task_required_for_activation_count, 616 DCHECK_LE(scheduled_raster_task_required_for_activation_count,
620 raster_tasks_required_for_activation_count_); 617 raster_tasks_required_for_activation_count_);
621 // Schedule OnRasterTasksRequiredForActivationFinished call only when 618 // Schedule OnRasterTasksRequiredForActivationFinished call only when
622 // notification is pending and throttling is not preventing all pending 619 // notification is pending and throttling is not preventing all pending
623 // tasks required for activation from being scheduled. 620 // tasks required for activation from being scheduled.
624 if (!did_throttle_raster_tasks_required_for_activation && 621 if (!did_throttle_raster_tasks_required_for_activation &&
625 should_notify_client_if_no_tasks_required_for_activation_are_pending_) { 622 should_notify_client_if_no_tasks_required_for_activation_are_pending_) {
626 new_raster_required_for_activation_finished_task = 623 new_raster_required_for_activation_finished_task =
627 CreateRasterRequiredForActivationFinishedTask( 624 CreateRasterRequiredForActivationFinishedTask(
628 raster_tasks_.required_for_activation_count, 625 raster_tasks_.required_for_activation_count,
629 task_runner_.get(), 626 task_runner_.get(),
630 base::Bind(&PixelBufferRasterWorkerPool:: 627 base::Bind(&PixelBufferRasterWorkerPool::
631 OnRasterRequiredForActivationFinished, 628 OnRasterRequiredForActivationFinished,
632 raster_finished_weak_ptr_factory_.GetWeakPtr())); 629 raster_finished_weak_ptr_factory_.GetWeakPtr()));
633 raster_required_for_activation_finished_task_pending_ = true; 630 raster_required_for_activation_finished_task_pending_ = true;
634 InsertNodeForTask(&graph_, 631 InsertNodeForTask(&graph_,
635 new_raster_required_for_activation_finished_task.get(), 632 new_raster_required_for_activation_finished_task.get(),
636 kRasterRequiredForActivationFinishedTaskPriority, 633 kRasterRequiredForActivationFinishedTaskPriority,
637 scheduled_raster_task_required_for_activation_count); 634 scheduled_raster_task_required_for_activation_count);
638 for (WorkerPoolTaskVector::ContainerType::const_iterator it = 635 for (RasterTaskVector::ContainerType::const_iterator it =
639 tasks_required_for_activation.container().begin(); 636 tasks_required_for_activation.container().begin();
640 it != tasks_required_for_activation.container().end(); 637 it != tasks_required_for_activation.container().end();
641 ++it) { 638 ++it) {
642 graph_.edges.push_back(internal::TaskGraph::Edge( 639 graph_.edges.push_back(internal::TaskGraph::Edge(
643 *it, new_raster_required_for_activation_finished_task.get())); 640 *it, new_raster_required_for_activation_finished_task.get()));
644 } 641 }
645 } 642 }
646 643
647 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task; 644 scoped_refptr<internal::RasterizerTask> new_raster_finished_task;
648 645
649 size_t scheduled_raster_task_count = tasks.container().size(); 646 size_t scheduled_raster_task_count = tasks.container().size();
650 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount()); 647 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount());
651 // Schedule OnRasterTasksFinished call only when notification is pending 648 // Schedule OnRasterTasksFinished call only when notification is pending
652 // and throttling is not preventing all pending tasks from being scheduled. 649 // and throttling is not preventing all pending tasks from being scheduled.
653 if (!did_throttle_raster_tasks && 650 if (!did_throttle_raster_tasks &&
654 should_notify_client_if_no_tasks_are_pending_) { 651 should_notify_client_if_no_tasks_are_pending_) {
655 new_raster_finished_task = CreateRasterFinishedTask( 652 new_raster_finished_task = CreateRasterFinishedTask(
656 task_runner_.get(), 653 task_runner_.get(),
657 base::Bind(&PixelBufferRasterWorkerPool::OnRasterFinished, 654 base::Bind(&PixelBufferRasterWorkerPool::OnRasterFinished,
658 raster_finished_weak_ptr_factory_.GetWeakPtr())); 655 raster_finished_weak_ptr_factory_.GetWeakPtr()));
659 raster_finished_task_pending_ = true; 656 raster_finished_task_pending_ = true;
660 InsertNodeForTask(&graph_, 657 InsertNodeForTask(&graph_,
661 new_raster_finished_task.get(), 658 new_raster_finished_task.get(),
662 kRasterFinishedTaskPriority, 659 kRasterFinishedTaskPriority,
663 scheduled_raster_task_count); 660 scheduled_raster_task_count);
664 for (WorkerPoolTaskVector::ContainerType::const_iterator it = 661 for (RasterTaskVector::ContainerType::const_iterator it =
665 tasks.container().begin(); 662 tasks.container().begin();
666 it != tasks.container().end(); 663 it != tasks.container().end();
667 ++it) { 664 ++it) {
668 graph_.edges.push_back( 665 graph_.edges.push_back(
669 internal::TaskGraph::Edge(*it, new_raster_finished_task.get())); 666 internal::TaskGraph::Edge(*it, new_raster_finished_task.get()));
670 } 667 }
671 } 668 }
672 669
673 ScheduleTasksOnOriginThread(this, &graph_); 670 ScheduleTasksOnOriginThread(this, &graph_);
674 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 671 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
(...skipping 24 matching lines...) Expand all
699 if (scheduled_raster_task_count_) 696 if (scheduled_raster_task_count_)
700 return "rasterizing"; 697 return "rasterizing";
701 if (PendingRasterTaskCount()) 698 if (PendingRasterTaskCount())
702 return "throttled"; 699 return "throttled";
703 if (!raster_tasks_with_pending_upload_.empty()) 700 if (!raster_tasks_with_pending_upload_.empty())
704 return "waiting_for_uploads"; 701 return "waiting_for_uploads";
705 702
706 return "finishing"; 703 return "finishing";
707 } 704 }
708 705
709 void PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks() { 706 void PixelBufferRasterWorkerPool::CheckForCompletedRasterizerTasks() {
710 TRACE_EVENT0("cc", 707 TRACE_EVENT0("cc",
711 "PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks"); 708 "PixelBufferRasterWorkerPool::CheckForCompletedRasterizerTasks");
712 709
713 task_graph_runner_->CollectCompletedTasks(namespace_token_, 710 task_graph_runner_->CollectCompletedTasks(namespace_token_,
714 &completed_tasks_); 711 &completed_tasks_);
715 for (internal::Task::Vector::const_iterator it = completed_tasks_.begin(); 712 for (internal::Task::Vector::const_iterator it = completed_tasks_.begin();
716 it != completed_tasks_.end(); 713 it != completed_tasks_.end();
717 ++it) { 714 ++it) {
718 internal::WorkerPoolTask* task = 715 internal::RasterizerTask* task =
719 static_cast<internal::WorkerPoolTask*>(it->get()); 716 static_cast<internal::RasterizerTask*>(it->get());
720 717
721 RasterTaskState::Vector::iterator state_it = 718 internal::RasterTask* raster_task = task->AsRasterTask();
722 std::find_if(raster_task_states_.begin(), 719 if (!raster_task) {
723 raster_task_states_.end(),
724 RasterTaskState::TaskComparator(task));
725 if (state_it == raster_task_states_.end()) {
726 task->WillComplete(); 720 task->WillComplete();
727 task->CompleteOnOriginThread(this); 721 task->CompleteOnOriginThread(this);
728 task->DidComplete(); 722 task->DidComplete();
729 723
730 completed_image_decode_tasks_.push_back(task); 724 completed_image_decode_tasks_.push_back(task);
731 continue; 725 continue;
732 } 726 }
733 727
728 RasterTaskState::Vector::iterator state_it =
729 std::find_if(raster_task_states_.begin(),
730 raster_task_states_.end(),
731 RasterTaskState::TaskComparator(raster_task));
732 DCHECK(state_it != raster_task_states_.end());
733
734 RasterTaskState& state = *state_it; 734 RasterTaskState& state = *state_it;
735 DCHECK_EQ(RasterTaskState::SCHEDULED, state.type); 735 DCHECK_EQ(RasterTaskState::SCHEDULED, state.type);
736 DCHECK(state.resource);
737 736
738 // Balanced with MapPixelRasterBuffer() call in AcquireCanvasForRaster(). 737 // Balanced with MapPixelRasterBuffer() call in AcquireCanvasForRaster().
739 bool content_has_changed = 738 bool content_has_changed = resource_provider_->UnmapPixelRasterBuffer(
740 resource_provider_->UnmapPixelRasterBuffer(state.resource->id()); 739 raster_task->resource()->id());
741 740
742 // |content_has_changed| can be false as result of task being canceled or 741 // |content_has_changed| can be false as result of task being canceled or
743 // task implementation deciding not to modify bitmap (ie. analysis of raster 742 // task implementation deciding not to modify bitmap (ie. analysis of raster
744 // commands detected content as a solid color). 743 // commands detected content as a solid color).
745 if (!content_has_changed) { 744 if (!content_has_changed) {
746 task->WillComplete(); 745 raster_task->WillComplete();
747 task->CompleteOnOriginThread(this); 746 raster_task->CompleteOnOriginThread(this);
748 task->DidComplete(); 747 raster_task->DidComplete();
749 748
750 if (!task->HasFinishedRunning()) { 749 if (!raster_task->HasFinishedRunning()) {
751 // When priorites change, a raster task can be canceled as a result of 750 // When priorites change, a raster task can be canceled as a result of
752 // no longer being of high enough priority to fit in our throttled 751 // no longer being of high enough priority to fit in our throttled
753 // raster task budget. The task has not yet completed in this case. 752 // raster task budget. The task has not yet completed in this case.
754 RasterTaskQueue::Item::Vector::const_iterator item_it = 753 RasterTaskQueue::Item::Vector::const_iterator item_it =
755 std::find_if(raster_tasks_.items.begin(), 754 std::find_if(raster_tasks_.items.begin(),
756 raster_tasks_.items.end(), 755 raster_tasks_.items.end(),
757 RasterTaskQueue::Item::TaskComparator(task)); 756 RasterTaskQueue::Item::TaskComparator(raster_task));
758 if (item_it != raster_tasks_.items.end()) { 757 if (item_it != raster_tasks_.items.end()) {
759 state.type = RasterTaskState::UNSCHEDULED; 758 state.type = RasterTaskState::UNSCHEDULED;
760 state.resource = NULL;
761 continue; 759 continue;
762 } 760 }
763 } 761 }
764 762
765 DCHECK(std::find(completed_raster_tasks_.begin(), 763 DCHECK(std::find(completed_raster_tasks_.begin(),
766 completed_raster_tasks_.end(), 764 completed_raster_tasks_.end(),
767 task) == completed_raster_tasks_.end()); 765 raster_task) == completed_raster_tasks_.end());
768 completed_raster_tasks_.push_back(task); 766 completed_raster_tasks_.push_back(raster_task);
769 state.type = RasterTaskState::COMPLETED; 767 state.type = RasterTaskState::COMPLETED;
770 DCHECK_LE(static_cast<size_t>(state.required_for_activation), 768 DCHECK_LE(static_cast<size_t>(state.required_for_activation),
771 raster_tasks_required_for_activation_count_); 769 raster_tasks_required_for_activation_count_);
772 raster_tasks_required_for_activation_count_ -= 770 raster_tasks_required_for_activation_count_ -=
773 state.required_for_activation; 771 state.required_for_activation;
774 continue; 772 continue;
775 } 773 }
776 774
777 DCHECK(task->HasFinishedRunning()); 775 DCHECK(raster_task->HasFinishedRunning());
778 776
779 resource_provider_->BeginSetPixels(state.resource->id()); 777 resource_provider_->BeginSetPixels(raster_task->resource()->id());
780 has_performed_uploads_since_last_flush_ = true; 778 has_performed_uploads_since_last_flush_ = true;
781 779
782 bytes_pending_upload_ += state.resource->bytes(); 780 bytes_pending_upload_ += raster_task->resource()->bytes();
783 raster_tasks_with_pending_upload_.push_back(task); 781 raster_tasks_with_pending_upload_.push_back(raster_task);
784 state.type = RasterTaskState::UPLOADING; 782 state.type = RasterTaskState::UPLOADING;
785 } 783 }
786 completed_tasks_.clear(); 784 completed_tasks_.clear();
787 } 785 }
788 786
789 scoped_ptr<base::Value> PixelBufferRasterWorkerPool::StateAsValue() const { 787 scoped_ptr<base::Value> PixelBufferRasterWorkerPool::StateAsValue() const {
790 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); 788 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue);
791 789
792 state->SetInteger("completed_count", completed_raster_tasks_.size()); 790 state->SetInteger("completed_count", completed_raster_tasks_.size());
793 state->SetInteger("pending_count", raster_task_states_.size()); 791 state->SetInteger("pending_count", raster_task_states_.size());
(...skipping 11 matching lines...) Expand all
805 803
806 throttle_state->SetInteger("bytes_available_for_upload", 804 throttle_state->SetInteger("bytes_available_for_upload",
807 max_bytes_pending_upload_ - bytes_pending_upload_); 805 max_bytes_pending_upload_ - bytes_pending_upload_);
808 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_); 806 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_);
809 throttle_state->SetInteger("scheduled_raster_task_count", 807 throttle_state->SetInteger("scheduled_raster_task_count",
810 scheduled_raster_task_count_); 808 scheduled_raster_task_count_);
811 return throttle_state.PassAs<base::Value>(); 809 return throttle_state.PassAs<base::Value>();
812 } 810 }
813 811
814 } // namespace cc 812 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698