OLD | NEW |
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/raster_worker_pool.h" | 5 #include "cc/resources/raster_worker_pool.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/cancelable_callback.h" | 10 #include "base/cancelable_callback.h" |
11 #include "cc/resources/direct_raster_worker_pool.h" | 11 #include "cc/resources/direct_raster_worker_pool.h" |
12 #include "cc/resources/image_raster_worker_pool.h" | 12 #include "cc/resources/image_raster_worker_pool.h" |
13 #include "cc/resources/picture_pile.h" | 13 #include "cc/resources/picture_pile.h" |
14 #include "cc/resources/picture_pile_impl.h" | 14 #include "cc/resources/picture_pile_impl.h" |
15 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 15 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| 16 #include "cc/resources/rasterizer.h" |
16 #include "cc/resources/resource_provider.h" | 17 #include "cc/resources/resource_provider.h" |
17 #include "cc/resources/scoped_resource.h" | 18 #include "cc/resources/scoped_resource.h" |
18 #include "cc/test/fake_output_surface.h" | 19 #include "cc/test/fake_output_surface.h" |
19 #include "cc/test/fake_output_surface_client.h" | 20 #include "cc/test/fake_output_surface_client.h" |
20 #include "cc/test/test_shared_bitmap_manager.h" | 21 #include "cc/test/test_shared_bitmap_manager.h" |
21 #include "cc/test/test_web_graphics_context_3d.h" | 22 #include "cc/test/test_web_graphics_context_3d.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
23 | 24 |
24 namespace cc { | 25 namespace cc { |
25 namespace { | 26 namespace { |
26 | 27 |
27 enum RasterThread { | 28 enum RasterThread { |
28 RASTER_THREAD_NONE, | 29 RASTER_THREAD_NONE, |
29 RASTER_THREAD_ORIGIN, | 30 RASTER_THREAD_ORIGIN, |
30 RASTER_THREAD_WORKER | 31 RASTER_THREAD_WORKER |
31 }; | 32 }; |
32 | 33 |
33 enum RasterWorkerPoolType { | 34 enum RasterWorkerPoolType { |
34 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 35 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
35 RASTER_WORKER_POOL_TYPE_IMAGE, | 36 RASTER_WORKER_POOL_TYPE_IMAGE, |
36 RASTER_WORKER_POOL_TYPE_DIRECT | 37 RASTER_WORKER_POOL_TYPE_DIRECT |
37 }; | 38 }; |
38 | 39 |
39 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 40 class TestRasterTaskImpl : public internal::RasterTask { |
40 public: | 41 public: |
41 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, | 42 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, |
42 bool was_canceled, | 43 bool was_canceled, |
43 RasterThread raster_thread)> Reply; | 44 RasterThread raster_thread)> Reply; |
44 | 45 |
45 TestRasterWorkerPoolTaskImpl(const Resource* resource, | 46 TestRasterTaskImpl(const Resource* resource, |
46 const Reply& reply, | 47 const Reply& reply, |
47 internal::WorkerPoolTask::Vector* dependencies) | 48 internal::ImageDecodeTask::Vector* dependencies) |
48 : internal::RasterWorkerPoolTask(resource, dependencies), | 49 : internal::RasterTask(resource, dependencies), |
49 reply_(reply), | 50 reply_(reply), |
50 raster_thread_(RASTER_THREAD_NONE) {} | 51 raster_thread_(RASTER_THREAD_NONE) {} |
51 | 52 |
52 // Overridden from internal::Task: | 53 // Overridden from internal::Task: |
53 virtual void RunOnWorkerThread() OVERRIDE { | 54 virtual void RunOnWorkerThread() OVERRIDE { |
54 raster_thread_ = RASTER_THREAD_WORKER; | 55 raster_thread_ = RASTER_THREAD_WORKER; |
55 } | 56 } |
56 | 57 |
57 // Overridden from internal::WorkerPoolTask: | 58 // Overridden from internal::RasterizerTask: |
58 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 59 virtual void ScheduleOnOriginThread(internal::RasterizerTaskClient* client) |
59 OVERRIDE { | 60 OVERRIDE { |
60 client->AcquireCanvasForRaster(this, resource()); | 61 client->AcquireCanvasForRaster(this); |
61 } | 62 } |
62 virtual void RunOnOriginThread() OVERRIDE { | 63 virtual void RunOnOriginThread() OVERRIDE { |
63 raster_thread_ = RASTER_THREAD_ORIGIN; | 64 raster_thread_ = RASTER_THREAD_ORIGIN; |
64 } | 65 } |
65 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 66 virtual void CompleteOnOriginThread(internal::RasterizerTaskClient* client) |
66 OVERRIDE { | 67 OVERRIDE { |
67 client->ReleaseCanvasForRaster(this, resource()); | 68 client->ReleaseCanvasForRaster(this); |
68 } | 69 } |
69 virtual void RunReplyOnOriginThread() OVERRIDE { | 70 virtual void RunReplyOnOriginThread() OVERRIDE { |
70 reply_.Run( | 71 reply_.Run( |
71 PicturePileImpl::Analysis(), !HasFinishedRunning(), raster_thread_); | 72 PicturePileImpl::Analysis(), !HasFinishedRunning(), raster_thread_); |
72 } | 73 } |
73 | 74 |
74 protected: | 75 protected: |
75 virtual ~TestRasterWorkerPoolTaskImpl() {} | 76 virtual ~TestRasterTaskImpl() {} |
76 | 77 |
77 private: | 78 private: |
78 const Reply reply_; | 79 const Reply reply_; |
79 RasterThread raster_thread_; | 80 RasterThread raster_thread_; |
80 | 81 |
81 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); | 82 DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl); |
82 }; | 83 }; |
83 | 84 |
84 class BlockingTestRasterWorkerPoolTaskImpl | 85 class BlockingTestRasterTaskImpl : public TestRasterTaskImpl { |
85 : public TestRasterWorkerPoolTaskImpl { | |
86 public: | 86 public: |
87 BlockingTestRasterWorkerPoolTaskImpl( | 87 BlockingTestRasterTaskImpl(const Resource* resource, |
88 const Resource* resource, | 88 const Reply& reply, |
89 const Reply& reply, | 89 base::Lock* lock, |
90 base::Lock* lock, | 90 internal::ImageDecodeTask::Vector* dependencies) |
91 internal::WorkerPoolTask::Vector* dependencies) | 91 : TestRasterTaskImpl(resource, reply, dependencies), lock_(lock) {} |
92 : TestRasterWorkerPoolTaskImpl(resource, reply, dependencies), | |
93 lock_(lock) {} | |
94 | 92 |
95 // Overridden from internal::Task: | 93 // Overridden from internal::Task: |
96 virtual void RunOnWorkerThread() OVERRIDE { | 94 virtual void RunOnWorkerThread() OVERRIDE { |
97 base::AutoLock lock(*lock_); | 95 base::AutoLock lock(*lock_); |
98 TestRasterWorkerPoolTaskImpl::RunOnWorkerThread(); | 96 TestRasterTaskImpl::RunOnWorkerThread(); |
99 } | 97 } |
100 | 98 |
101 // Overridden from internal::WorkerPoolTask: | 99 // Overridden from internal::RasterizerTask: |
102 virtual void RunReplyOnOriginThread() OVERRIDE {} | 100 virtual void RunReplyOnOriginThread() OVERRIDE {} |
103 | 101 |
104 protected: | 102 protected: |
105 virtual ~BlockingTestRasterWorkerPoolTaskImpl() {} | 103 virtual ~BlockingTestRasterTaskImpl() {} |
106 | 104 |
107 private: | 105 private: |
108 base::Lock* lock_; | 106 base::Lock* lock_; |
109 | 107 |
110 DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterWorkerPoolTaskImpl); | 108 DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterTaskImpl); |
111 }; | 109 }; |
112 | 110 |
113 class RasterWorkerPoolTest | 111 class RasterWorkerPoolTest |
114 : public testing::TestWithParam<RasterWorkerPoolType>, | 112 : public testing::TestWithParam<RasterWorkerPoolType>, |
115 public RasterWorkerPoolClient { | 113 public RasterizerClient { |
116 public: | 114 public: |
117 struct RasterTaskResult { | 115 struct RasterTaskResult { |
118 unsigned id; | 116 unsigned id; |
119 bool canceled; | 117 bool canceled; |
120 RasterThread raster_thread; | 118 RasterThread raster_thread; |
121 }; | 119 }; |
122 | 120 |
123 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > | 121 typedef std::vector<scoped_refptr<internal::RasterTask> > RasterTaskVector; |
124 RasterTaskVector; | |
125 | 122 |
126 RasterWorkerPoolTest() | 123 RasterWorkerPoolTest() |
127 : context_provider_(TestContextProvider::Create()), | 124 : context_provider_(TestContextProvider::Create()), |
128 timeout_seconds_(5), | 125 timeout_seconds_(5), |
129 timed_out_(false) { | 126 timed_out_(false) { |
130 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); | 127 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); |
131 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 128 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
132 | 129 |
133 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); | 130 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); |
134 resource_provider_ = | 131 resource_provider_ = |
135 ResourceProvider::Create( | 132 ResourceProvider::Create( |
136 output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1) | 133 output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1) |
137 .Pass(); | 134 .Pass(); |
138 pixel_buffer_raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( | |
139 base::MessageLoopProxy::current().get(), | |
140 resource_provider_.get(), | |
141 std::numeric_limits<size_t>::max()); | |
142 image_raster_worker_pool_ = | |
143 ImageRasterWorkerPool::Create(base::MessageLoopProxy::current().get(), | |
144 resource_provider_.get(), | |
145 GL_TEXTURE_2D); | |
146 direct_raster_worker_pool_ = | |
147 DirectRasterWorkerPool::Create(base::MessageLoopProxy::current().get(), | |
148 resource_provider_.get(), | |
149 context_provider_.get()); | |
150 | 135 |
151 switch (GetParam()) { | 136 switch (GetParam()) { |
152 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: | 137 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: |
153 raster_worker_pool_ = pixel_buffer_raster_worker_pool_.get(); | 138 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( |
| 139 base::MessageLoopProxy::current().get(), |
| 140 RasterWorkerPool::GetTaskGraphRunner(), |
| 141 resource_provider_.get(), |
| 142 std::numeric_limits<size_t>::max()); |
154 break; | 143 break; |
155 case RASTER_WORKER_POOL_TYPE_IMAGE: | 144 case RASTER_WORKER_POOL_TYPE_IMAGE: |
156 raster_worker_pool_ = image_raster_worker_pool_.get(); | 145 raster_worker_pool_ = ImageRasterWorkerPool::Create( |
| 146 base::MessageLoopProxy::current().get(), |
| 147 RasterWorkerPool::GetTaskGraphRunner(), |
| 148 resource_provider_.get(), |
| 149 GL_TEXTURE_2D); |
157 break; | 150 break; |
158 case RASTER_WORKER_POOL_TYPE_DIRECT: | 151 case RASTER_WORKER_POOL_TYPE_DIRECT: |
159 raster_worker_pool_ = direct_raster_worker_pool_.get(); | 152 raster_worker_pool_ = DirectRasterWorkerPool::Create( |
| 153 base::MessageLoopProxy::current().get(), |
| 154 resource_provider_.get(), |
| 155 context_provider_.get()); |
160 break; | 156 break; |
161 } | 157 } |
162 | 158 |
163 DCHECK(raster_worker_pool_); | 159 DCHECK(raster_worker_pool_); |
164 raster_worker_pool_->SetClient(this); | 160 raster_worker_pool_->AsRasterizer()->SetClient(this); |
165 } | 161 } |
166 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); } | 162 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); } |
167 | 163 |
168 // Overridden from testing::Test: | 164 // Overridden from testing::Test: |
169 virtual void TearDown() OVERRIDE { | 165 virtual void TearDown() OVERRIDE { |
170 raster_worker_pool_->Shutdown(); | 166 raster_worker_pool_->AsRasterizer()->Shutdown(); |
171 raster_worker_pool_->CheckForCompletedTasks(); | 167 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); |
172 } | 168 } |
173 | 169 |
174 // Overriden from RasterWorkerPoolClient: | 170 // Overriden from RasterWorkerPoolClient: |
175 virtual bool ShouldForceTasksRequiredForActivationToComplete() | 171 virtual bool ShouldForceTasksRequiredForActivationToComplete() const |
176 const OVERRIDE { | 172 OVERRIDE { |
177 return false; | 173 return false; |
178 } | 174 } |
179 virtual void DidFinishRunningTasks() OVERRIDE { | 175 virtual void DidFinishRunningTasks() OVERRIDE { |
180 raster_worker_pool_->CheckForCompletedTasks(); | 176 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); |
181 base::MessageLoop::current()->Quit(); | 177 base::MessageLoop::current()->Quit(); |
182 } | 178 } |
183 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} | 179 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} |
184 | 180 |
185 void RunMessageLoopUntilAllTasksHaveCompleted() { | 181 void RunMessageLoopUntilAllTasksHaveCompleted() { |
186 if (timeout_seconds_) { | 182 if (timeout_seconds_) { |
187 timeout_.Reset( | 183 timeout_.Reset( |
188 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this))); | 184 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this))); |
189 base::MessageLoopProxy::current()->PostDelayedTask( | 185 base::MessageLoopProxy::current()->PostDelayedTask( |
190 FROM_HERE, | 186 FROM_HERE, |
191 timeout_.callback(), | 187 timeout_.callback(), |
192 base::TimeDelta::FromSeconds(timeout_seconds_)); | 188 base::TimeDelta::FromSeconds(timeout_seconds_)); |
193 } | 189 } |
194 | 190 |
195 base::MessageLoop::current()->Run(); | 191 base::MessageLoop::current()->Run(); |
196 | 192 |
197 timeout_.Cancel(); | 193 timeout_.Cancel(); |
198 | 194 |
199 ASSERT_FALSE(timed_out_) << "Test timed out"; | 195 ASSERT_FALSE(timed_out_) << "Test timed out"; |
200 } | 196 } |
201 | 197 |
202 void ScheduleTasks() { | 198 void ScheduleTasks() { |
203 RasterTaskQueue queue; | 199 RasterTaskQueue queue; |
204 | 200 |
205 for (RasterTaskVector::const_iterator it = tasks_.begin(); | 201 for (RasterTaskVector::const_iterator it = tasks_.begin(); |
206 it != tasks_.end(); | 202 it != tasks_.end(); |
207 ++it) | 203 ++it) |
208 queue.items.push_back(RasterTaskQueue::Item(*it, false)); | 204 queue.items.push_back(RasterTaskQueue::Item(*it, false)); |
209 | 205 |
210 raster_worker_pool_->ScheduleTasks(&queue); | 206 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue); |
211 } | 207 } |
212 | 208 |
213 void AppendTask(unsigned id) { | 209 void AppendTask(unsigned id) { |
214 const gfx::Size size(1, 1); | 210 const gfx::Size size(1, 1); |
215 | 211 |
216 scoped_ptr<ScopedResource> resource( | 212 scoped_ptr<ScopedResource> resource( |
217 ScopedResource::Create(resource_provider_.get())); | 213 ScopedResource::Create(resource_provider_.get())); |
218 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); | 214 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
219 const Resource* const_resource = resource.get(); | 215 const Resource* const_resource = resource.get(); |
220 | 216 |
221 internal::WorkerPoolTask::Vector empty; | 217 internal::ImageDecodeTask::Vector empty; |
222 tasks_.push_back(new TestRasterWorkerPoolTaskImpl( | 218 tasks_.push_back(new TestRasterTaskImpl( |
223 const_resource, | 219 const_resource, |
224 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, | 220 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
225 base::Unretained(this), | 221 base::Unretained(this), |
226 base::Passed(&resource), | 222 base::Passed(&resource), |
227 id), | 223 id), |
228 &empty)); | 224 &empty)); |
229 } | 225 } |
230 | 226 |
231 void AppendBlockingTask(unsigned id, base::Lock* lock) { | 227 void AppendBlockingTask(unsigned id, base::Lock* lock) { |
232 const gfx::Size size(1, 1); | 228 const gfx::Size size(1, 1); |
233 | 229 |
234 scoped_ptr<ScopedResource> resource( | 230 scoped_ptr<ScopedResource> resource( |
235 ScopedResource::Create(resource_provider_.get())); | 231 ScopedResource::Create(resource_provider_.get())); |
236 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); | 232 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
237 const Resource* const_resource = resource.get(); | 233 const Resource* const_resource = resource.get(); |
238 | 234 |
239 internal::WorkerPoolTask::Vector empty; | 235 internal::ImageDecodeTask::Vector empty; |
240 tasks_.push_back(new BlockingTestRasterWorkerPoolTaskImpl( | 236 tasks_.push_back(new BlockingTestRasterTaskImpl( |
241 const_resource, | 237 const_resource, |
242 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, | 238 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
243 base::Unretained(this), | 239 base::Unretained(this), |
244 base::Passed(&resource), | 240 base::Passed(&resource), |
245 id), | 241 id), |
246 lock, | 242 lock, |
247 &empty)); | 243 &empty)); |
248 } | 244 } |
249 | 245 |
250 const std::vector<RasterTaskResult>& completed_tasks() const { | 246 const std::vector<RasterTaskResult>& completed_tasks() const { |
(...skipping 17 matching lines...) Expand all Loading... |
268 timed_out_ = true; | 264 timed_out_ = true; |
269 base::MessageLoop::current()->Quit(); | 265 base::MessageLoop::current()->Quit(); |
270 } | 266 } |
271 | 267 |
272 protected: | 268 protected: |
273 scoped_refptr<TestContextProvider> context_provider_; | 269 scoped_refptr<TestContextProvider> context_provider_; |
274 FakeOutputSurfaceClient output_surface_client_; | 270 FakeOutputSurfaceClient output_surface_client_; |
275 scoped_ptr<FakeOutputSurface> output_surface_; | 271 scoped_ptr<FakeOutputSurface> output_surface_; |
276 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; | 272 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; |
277 scoped_ptr<ResourceProvider> resource_provider_; | 273 scoped_ptr<ResourceProvider> resource_provider_; |
278 scoped_ptr<PixelBufferRasterWorkerPool> pixel_buffer_raster_worker_pool_; | 274 scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
279 scoped_ptr<ImageRasterWorkerPool> image_raster_worker_pool_; | |
280 scoped_ptr<DirectRasterWorkerPool> direct_raster_worker_pool_; | |
281 RasterWorkerPool* raster_worker_pool_; | |
282 base::CancelableClosure timeout_; | 275 base::CancelableClosure timeout_; |
283 int timeout_seconds_; | 276 int timeout_seconds_; |
284 bool timed_out_; | 277 bool timed_out_; |
285 RasterTaskVector tasks_; | 278 RasterTaskVector tasks_; |
286 std::vector<RasterTaskResult> completed_tasks_; | 279 std::vector<RasterTaskResult> completed_tasks_; |
287 }; | 280 }; |
288 | 281 |
289 TEST_P(RasterWorkerPoolTest, Basic) { | 282 TEST_P(RasterWorkerPoolTest, Basic) { |
290 AppendTask(0u); | 283 AppendTask(0u); |
291 AppendTask(1u); | 284 AppendTask(1u); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 } | 332 } |
340 | 333 |
341 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests, | 334 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests, |
342 RasterWorkerPoolTest, | 335 RasterWorkerPoolTest, |
343 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 336 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
344 RASTER_WORKER_POOL_TYPE_IMAGE, | 337 RASTER_WORKER_POOL_TYPE_IMAGE, |
345 RASTER_WORKER_POOL_TYPE_DIRECT)); | 338 RASTER_WORKER_POOL_TYPE_DIRECT)); |
346 | 339 |
347 } // namespace | 340 } // namespace |
348 } // namespace cc | 341 } // namespace cc |
OLD | NEW |