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 "cc/resources/image_raster_worker_pool.h" | 10 #include "cc/resources/image_raster_worker_pool.h" |
11 #include "cc/resources/picture_pile.h" | 11 #include "cc/resources/picture_pile.h" |
12 #include "cc/resources/picture_pile_impl.h" | 12 #include "cc/resources/picture_pile_impl.h" |
13 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 13 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
14 #include "cc/resources/resource_provider.h" | 14 #include "cc/resources/resource_provider.h" |
15 #include "cc/resources/scoped_resource.h" | 15 #include "cc/resources/scoped_resource.h" |
16 #include "cc/test/fake_output_surface.h" | 16 #include "cc/test/fake_output_surface.h" |
17 #include "cc/test/fake_output_surface_client.h" | 17 #include "cc/test/fake_output_surface_client.h" |
18 #include "cc/test/test_web_graphics_context_3d.h" | 18 #include "cc/test/test_web_graphics_context_3d.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
20 | 20 |
21 namespace cc { | 21 namespace cc { |
22 | 22 |
23 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 23 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
24 public: | 24 public: |
| 25 enum RasterThread { |
| 26 RASTER_THREAD_NONE, |
| 27 RASTER_THREAD_ORIGIN, |
| 28 RASTER_THREAD_WORKER |
| 29 }; |
25 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, | 30 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, |
26 bool was_canceled, | 31 bool was_canceled, |
27 bool did_raster)> Reply; | 32 RasterThread raster_thread)> Reply; |
28 | 33 |
29 TestRasterWorkerPoolTaskImpl( | 34 TestRasterWorkerPoolTaskImpl( |
30 const Resource* resource, | 35 const Resource* resource, |
31 const Reply& reply, | 36 const Reply& reply, |
32 TaskVector* dependencies) | 37 TaskVector* dependencies, |
33 : internal::RasterWorkerPoolTask(resource, dependencies), | 38 bool use_gpu_rasterization) |
| 39 : internal::RasterWorkerPoolTask(resource, |
| 40 dependencies, |
| 41 use_gpu_rasterization), |
34 reply_(reply), | 42 reply_(reply), |
35 did_raster_(false) {} | 43 raster_thread_(RASTER_THREAD_NONE) {} |
36 | 44 |
37 // Overridden from internal::WorkerPoolTask: | 45 // Overridden from internal::WorkerPoolTask: |
38 virtual bool RunOnWorkerThread(unsigned thread_index, | 46 virtual bool RunOnWorkerThread(unsigned thread_index, |
39 void* buffer, | 47 void* buffer, |
40 gfx::Size size, | 48 gfx::Size size, |
41 int stride) OVERRIDE { | 49 int stride) OVERRIDE { |
42 did_raster_ = true; | 50 raster_thread_ = RASTER_THREAD_WORKER; |
43 return true; | 51 return true; |
44 } | 52 } |
| 53 virtual void RunOnOriginThread(ResourceProvider* resource_provider, |
| 54 ContextProvider* context_provider) OVERRIDE { |
| 55 raster_thread_ = RASTER_THREAD_ORIGIN; |
| 56 } |
45 virtual void CompleteOnOriginThread() OVERRIDE { | 57 virtual void CompleteOnOriginThread() OVERRIDE { |
46 reply_.Run(PicturePileImpl::Analysis(), !HasFinishedRunning(), did_raster_); | 58 reply_.Run(PicturePileImpl::Analysis(), |
| 59 !HasFinishedRunning() || WasCanceled(), |
| 60 raster_thread_); |
47 } | 61 } |
48 | 62 |
49 protected: | 63 protected: |
50 virtual ~TestRasterWorkerPoolTaskImpl() {} | 64 virtual ~TestRasterWorkerPoolTaskImpl() {} |
51 | 65 |
52 private: | 66 private: |
53 const Reply reply_; | 67 const Reply reply_; |
54 bool did_raster_; | 68 RasterThread raster_thread_; |
55 | 69 |
56 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); | 70 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); |
57 }; | 71 }; |
58 | 72 |
59 class RasterWorkerPoolTest : public testing::Test, | 73 class RasterWorkerPoolTest : public testing::Test, |
60 public RasterWorkerPoolClient { | 74 public RasterWorkerPoolClient { |
61 public: | 75 public: |
62 RasterWorkerPoolTest() | 76 RasterWorkerPoolTest() |
63 : context_provider_(TestContextProvider::Create()), | 77 : context_provider_(TestContextProvider::Create()), |
64 check_interval_milliseconds_(1), | 78 check_interval_milliseconds_(1), |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 return resource_provider_.get(); | 111 return resource_provider_.get(); |
98 } | 112 } |
99 | 113 |
100 RasterWorkerPool* worker_pool() { | 114 RasterWorkerPool* worker_pool() { |
101 return raster_worker_pool_.get(); | 115 return raster_worker_pool_.get(); |
102 } | 116 } |
103 | 117 |
104 void RunTest(bool use_map_image) { | 118 void RunTest(bool use_map_image) { |
105 if (use_map_image) { | 119 if (use_map_image) { |
106 raster_worker_pool_ = ImageRasterWorkerPool::Create( | 120 raster_worker_pool_ = ImageRasterWorkerPool::Create( |
107 resource_provider(), 1, GL_TEXTURE_2D); | 121 resource_provider(), context_provider_.get(), 1, GL_TEXTURE_2D); |
108 } else { | 122 } else { |
109 raster_worker_pool_ = | 123 raster_worker_pool_ = |
110 PixelBufferRasterWorkerPool::Create( | 124 PixelBufferRasterWorkerPool::Create( |
111 resource_provider(), | 125 resource_provider(), |
| 126 context_provider_.get(), |
112 1, | 127 1, |
113 std::numeric_limits<size_t>::max()); | 128 std::numeric_limits<size_t>::max()); |
114 } | 129 } |
115 | 130 |
116 raster_worker_pool_->SetClient(this); | 131 raster_worker_pool_->SetClient(this); |
117 | 132 |
118 BeginTest(); | 133 BeginTest(); |
119 | 134 |
120 ScheduleCheckForCompletedTasks(); | 135 ScheduleCheckForCompletedTasks(); |
121 | 136 |
(...skipping 26 matching lines...) Expand all Loading... |
148 RasterWorkerPool::RasterTask::Queue tasks; | 163 RasterWorkerPool::RasterTask::Queue tasks; |
149 | 164 |
150 for (std::vector<RasterWorkerPool::RasterTask>::iterator it = | 165 for (std::vector<RasterWorkerPool::RasterTask>::iterator it = |
151 tasks_.begin(); | 166 tasks_.begin(); |
152 it != tasks_.end(); ++it) | 167 it != tasks_.end(); ++it) |
153 tasks.Append(*it, false); | 168 tasks.Append(*it, false); |
154 | 169 |
155 worker_pool()->ScheduleTasks(&tasks); | 170 worker_pool()->ScheduleTasks(&tasks); |
156 } | 171 } |
157 | 172 |
158 void AppendTask(unsigned id) { | 173 void AppendTask(unsigned id, bool use_gpu_rasterization) { |
159 const gfx::Size size(1, 1); | 174 const gfx::Size size(1, 1); |
160 | 175 |
161 scoped_ptr<ScopedResource> resource( | 176 scoped_ptr<ScopedResource> resource( |
162 ScopedResource::Create(resource_provider())); | 177 ScopedResource::Create(resource_provider())); |
163 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); | 178 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
164 const Resource* const_resource = resource.get(); | 179 const Resource* const_resource = resource.get(); |
165 | 180 |
166 RasterWorkerPool::Task::Set empty; | 181 RasterWorkerPool::Task::Set empty; |
167 tasks_.push_back( | 182 tasks_.push_back( |
168 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl( | 183 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl( |
169 const_resource, | 184 const_resource, |
170 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, | 185 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
171 base::Unretained(this), | 186 base::Unretained(this), |
172 base::Passed(&resource), | 187 base::Passed(&resource), |
173 id), | 188 id), |
174 &empty.tasks_))); | 189 &empty.tasks_, |
| 190 use_gpu_rasterization))); |
175 } | 191 } |
176 | 192 |
177 virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource, | 193 virtual void OnTaskCompleted( |
178 unsigned id, | 194 scoped_ptr<ScopedResource> resource, |
179 const PicturePileImpl::Analysis& analysis, | 195 unsigned id, |
180 bool was_canceled, | 196 const PicturePileImpl::Analysis& analysis, |
181 bool did_raster) {} | 197 bool was_canceled, |
| 198 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) {} |
182 | 199 |
183 private: | 200 private: |
184 void ScheduleCheckForCompletedTasks() { | 201 void ScheduleCheckForCompletedTasks() { |
185 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks, | 202 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks, |
186 base::Unretained(this))); | 203 base::Unretained(this))); |
187 base::MessageLoopProxy::current()->PostDelayedTask( | 204 base::MessageLoopProxy::current()->PostDelayedTask( |
188 FROM_HERE, | 205 FROM_HERE, |
189 check_.callback(), | 206 check_.callback(), |
190 base::TimeDelta::FromMilliseconds(check_interval_milliseconds_)); | 207 base::TimeDelta::FromMilliseconds(check_interval_milliseconds_)); |
191 } | 208 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 | 240 |
224 #define IMAGE_TEST_F(TEST_FIXTURE_NAME) \ | 241 #define IMAGE_TEST_F(TEST_FIXTURE_NAME) \ |
225 TEST_F(TEST_FIXTURE_NAME, RunImage) { \ | 242 TEST_F(TEST_FIXTURE_NAME, RunImage) { \ |
226 RunTest(true); \ | 243 RunTest(true); \ |
227 } | 244 } |
228 | 245 |
229 #define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME) \ | 246 #define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME) \ |
230 PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME); \ | 247 PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME); \ |
231 IMAGE_TEST_F(TEST_FIXTURE_NAME) | 248 IMAGE_TEST_F(TEST_FIXTURE_NAME) |
232 | 249 |
233 class BasicRasterWorkerPoolTest : public RasterWorkerPoolTest { | 250 class RasterWorkerPoolTestSofwareRaster : public RasterWorkerPoolTest { |
234 public: | 251 public: |
235 virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource, | 252 virtual void OnTaskCompleted( |
236 unsigned id, | 253 scoped_ptr<ScopedResource> resource, |
237 const PicturePileImpl::Analysis& analysis, | 254 unsigned id, |
238 bool was_canceled, | 255 const PicturePileImpl::Analysis& analysis, |
239 bool did_raster) OVERRIDE { | 256 bool was_canceled, |
240 EXPECT_TRUE(did_raster); | 257 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { |
| 258 EXPECT_FALSE(was_canceled); |
| 259 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER, |
| 260 raster_thread); |
241 on_task_completed_ids_.push_back(id); | 261 on_task_completed_ids_.push_back(id); |
242 if (on_task_completed_ids_.size() == 2) | 262 if (on_task_completed_ids_.size() == 2) |
243 EndTest(); | 263 EndTest(); |
244 } | 264 } |
245 | 265 |
246 // Overridden from RasterWorkerPoolTest: | 266 // Overridden from RasterWorkerPoolTest: |
247 virtual void BeginTest() OVERRIDE { | 267 virtual void BeginTest() OVERRIDE { |
248 AppendTask(0u); | 268 AppendTask(0u, false); |
249 AppendTask(1u); | 269 AppendTask(1u, false); |
250 ScheduleTasks(); | 270 ScheduleTasks(); |
251 } | 271 } |
252 virtual void AfterTest() OVERRIDE { | 272 virtual void AfterTest() OVERRIDE { |
253 EXPECT_EQ(2u, on_task_completed_ids_.size()); | 273 EXPECT_EQ(2u, on_task_completed_ids_.size()); |
254 tasks_.clear(); | 274 tasks_.clear(); |
255 } | 275 } |
256 | 276 |
257 std::vector<unsigned> on_task_completed_ids_; | 277 std::vector<unsigned> on_task_completed_ids_; |
258 }; | 278 }; |
259 | 279 |
260 PIXEL_BUFFER_AND_IMAGE_TEST_F(BasicRasterWorkerPoolTest); | 280 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestSofwareRaster); |
| 281 |
| 282 class RasterWorkerPoolTestGpuRaster : public RasterWorkerPoolTest { |
| 283 public: |
| 284 virtual void OnTaskCompleted( |
| 285 scoped_ptr<ScopedResource> resource, |
| 286 unsigned id, |
| 287 const PicturePileImpl::Analysis& analysis, |
| 288 bool was_canceled, |
| 289 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { |
| 290 EXPECT_EQ(0u, id); |
| 291 EXPECT_FALSE(was_canceled); |
| 292 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN, |
| 293 raster_thread); |
| 294 EndTest(); |
| 295 } |
| 296 |
| 297 // Overridden from RasterWorkerPoolTest: |
| 298 virtual void BeginTest() OVERRIDE { |
| 299 AppendTask(0u, true); // GPU raster. |
| 300 ScheduleTasks(); |
| 301 } |
| 302 |
| 303 virtual void AfterTest() OVERRIDE { |
| 304 EXPECT_EQ(1u, tasks_.size()); |
| 305 } |
| 306 }; |
| 307 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestGpuRaster); |
| 308 |
| 309 class RasterWorkerPoolTestHybridRaster : public RasterWorkerPoolTest { |
| 310 public: |
| 311 virtual void OnTaskCompleted( |
| 312 scoped_ptr<ScopedResource> resource, |
| 313 unsigned id, |
| 314 const PicturePileImpl::Analysis& analysis, |
| 315 bool was_canceled, |
| 316 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { |
| 317 EXPECT_FALSE(was_canceled); |
| 318 switch (id) { |
| 319 case 0u: |
| 320 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER, |
| 321 raster_thread); |
| 322 break; |
| 323 case 1u: |
| 324 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN, |
| 325 raster_thread); |
| 326 break; |
| 327 default: |
| 328 NOTREACHED(); |
| 329 } |
| 330 completed_task_ids_.push_back(id); |
| 331 if (completed_task_ids_.size() == 2) |
| 332 EndTest(); |
| 333 } |
| 334 |
| 335 // Overridden from RasterWorkerPoolTest: |
| 336 virtual void BeginTest() OVERRIDE { |
| 337 AppendTask(0u, false); // Software raster. |
| 338 AppendTask(1u, true); // GPU raster. |
| 339 ScheduleTasks(); |
| 340 } |
| 341 |
| 342 virtual void AfterTest() OVERRIDE { |
| 343 EXPECT_EQ(2u, tasks_.size()); |
| 344 EXPECT_EQ(2u, completed_task_ids_.size()); |
| 345 } |
| 346 |
| 347 std::vector<unsigned> completed_task_ids_; |
| 348 }; |
| 349 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestHybridRaster); |
261 | 350 |
262 class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest { | 351 class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest { |
263 public: | 352 public: |
264 virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource, | 353 virtual void OnTaskCompleted( |
265 unsigned id, | 354 scoped_ptr<ScopedResource> resource, |
266 const PicturePileImpl::Analysis& analysis, | 355 unsigned id, |
267 bool was_canceled, | 356 const PicturePileImpl::Analysis& analysis, |
268 bool did_raster) OVERRIDE { | 357 bool was_canceled, |
269 EXPECT_FALSE(did_raster); | 358 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { |
| 359 EXPECT_FALSE(was_canceled); |
| 360 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_NONE, |
| 361 raster_thread); |
270 EndTest(); | 362 EndTest(); |
271 } | 363 } |
272 | 364 |
273 // Overridden from RasterWorkerPoolTest: | 365 // Overridden from RasterWorkerPoolTest: |
274 virtual void BeginTest() OVERRIDE { | 366 virtual void BeginTest() OVERRIDE { |
275 TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d(); | 367 TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d(); |
276 context3d->set_times_map_image_chromium_succeeds(0); | 368 context3d->set_times_map_image_chromium_succeeds(0); |
277 context3d->set_times_map_buffer_chromium_succeeds(0); | 369 context3d->set_times_map_buffer_chromium_succeeds(0); |
278 AppendTask(0u); | 370 AppendTask(0u, false); |
279 ScheduleTasks(); | 371 ScheduleTasks(); |
280 } | 372 } |
281 | 373 |
282 virtual void AfterTest() OVERRIDE { | 374 virtual void AfterTest() OVERRIDE { |
283 ASSERT_EQ(1u, tasks_.size()); | 375 ASSERT_EQ(1u, tasks_.size()); |
284 tasks_.clear(); | 376 tasks_.clear(); |
285 } | 377 } |
286 }; | 378 }; |
287 | 379 |
288 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource); | 380 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource); |
289 | 381 |
290 } // namespace | 382 } // namespace |
291 | 383 |
292 } // namespace cc | 384 } // namespace cc |
OLD | NEW |