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 |