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

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

Issue 15984016: Call scoped_refptr<T>::get() rather than relying on implicit "operator T*" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 7 years, 6 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
« no previous file with comments | « cc/resources/image_raster_worker_pool.cc ('k') | cc/resources/raster_worker_pool.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/resources/resource.h" 8 #include "cc/resources/resource.h"
9 #include "third_party/skia/include/core/SkDevice.h" 9 #include "third_party/skia/include/core/SkDevice.h"
10 10
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 DCHECK_EQ(0u, completed_tasks_.size()); 98 DCHECK_EQ(0u, completed_tasks_.size());
99 } 99 }
100 100
101 void PixelBufferRasterWorkerPool::Shutdown() { 101 void PixelBufferRasterWorkerPool::Shutdown() {
102 RasterWorkerPool::Shutdown(); 102 RasterWorkerPool::Shutdown();
103 CheckForCompletedRasterTasks(); 103 CheckForCompletedRasterTasks();
104 AbortPendingUploads(); 104 AbortPendingUploads();
105 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); 105 for (TaskMap::iterator it = pixel_buffer_tasks_.begin();
106 it != pixel_buffer_tasks_.end(); ++it) { 106 it != pixel_buffer_tasks_.end(); ++it) {
107 internal::RasterWorkerPoolTask* task = it->first; 107 internal::RasterWorkerPoolTask* task = it->first;
108 internal::WorkerPoolTask* pixel_buffer_task = it->second; 108 internal::WorkerPoolTask* pixel_buffer_task = it->second.get();
109 109
110 // All inactive tasks needs to be canceled. 110 // All inactive tasks needs to be canceled.
111 if (!pixel_buffer_task) 111 if (!pixel_buffer_task)
112 completed_tasks_.push_back(task); 112 completed_tasks_.push_back(task);
113 } 113 }
114 // Cancel any pending OnRasterFinished callback. 114 // Cancel any pending OnRasterFinished callback.
115 weak_ptr_factory_.InvalidateWeakPtrs(); 115 weak_ptr_factory_.InvalidateWeakPtrs();
116 } 116 }
117 117
118 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { 118 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
119 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); 119 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks");
120 120
121 RasterWorkerPool::SetRasterTasks(queue); 121 RasterWorkerPool::SetRasterTasks(queue);
122 122
123 // Build new pixel buffer task set. 123 // Build new pixel buffer task set.
124 TaskMap new_pixel_buffer_tasks; 124 TaskMap new_pixel_buffer_tasks;
125 for (RasterTask::Queue::TaskVector::const_iterator it = 125 for (RasterTask::Queue::TaskVector::const_iterator it =
126 raster_tasks().begin(); 126 raster_tasks().begin();
127 it != raster_tasks().end(); ++it) { 127 it != raster_tasks().end(); ++it) {
128 internal::RasterWorkerPoolTask* task = *it; 128 internal::RasterWorkerPoolTask* task = it->get();
129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); 129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end());
130 DCHECK(!task->HasCompleted()); 130 DCHECK(!task->HasCompleted());
131 131
132 // Use existing pixel buffer task if available. 132 // Use existing pixel buffer task if available.
133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); 133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task);
134 if (pixel_buffer_it == pixel_buffer_tasks_.end()) { 134 if (pixel_buffer_it == pixel_buffer_tasks_.end()) {
135 new_pixel_buffer_tasks[task] = NULL; 135 new_pixel_buffer_tasks[task] = NULL;
136 continue; 136 continue;
137 } 137 }
138 138
139 new_pixel_buffer_tasks[task] = pixel_buffer_it->second; 139 new_pixel_buffer_tasks[task] = pixel_buffer_it->second;
140 pixel_buffer_tasks_.erase(task); 140 pixel_buffer_tasks_.erase(task);
141 } 141 }
142 142
143 // Transfer remaining pixel buffer tasks to |new_pixel_buffer_tasks| 143 // Transfer remaining pixel buffer tasks to |new_pixel_buffer_tasks|
144 // and cancel all remaining inactive tasks. 144 // and cancel all remaining inactive tasks.
145 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); 145 for (TaskMap::iterator it = pixel_buffer_tasks_.begin();
146 it != pixel_buffer_tasks_.end(); ++it) { 146 it != pixel_buffer_tasks_.end(); ++it) {
147 internal::RasterWorkerPoolTask* task = it->first; 147 internal::RasterWorkerPoolTask* task = it->first;
148 internal::WorkerPoolTask* pixel_buffer_task = it->second; 148 internal::WorkerPoolTask* pixel_buffer_task = it->second.get();
149 149
150 // Move task to |new_pixel_buffer_tasks| 150 // Move task to |new_pixel_buffer_tasks|
151 new_pixel_buffer_tasks[task] = pixel_buffer_task; 151 new_pixel_buffer_tasks[task] = pixel_buffer_task;
152 152
153 // Inactive task can be canceled. 153 // Inactive task can be canceled.
154 if (!pixel_buffer_task) 154 if (!pixel_buffer_task)
155 completed_tasks_.push_back(task); 155 completed_tasks_.push_back(task);
156 } 156 }
157 157
158 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); 158 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks);
159 159
160 ScheduleMoreTasks(); 160 ScheduleMoreTasks();
161 } 161 }
162 162
163 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { 163 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
164 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); 164 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks");
165 165
166 CheckForCompletedRasterTasks(); 166 CheckForCompletedRasterTasks();
167 167
168 while (!completed_tasks_.empty()) { 168 while (!completed_tasks_.empty()) {
169 internal::RasterWorkerPoolTask* task = completed_tasks_.front(); 169 internal::RasterWorkerPoolTask* task = completed_tasks_.front().get();
170 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); 170 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end());
171 171
172 pixel_buffer_tasks_.erase(task); 172 pixel_buffer_tasks_.erase(task);
173 173
174 task->DidComplete(); 174 task->DidComplete();
175 task->DispatchCompletionCallback(); 175 task->DispatchCompletionCallback();
176 176
177 completed_tasks_.pop_front(); 177 completed_tasks_.pop_front();
178 } 178 }
179 } 179 }
180 180
181 bool PixelBufferRasterWorkerPool::ForceUploadToComplete( 181 bool PixelBufferRasterWorkerPool::ForceUploadToComplete(
182 const RasterTask& raster_task) { 182 const RasterTask& raster_task) {
183 for (TaskDeque::iterator it = tasks_with_pending_upload_.begin(); 183 for (TaskDeque::iterator it = tasks_with_pending_upload_.begin();
184 it != tasks_with_pending_upload_.end(); ++it) { 184 it != tasks_with_pending_upload_.end(); ++it) {
185 internal::RasterWorkerPoolTask* task = *it; 185 internal::RasterWorkerPoolTask* task = it->get();
186 if (task == raster_task.internal_) { 186 if (task == raster_task.internal_.get()) {
187 resource_provider()->ForceSetPixelsToComplete(task->resource()->id()); 187 resource_provider()->ForceSetPixelsToComplete(task->resource()->id());
188 return true; 188 return true;
189 } 189 }
190 } 190 }
191 191
192 return false; 192 return false;
193 } 193 }
194 194
195 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { 195 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() {
196 if (check_for_completed_raster_tasks_pending_) 196 if (check_for_completed_raster_tasks_pending_)
(...skipping 17 matching lines...) Expand all
214 check_for_completed_raster_tasks_pending_ = false; 214 check_for_completed_raster_tasks_pending_ = false;
215 215
216 WorkerPool::CheckForCompletedTasks(); 216 WorkerPool::CheckForCompletedTasks();
217 217
218 if (has_performed_uploads_since_last_flush_) { 218 if (has_performed_uploads_since_last_flush_) {
219 resource_provider()->ShallowFlushIfSupported(); 219 resource_provider()->ShallowFlushIfSupported();
220 has_performed_uploads_since_last_flush_ = false; 220 has_performed_uploads_since_last_flush_ = false;
221 } 221 }
222 222
223 while (!tasks_with_pending_upload_.empty()) { 223 while (!tasks_with_pending_upload_.empty()) {
224 internal::RasterWorkerPoolTask* task = tasks_with_pending_upload_.front(); 224 internal::RasterWorkerPoolTask* task =
225 tasks_with_pending_upload_.front().get();
225 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); 226 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end());
226 227
227 // Uploads complete in the order they are issued. 228 // Uploads complete in the order they are issued.
228 if (!resource_provider()->DidSetPixelsComplete(task->resource()->id())) 229 if (!resource_provider()->DidSetPixelsComplete(task->resource()->id()))
229 break; 230 break;
230 231
231 // It's now safe to release the pixel buffer and the shared memory. 232 // It's now safe to release the pixel buffer and the shared memory.
232 resource_provider()->ReleasePixelBuffer(task->resource()->id()); 233 resource_provider()->ReleasePixelBuffer(task->resource()->id());
233 234
234 bytes_pending_upload_ -= task->resource()->bytes(); 235 bytes_pending_upload_ -= task->resource()->bytes();
(...skipping 11 matching lines...) Expand all
246 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); 247 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
247 248
248 size_t tasks_with_pending_upload = tasks_with_pending_upload_.size(); 249 size_t tasks_with_pending_upload = tasks_with_pending_upload_.size();
249 size_t bytes_pending_upload = bytes_pending_upload_; 250 size_t bytes_pending_upload = bytes_pending_upload_;
250 251
251 internal::WorkerPoolTask::TaskVector tasks; 252 internal::WorkerPoolTask::TaskVector tasks;
252 253
253 for (RasterTask::Queue::TaskVector::const_iterator it = 254 for (RasterTask::Queue::TaskVector::const_iterator it =
254 raster_tasks().begin(); 255 raster_tasks().begin();
255 it != raster_tasks().end(); ++it) { 256 it != raster_tasks().end(); ++it) {
256 internal::RasterWorkerPoolTask* task = *it; 257 internal::RasterWorkerPoolTask* task = it->get();
257 258
258 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); 259 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task);
259 if (pixel_buffer_it == pixel_buffer_tasks_.end()) 260 if (pixel_buffer_it == pixel_buffer_tasks_.end())
260 continue; 261 continue;
261 262
262 scoped_refptr<internal::WorkerPoolTask> pixel_buffer_task( 263 scoped_refptr<internal::WorkerPoolTask> pixel_buffer_task(
263 pixel_buffer_it->second); 264 pixel_buffer_it->second);
264 if (pixel_buffer_task) { 265 if (pixel_buffer_task.get()) {
265 if (!pixel_buffer_task->HasCompleted()) 266 if (!pixel_buffer_task->HasCompleted())
266 tasks.push_back(pixel_buffer_task); 267 tasks.push_back(pixel_buffer_task);
267 continue; 268 continue;
268 } 269 }
269 270
270 // Throttle raster tasks based on number of pending uploads. 271 // Throttle raster tasks based on number of pending uploads.
271 size_t new_tasks_with_pending_upload = tasks_with_pending_upload; 272 size_t new_tasks_with_pending_upload = tasks_with_pending_upload;
272 new_tasks_with_pending_upload += 1; 273 new_tasks_with_pending_upload += 1;
273 if (new_tasks_with_pending_upload > kMaxPendingUploads) 274 if (new_tasks_with_pending_upload > kMaxPendingUploads)
274 break; 275 break;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 } 335 }
335 336
336 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( 337 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted(
337 scoped_refptr<internal::RasterWorkerPoolTask> task, 338 scoped_refptr<internal::RasterWorkerPoolTask> task,
338 bool was_canceled, 339 bool was_canceled,
339 bool needs_upload) { 340 bool needs_upload) {
340 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", 341 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted",
341 "was_canceled", was_canceled, 342 "was_canceled", was_canceled,
342 "needs_upload", needs_upload); 343 "needs_upload", needs_upload);
343 344
344 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); 345 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end());
345 346
346 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). 347 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks().
347 resource_provider()->UnmapPixelBuffer(task->resource()->id()); 348 resource_provider()->UnmapPixelBuffer(task->resource()->id());
348 349
349 if (!needs_upload) { 350 if (!needs_upload) {
350 resource_provider()->ReleasePixelBuffer(task->resource()->id()); 351 resource_provider()->ReleasePixelBuffer(task->resource()->id());
351 // No upload needed. Dispatch completion callback. 352 // No upload needed. Dispatch completion callback.
352 if (!was_canceled) 353 if (!was_canceled)
353 task->DidRun(); 354 task->DidRun();
354 355
355 completed_tasks_.push_back(task); 356 completed_tasks_.push_back(task);
356 return; 357 return;
357 } 358 }
358 359
359 resource_provider()->BeginSetPixels(task->resource()->id()); 360 resource_provider()->BeginSetPixels(task->resource()->id());
360 has_performed_uploads_since_last_flush_ = true; 361 has_performed_uploads_since_last_flush_ = true;
361 362
362 bytes_pending_upload_ += task->resource()->bytes(); 363 bytes_pending_upload_ += task->resource()->bytes();
363 tasks_with_pending_upload_.push_back(task); 364 tasks_with_pending_upload_.push_back(task);
364 } 365 }
365 366
366 void PixelBufferRasterWorkerPool::AbortPendingUploads() { 367 void PixelBufferRasterWorkerPool::AbortPendingUploads() {
367 while (!tasks_with_pending_upload_.empty()) { 368 while (!tasks_with_pending_upload_.empty()) {
368 internal::RasterWorkerPoolTask* task = tasks_with_pending_upload_.front(); 369 internal::RasterWorkerPoolTask* task =
370 tasks_with_pending_upload_.front().get();
369 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); 371 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end());
370 372
371 resource_provider()->AbortSetPixels(task->resource()->id()); 373 resource_provider()->AbortSetPixels(task->resource()->id());
372 resource_provider()->ReleasePixelBuffer(task->resource()->id()); 374 resource_provider()->ReleasePixelBuffer(task->resource()->id());
373 375
374 bytes_pending_upload_ -= task->resource()->bytes(); 376 bytes_pending_upload_ -= task->resource()->bytes();
375 377
376 // Need to run the reply callback even though task was aborted. 378 // Need to run the reply callback even though task was aborted.
377 completed_tasks_.push_back(task); 379 completed_tasks_.push_back(task);
378 380
(...skipping 16 matching lines...) Expand all
395 397
396 // static 398 // static
397 void PixelBufferRasterWorkerPool::RunRasterFinishedTask( 399 void PixelBufferRasterWorkerPool::RunRasterFinishedTask(
398 scoped_refptr<base::MessageLoopProxy> origin_loop, 400 scoped_refptr<base::MessageLoopProxy> origin_loop,
399 const base::Closure& on_raster_finished_callback) { 401 const base::Closure& on_raster_finished_callback) {
400 TRACE_EVENT0("cc", "RasterWorkerPool::RunRasterFinishedTask"); 402 TRACE_EVENT0("cc", "RasterWorkerPool::RunRasterFinishedTask");
401 origin_loop->PostTask(FROM_HERE, on_raster_finished_callback); 403 origin_loop->PostTask(FROM_HERE, on_raster_finished_callback);
402 } 404 }
403 405
404 } // namespace cc 406 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/image_raster_worker_pool.cc ('k') | cc/resources/raster_worker_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698