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" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 protected: | 63 protected: |
64 virtual ~TestRasterWorkerPoolTaskImpl() {} | 64 virtual ~TestRasterWorkerPoolTaskImpl() {} |
65 | 65 |
66 private: | 66 private: |
67 const Reply reply_; | 67 const Reply reply_; |
68 RasterThread raster_thread_; | 68 RasterThread raster_thread_; |
69 | 69 |
70 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); | 70 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); |
71 }; | 71 }; |
72 | 72 |
| 73 class BlockingRasterWorkerPoolTaskImpl : public TestRasterWorkerPoolTaskImpl { |
| 74 public: |
| 75 BlockingRasterWorkerPoolTaskImpl(const Resource* resource, |
| 76 const Reply& reply, |
| 77 base::Lock* lock, |
| 78 TaskVector* dependencies, |
| 79 bool use_gpu_rasterization) |
| 80 : TestRasterWorkerPoolTaskImpl(resource, |
| 81 reply, |
| 82 dependencies, |
| 83 use_gpu_rasterization), |
| 84 lock_(lock) {} |
| 85 |
| 86 // Overridden from TestRasterWorkerPoolTaskImpl: |
| 87 virtual bool RunOnWorkerThread(unsigned thread_index, |
| 88 void* buffer, |
| 89 gfx::Size size, |
| 90 int stride) OVERRIDE { |
| 91 base::AutoLock lock(*lock_); |
| 92 return TestRasterWorkerPoolTaskImpl::RunOnWorkerThread( |
| 93 thread_index, buffer, size, stride); |
| 94 } |
| 95 virtual void CompleteOnOriginThread() OVERRIDE {} |
| 96 |
| 97 protected: |
| 98 virtual ~BlockingRasterWorkerPoolTaskImpl() {} |
| 99 |
| 100 private: |
| 101 base::Lock* lock_; |
| 102 |
| 103 DISALLOW_COPY_AND_ASSIGN(BlockingRasterWorkerPoolTaskImpl); |
| 104 }; |
| 105 |
73 class RasterWorkerPoolTest : public testing::Test, | 106 class RasterWorkerPoolTest : public testing::Test, |
74 public RasterWorkerPoolClient { | 107 public RasterWorkerPoolClient { |
75 public: | 108 public: |
76 RasterWorkerPoolTest() | 109 RasterWorkerPoolTest() |
77 : context_provider_(TestContextProvider::Create()), | 110 : context_provider_(TestContextProvider::Create()), |
78 check_interval_milliseconds_(1), | 111 check_interval_milliseconds_(1), |
79 timeout_seconds_(5), | 112 timeout_seconds_(5), |
80 timed_out_(false) { | 113 timed_out_(false) { |
81 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); | 114 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); |
82 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 115 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl( | 216 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl( |
184 const_resource, | 217 const_resource, |
185 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, | 218 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
186 base::Unretained(this), | 219 base::Unretained(this), |
187 base::Passed(&resource), | 220 base::Passed(&resource), |
188 id), | 221 id), |
189 &empty.tasks_, | 222 &empty.tasks_, |
190 use_gpu_rasterization))); | 223 use_gpu_rasterization))); |
191 } | 224 } |
192 | 225 |
| 226 void AppendBlockingTask(unsigned id, base::Lock* lock) { |
| 227 const gfx::Size size(1, 1); |
| 228 |
| 229 scoped_ptr<ScopedResource> resource( |
| 230 ScopedResource::Create(resource_provider())); |
| 231 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
| 232 const Resource* const_resource = resource.get(); |
| 233 |
| 234 RasterWorkerPool::Task::Set empty; |
| 235 tasks_.push_back( |
| 236 RasterWorkerPool::RasterTask(new BlockingRasterWorkerPoolTaskImpl( |
| 237 const_resource, |
| 238 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
| 239 base::Unretained(this), |
| 240 base::Passed(&resource), |
| 241 id), |
| 242 lock, |
| 243 &empty.tasks_, |
| 244 false))); |
| 245 } |
| 246 |
193 virtual void OnTaskCompleted( | 247 virtual void OnTaskCompleted( |
194 scoped_ptr<ScopedResource> resource, | 248 scoped_ptr<ScopedResource> resource, |
195 unsigned id, | 249 unsigned id, |
196 const PicturePileImpl::Analysis& analysis, | 250 const PicturePileImpl::Analysis& analysis, |
197 bool was_canceled, | 251 bool was_canceled, |
198 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) {} | 252 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) {} |
199 | 253 |
200 private: | 254 private: |
201 void ScheduleCheckForCompletedTasks() { | 255 void ScheduleCheckForCompletedTasks() { |
202 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks, | 256 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks, |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 } | 426 } |
373 | 427 |
374 virtual void AfterTest() OVERRIDE { | 428 virtual void AfterTest() OVERRIDE { |
375 ASSERT_EQ(1u, tasks_.size()); | 429 ASSERT_EQ(1u, tasks_.size()); |
376 tasks_.clear(); | 430 tasks_.clear(); |
377 } | 431 } |
378 }; | 432 }; |
379 | 433 |
380 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource); | 434 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource); |
381 | 435 |
| 436 class RasterWorkerPoolTestFalseThrottling : public RasterWorkerPoolTest { |
| 437 public: |
| 438 // Overridden from RasterWorkerPoolTest: |
| 439 virtual void BeginTest() OVERRIDE { |
| 440 // This test checks that replacing a pending raster task with another does |
| 441 // not prevent the DidFinishRunningTasks notification from being sent. |
| 442 |
| 443 // Schedule a task that is prevented from completing with a lock. |
| 444 lock_.Acquire(); |
| 445 AppendBlockingTask(0u, &lock_); |
| 446 ScheduleTasks(); |
| 447 |
| 448 // Schedule another task to replace the still-pending task. Because the old |
| 449 // task is not a throttled task in the new task set, it should not prevent |
| 450 // DidFinishRunningTasks from getting signaled. |
| 451 tasks_.clear(); |
| 452 AppendTask(1u, false); |
| 453 ScheduleTasks(); |
| 454 |
| 455 // Unblock the first task to allow the second task to complete. |
| 456 lock_.Release(); |
| 457 } |
| 458 |
| 459 virtual void AfterTest() OVERRIDE {} |
| 460 |
| 461 virtual void DidFinishRunningTasks() OVERRIDE { |
| 462 EndTest(); |
| 463 } |
| 464 |
| 465 base::Lock lock_; |
| 466 }; |
| 467 |
| 468 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFalseThrottling); |
| 469 |
382 } // namespace | 470 } // namespace |
383 | 471 |
384 } // namespace cc | 472 } // namespace cc |
OLD | NEW |