Chromium Code Reviews| 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 RootWorkerPoolTaskImpl : public internal::WorkerPoolTask { | |
|
vmpstr
2013/05/29 16:55:03
EmptyWorkerPoolTaskImpl? Also it might be worth ma
reveman
2013/05/29 19:39:12
Maybe we just make internal::WorkerPoolTask a full
vmpstr
2013/05/29 20:45:06
That works. I would suspect that any other uses of
reveman
2013/05/30 01:46:10
I ended up doing something a bit different in the
| |
| 14 public: | |
| 15 explicit RootWorkerPoolTaskImpl( | |
| 16 internal::WorkerPoolTask::TaskVector* dependencies) | |
| 17 : internal::WorkerPoolTask(dependencies) { | |
| 18 } | |
| 19 | |
| 20 // Overridden from internal::WorkerPoolTask: | |
| 21 virtual void RunOnThread(unsigned thread_index) OVERRIDE {} | |
| 22 virtual void DispatchCompletionCallback() OVERRIDE {} | |
| 23 | |
| 24 private: | |
| 25 virtual ~RootWorkerPoolTaskImpl() {} | |
| 26 }; | |
| 27 | |
| 28 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { | |
| 29 public: | |
| 30 // First callback parameter is true when task was canceled. Second is | |
| 31 // true when bind is needed. | |
| 32 typedef base::Callback<void(bool, bool)> Reply; | |
| 33 | |
| 34 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, | |
| 35 TaskVector* dependencies, | |
| 36 uint8_t* buffer, | |
| 37 const Reply& reply) | |
| 38 : internal::WorkerPoolTask(dependencies), | |
| 39 task_(task), | |
| 40 buffer_(buffer), | |
| 41 reply_(reply), | |
| 42 need_bind_(false) { | |
| 43 } | |
| 44 | |
| 45 // Overridden from internal::WorkerPoolTask: | |
| 46 virtual void RunOnThread(unsigned thread_index) OVERRIDE { | |
| 47 need_bind_ = task_->RunOnThread(buffer_, thread_index); | |
| 48 } | |
| 49 virtual void DispatchCompletionCallback() OVERRIDE { | |
|
kaanb
2013/05/29 21:04:15
nit: space between methods
reveman
2013/05/30 01:46:10
Using no space here to make it clear they are both
| |
| 50 DCHECK(need_bind_ || !HasFinishedRunning()); | |
| 51 reply_.Run(!HasFinishedRunning(), need_bind_); | |
| 52 } | |
| 53 | |
| 54 private: | |
| 55 virtual ~ImageWorkerPoolTaskImpl() {} | |
| 56 | |
| 57 scoped_refptr<internal::RasterWorkerPoolTask> task_; | |
| 58 uint8_t* buffer_; | |
| 59 const Reply reply_; | |
| 60 bool need_bind_; | |
| 61 }; | |
| 62 | |
| 63 } // namespace | |
| 64 | |
| 65 ImageRasterWorkerPool::ImageRasterWorkerPool( | |
| 66 ResourceProvider* resource_provider, size_t num_threads) | |
| 67 : RasterWorkerPool(resource_provider, num_threads) { | |
| 68 // TODO(reveman): Remove WorkerPool client interface. | |
| 69 WorkerPool::SetClient(this); | |
| 70 } | |
| 71 | |
| 72 ImageRasterWorkerPool::~ImageRasterWorkerPool() { | |
| 73 } | |
| 74 | |
| 75 void ImageRasterWorkerPool::Shutdown() { | |
| 76 RasterWorkerPool::Shutdown(); | |
| 77 } | |
| 78 | |
| 79 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | |
| 80 internal::WorkerPoolTask::TaskVector tasks; | |
| 81 | |
| 82 RasterWorkerPool::SetRasterTasks(queue); | |
| 83 | |
| 84 for (RasterTask::Queue::TaskVector::iterator it = raster_tasks_.begin(); | |
|
kaanb
2013/05/29 21:04:15
do we support for-each syntax for Chromium?, i.e.
reveman
2013/05/30 01:46:10
c++0x syntax not allowed afaik.
| |
| 85 it != raster_tasks_.end(); ++it) { | |
| 86 internal::RasterWorkerPoolTask* task = *it; | |
| 87 | |
| 88 // Acquire image for resource. | |
| 89 resource_provider_->AcquireImage(task->resource()->id()); | |
| 90 | |
| 91 // Map image for raster. | |
| 92 uint8* buffer = resource_provider_->MapImage(task->resource()->id()); | |
| 93 | |
| 94 // TODO(reveman): Avoid having to make a copy of dependencies. | |
| 95 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); | |
| 96 scoped_refptr<internal::WorkerPoolTask> image_task( | |
| 97 new ImageWorkerPoolTaskImpl( | |
| 98 task, | |
| 99 &dependencies, | |
| 100 buffer, | |
| 101 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, | |
| 102 base::Unretained(this), | |
| 103 make_scoped_refptr(task)))); | |
| 104 | |
| 105 tasks.push_back(image_task); | |
| 106 } | |
| 107 | |
| 108 if (tasks.empty()) { | |
| 109 WorkerPool::ScheduleTasks(NULL); | |
| 110 return; | |
| 111 } | |
| 112 | |
| 113 scoped_refptr<RootWorkerPoolTaskImpl> root( | |
| 114 new RootWorkerPoolTaskImpl(&tasks)); | |
| 115 WorkerPool::ScheduleTasks(root); | |
| 116 } | |
| 117 | |
| 118 void ImageRasterWorkerPool:: | |
| 119 DidFinishDispatchingWorkerPoolCompletionCallbacks() { | |
| 120 client_->DidFinishDispatchingRasterWorkerPoolCompletionCallbacks(); | |
| 121 } | |
| 122 | |
| 123 void ImageRasterWorkerPool::OnRasterTaskCompleted( | |
| 124 scoped_refptr<internal::RasterWorkerPoolTask> task, | |
| 125 bool was_canceled, | |
| 126 bool need_bind) { | |
| 127 // Balanced with MapImage() call in ScheduleTasks(). | |
| 128 resource_provider_->UnmapImage(task->resource()->id()); | |
| 129 | |
| 130 if (need_bind) | |
|
kaanb
2013/05/29 21:04:15
Should we just unconditionally bind when we acquir
reveman
2013/05/30 01:46:10
Good point. I removed it from the latest patch.
| |
| 131 resource_provider_->BindImage(task->resource()->id()); | |
| 132 | |
| 133 if (!was_canceled) | |
| 134 task->DidRun(); | |
| 135 | |
| 136 DidFinishRasterTask(task); | |
| 137 } | |
| 138 | |
| 139 void ImageRasterWorkerPool::DidFinishRasterTask( | |
| 140 internal::RasterWorkerPoolTask* task) { | |
| 141 task->DidComplete(); | |
| 142 task->DispatchCompletionCallback(); | |
| 143 } | |
| 144 | |
| 145 } // namespace cc | |
| OLD | NEW |