| OLD | NEW |
| (Empty) | |
| 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. |
| 4 |
| 5 #include "cc/resources/image_raster_worker_pool.h" |
| 6 |
| 7 #include "cc/resources/resource.h" |
| 8 |
| 9 namespace cc { |
| 10 |
| 11 namespace { |
| 12 |
| 13 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 14 public: |
| 15 // First callback parameter is true when task was canceled. |
| 16 typedef base::Callback<void(bool)> Reply; |
| 17 |
| 18 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, |
| 19 TaskVector* dependencies, |
| 20 uint8_t* buffer, |
| 21 const Reply& reply) |
| 22 : internal::WorkerPoolTask(dependencies), |
| 23 task_(task), |
| 24 buffer_(buffer), |
| 25 reply_(reply) { |
| 26 } |
| 27 |
| 28 // Overridden from internal::WorkerPoolTask: |
| 29 virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
| 30 task_->RunOnThread(buffer_, thread_index); |
| 31 } |
| 32 virtual void DispatchCompletionCallback() OVERRIDE { |
| 33 reply_.Run(!HasFinishedRunning()); |
| 34 } |
| 35 |
| 36 private: |
| 37 virtual ~ImageWorkerPoolTaskImpl() {} |
| 38 |
| 39 scoped_refptr<internal::RasterWorkerPoolTask> task_; |
| 40 uint8_t* buffer_; |
| 41 const Reply reply_; |
| 42 }; |
| 43 |
| 44 } // namespace |
| 45 |
| 46 ImageRasterWorkerPool::ImageRasterWorkerPool( |
| 47 ResourceProvider* resource_provider, size_t num_threads) |
| 48 : RasterWorkerPool(resource_provider, num_threads) { |
| 49 // TODO(reveman): Remove WorkerPool client interface. |
| 50 WorkerPool::SetClient(this); |
| 51 } |
| 52 |
| 53 ImageRasterWorkerPool::~ImageRasterWorkerPool() { |
| 54 DCHECK_EQ(0u, image_tasks_.size()); |
| 55 } |
| 56 |
| 57 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
| 58 internal::WorkerPoolTask::TaskVector raster_tasks; |
| 59 |
| 60 RasterWorkerPool::SetRasterTasks(queue); |
| 61 |
| 62 for (RasterTask::Queue::TaskVector::iterator it = raster_tasks_.begin(); |
| 63 it != raster_tasks_.end(); ++it) { |
| 64 internal::RasterWorkerPoolTask* task = *it; |
| 65 |
| 66 TaskMap::iterator image_it = image_tasks_.find(task); |
| 67 if (image_it != image_tasks_.end()) { |
| 68 internal::WorkerPoolTask* image_task = image_it->second; |
| 69 raster_tasks.push_back(image_task); |
| 70 continue; |
| 71 } |
| 72 |
| 73 // Acquire image for resource. |
| 74 resource_provider_->AcquireImage(task->resource()->id()); |
| 75 |
| 76 // Map image for raster. |
| 77 uint8* buffer = resource_provider_->MapImage(task->resource()->id()); |
| 78 |
| 79 // TODO(reveman): Avoid having to make a copy of dependencies. |
| 80 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); |
| 81 scoped_refptr<internal::WorkerPoolTask> image_task( |
| 82 new ImageWorkerPoolTaskImpl( |
| 83 task, |
| 84 &dependencies, |
| 85 buffer, |
| 86 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, |
| 87 base::Unretained(this), |
| 88 make_scoped_refptr(task)))); |
| 89 |
| 90 raster_tasks.push_back(image_task); |
| 91 } |
| 92 |
| 93 ScheduleRasterTasks(&raster_tasks); |
| 94 } |
| 95 |
| 96 void ImageRasterWorkerPool::OnRasterTaskCompleted( |
| 97 scoped_refptr<internal::RasterWorkerPoolTask> task, |
| 98 bool was_canceled) { |
| 99 DCHECK(image_tasks_.find(task) != image_tasks_.end()); |
| 100 |
| 101 // Balanced with MapImage() call in ScheduleTasks(). |
| 102 resource_provider_->UnmapImage(task->resource()->id()); |
| 103 |
| 104 // Bind image to resource. |
| 105 resource_provider_->BindImage(task->resource()->id()); |
| 106 |
| 107 if (!was_canceled) |
| 108 task->DidRun(); |
| 109 |
| 110 DidFinishRasterTask(task); |
| 111 image_tasks_.erase(task); |
| 112 } |
| 113 |
| 114 void ImageRasterWorkerPool::DidFinishRasterTask( |
| 115 internal::RasterWorkerPoolTask* task) { |
| 116 task->DidComplete(); |
| 117 task->DispatchCompletionCallback(); |
| 118 } |
| 119 |
| 120 } // namespace cc |
| OLD | NEW |