| 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 namespace { |
| 23 |
| 24 enum RasterThread { |
| 25 RASTER_THREAD_NONE, |
| 26 RASTER_THREAD_ORIGIN, |
| 27 RASTER_THREAD_WORKER |
| 28 }; |
| 29 |
| 30 enum RasterWorkerPoolType { |
| 31 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
| 32 RASTER_WORKER_POOL_TYPE_IMAGE |
| 33 }; |
| 22 | 34 |
| 23 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 35 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
| 24 public: | 36 public: |
| 25 enum RasterThread { | |
| 26 RASTER_THREAD_NONE, | |
| 27 RASTER_THREAD_ORIGIN, | |
| 28 RASTER_THREAD_WORKER | |
| 29 }; | |
| 30 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, | 37 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, |
| 31 bool was_canceled, | 38 bool was_canceled, |
| 32 RasterThread raster_thread)> Reply; | 39 RasterThread raster_thread)> Reply; |
| 33 | 40 |
| 34 TestRasterWorkerPoolTaskImpl(const Resource* resource, | 41 TestRasterWorkerPoolTaskImpl(const Resource* resource, |
| 35 const Reply& reply, | 42 const Reply& reply, |
| 36 internal::Task::Vector* dependencies, | 43 internal::Task::Vector* dependencies, |
| 37 bool use_gpu_rasterization) | 44 bool use_gpu_rasterization) |
| 38 : internal::RasterWorkerPoolTask(resource, | 45 : internal::RasterWorkerPoolTask(resource, |
| 39 dependencies, | 46 dependencies, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 | 108 |
| 102 protected: | 109 protected: |
| 103 virtual ~BlockingRasterWorkerPoolTaskImpl() {} | 110 virtual ~BlockingRasterWorkerPoolTaskImpl() {} |
| 104 | 111 |
| 105 private: | 112 private: |
| 106 base::Lock* lock_; | 113 base::Lock* lock_; |
| 107 | 114 |
| 108 DISALLOW_COPY_AND_ASSIGN(BlockingRasterWorkerPoolTaskImpl); | 115 DISALLOW_COPY_AND_ASSIGN(BlockingRasterWorkerPoolTaskImpl); |
| 109 }; | 116 }; |
| 110 | 117 |
| 111 class RasterWorkerPoolTest : public testing::Test, | 118 } // namespace |
| 112 public RasterWorkerPoolClient { | 119 |
| 120 class RasterWorkerPoolTest |
| 121 : public testing::TestWithParam<RasterWorkerPoolType>, |
| 122 public RasterWorkerPoolClient { |
| 113 public: | 123 public: |
| 124 struct RasterTaskResult { |
| 125 unsigned id; |
| 126 bool canceled; |
| 127 RasterThread raster_thread; |
| 128 }; |
| 129 |
| 114 RasterWorkerPoolTest() | 130 RasterWorkerPoolTest() |
| 115 : context_provider_(TestContextProvider::Create()), | 131 : context_provider_(TestContextProvider::Create()), |
| 116 check_interval_milliseconds_(1), | |
| 117 timeout_seconds_(5), | 132 timeout_seconds_(5), |
| 118 timed_out_(false) { | 133 timed_out_(false) { |
| 119 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); | 134 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); |
| 120 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 135 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
| 121 | 136 |
| 122 resource_provider_ = ResourceProvider::Create( | 137 resource_provider_ = ResourceProvider::Create( |
| 123 output_surface_.get(), NULL, 0, false, 1).Pass(); | 138 output_surface_.get(), NULL, 0, false, 1).Pass(); |
| 139 |
| 140 switch (GetParam()) { |
| 141 case RASTER_WORKER_POOL_TYPE_IMAGE: |
| 142 raster_worker_pool_ = ImageRasterWorkerPool::Create( |
| 143 resource_provider_.get(), context_provider_.get(), GL_TEXTURE_2D); |
| 144 break; |
| 145 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: |
| 146 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( |
| 147 resource_provider_.get(), |
| 148 context_provider_.get(), |
| 149 std::numeric_limits<size_t>::max()); |
| 150 break; |
| 151 } |
| 152 |
| 153 DCHECK(raster_worker_pool_); |
| 154 raster_worker_pool_->SetClient(this); |
| 124 } | 155 } |
| 125 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); } | 156 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); } |
| 126 | 157 |
| 127 // Overridden from testing::Test: | 158 // Overridden from testing::Test: |
| 128 virtual void TearDown() OVERRIDE { | 159 virtual void TearDown() OVERRIDE { |
| 129 if (!raster_worker_pool_) | |
| 130 return; | |
| 131 raster_worker_pool_->Shutdown(); | 160 raster_worker_pool_->Shutdown(); |
| 132 raster_worker_pool_->CheckForCompletedTasks(); | 161 raster_worker_pool_->CheckForCompletedTasks(); |
| 133 } | 162 } |
| 134 | 163 |
| 135 // Overriden from RasterWorkerPoolClient: | 164 // Overriden from RasterWorkerPoolClient: |
| 136 virtual bool ShouldForceTasksRequiredForActivationToComplete() | 165 virtual bool ShouldForceTasksRequiredForActivationToComplete() |
| 137 const OVERRIDE { | 166 const OVERRIDE { |
| 138 return false; | 167 return false; |
| 139 } | 168 } |
| 140 virtual void DidFinishRunningTasks() OVERRIDE {} | 169 virtual void DidFinishRunningTasks() OVERRIDE { |
| 170 raster_worker_pool_->CheckForCompletedTasks(); |
| 171 base::MessageLoop::current()->Quit(); |
| 172 } |
| 141 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} | 173 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} |
| 142 | 174 |
| 143 virtual void BeginTest() = 0; | 175 void RunMessageLoopUntilAllTasksHaveCompleted() { |
| 144 virtual void AfterTest() = 0; | |
| 145 | |
| 146 ResourceProvider* resource_provider() const { | |
| 147 return resource_provider_.get(); | |
| 148 } | |
| 149 | |
| 150 RasterWorkerPool* worker_pool() { return raster_worker_pool_.get(); } | |
| 151 | |
| 152 void RunTest(bool use_map_image) { | |
| 153 if (use_map_image) { | |
| 154 raster_worker_pool_ = ImageRasterWorkerPool::Create( | |
| 155 resource_provider(), context_provider_.get(), GL_TEXTURE_2D); | |
| 156 } else { | |
| 157 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( | |
| 158 resource_provider(), | |
| 159 context_provider_.get(), | |
| 160 std::numeric_limits<size_t>::max()); | |
| 161 } | |
| 162 | |
| 163 raster_worker_pool_->SetClient(this); | |
| 164 | |
| 165 BeginTest(); | |
| 166 | |
| 167 ScheduleCheckForCompletedTasks(); | |
| 168 | |
| 169 if (timeout_seconds_) { | 176 if (timeout_seconds_) { |
| 170 timeout_.Reset( | 177 timeout_.Reset( |
| 171 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this))); | 178 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this))); |
| 172 base::MessageLoopProxy::current()->PostDelayedTask( | 179 base::MessageLoopProxy::current()->PostDelayedTask( |
| 173 FROM_HERE, | 180 FROM_HERE, |
| 174 timeout_.callback(), | 181 timeout_.callback(), |
| 175 base::TimeDelta::FromSeconds(timeout_seconds_)); | 182 base::TimeDelta::FromSeconds(timeout_seconds_)); |
| 176 } | 183 } |
| 177 | 184 |
| 178 base::MessageLoop::current()->Run(); | 185 base::MessageLoop::current()->Run(); |
| 179 | 186 |
| 180 check_.Cancel(); | |
| 181 timeout_.Cancel(); | 187 timeout_.Cancel(); |
| 182 | 188 |
| 183 if (timed_out_) { | 189 ASSERT_FALSE(timed_out_) << "Test timed out"; |
| 184 FAIL() << "Test timed out"; | |
| 185 return; | |
| 186 } | |
| 187 AfterTest(); | |
| 188 } | 190 } |
| 189 | 191 |
| 190 void EndTest() { base::MessageLoop::current()->Quit(); } | |
| 191 | |
| 192 void ScheduleTasks() { | 192 void ScheduleTasks() { |
| 193 RasterWorkerPool::RasterTask::Queue tasks; | 193 RasterWorkerPool::RasterTask::Queue tasks; |
| 194 | 194 |
| 195 for (std::vector<RasterWorkerPool::RasterTask>::iterator it = | 195 for (std::vector<RasterWorkerPool::RasterTask>::iterator it = |
| 196 tasks_.begin(); | 196 tasks_.begin(); |
| 197 it != tasks_.end(); | 197 it != tasks_.end(); |
| 198 ++it) | 198 ++it) |
| 199 tasks.Append(*it, false); | 199 tasks.Append(*it, false); |
| 200 | 200 |
| 201 worker_pool()->ScheduleTasks(&tasks); | 201 raster_worker_pool_->ScheduleTasks(&tasks); |
| 202 } | 202 } |
| 203 | 203 |
| 204 void AppendTask(unsigned id, bool use_gpu_rasterization) { | 204 void AppendTask(unsigned id, bool use_gpu_rasterization) { |
| 205 const gfx::Size size(1, 1); | 205 const gfx::Size size(1, 1); |
| 206 | 206 |
| 207 scoped_ptr<ScopedResource> resource( | 207 scoped_ptr<ScopedResource> resource( |
| 208 ScopedResource::Create(resource_provider())); | 208 ScopedResource::Create(resource_provider_.get())); |
| 209 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); | 209 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
| 210 const Resource* const_resource = resource.get(); | 210 const Resource* const_resource = resource.get(); |
| 211 | 211 |
| 212 RasterWorkerPool::Task::Set empty; | 212 RasterWorkerPool::Task::Set empty; |
| 213 tasks_.push_back( | 213 tasks_.push_back( |
| 214 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl( | 214 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl( |
| 215 const_resource, | 215 const_resource, |
| 216 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, | 216 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
| 217 base::Unretained(this), | 217 base::Unretained(this), |
| 218 base::Passed(&resource), | 218 base::Passed(&resource), |
| 219 id), | 219 id), |
| 220 &empty.tasks_, | 220 &empty.tasks_, |
| 221 use_gpu_rasterization))); | 221 use_gpu_rasterization))); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void AppendBlockingTask(unsigned id, base::Lock* lock) { | 224 void AppendBlockingTask(unsigned id, base::Lock* lock) { |
| 225 const gfx::Size size(1, 1); | 225 const gfx::Size size(1, 1); |
| 226 | 226 |
| 227 scoped_ptr<ScopedResource> resource( | 227 scoped_ptr<ScopedResource> resource( |
| 228 ScopedResource::Create(resource_provider())); | 228 ScopedResource::Create(resource_provider_.get())); |
| 229 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); | 229 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
| 230 const Resource* const_resource = resource.get(); | 230 const Resource* const_resource = resource.get(); |
| 231 | 231 |
| 232 RasterWorkerPool::Task::Set empty; | 232 RasterWorkerPool::Task::Set empty; |
| 233 tasks_.push_back( | 233 tasks_.push_back( |
| 234 RasterWorkerPool::RasterTask(new BlockingRasterWorkerPoolTaskImpl( | 234 RasterWorkerPool::RasterTask(new BlockingRasterWorkerPoolTaskImpl( |
| 235 const_resource, | 235 const_resource, |
| 236 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, | 236 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
| 237 base::Unretained(this), | 237 base::Unretained(this), |
| 238 base::Passed(&resource), | 238 base::Passed(&resource), |
| 239 id), | 239 id), |
| 240 lock, | 240 lock, |
| 241 &empty.tasks_, | 241 &empty.tasks_, |
| 242 false))); | 242 false))); |
| 243 } | 243 } |
| 244 | 244 |
| 245 virtual void OnTaskCompleted( | 245 const std::vector<RasterTaskResult>& completed_tasks() const { |
| 246 scoped_ptr<ScopedResource> resource, | 246 return completed_tasks_; |
| 247 unsigned id, | 247 } |
| 248 const PicturePileImpl::Analysis& analysis, | |
| 249 bool was_canceled, | |
| 250 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) {} | |
| 251 | 248 |
| 252 private: | 249 private: |
| 253 void ScheduleCheckForCompletedTasks() { | 250 void OnTaskCompleted(scoped_ptr<ScopedResource> resource, |
| 254 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks, | 251 unsigned id, |
| 255 base::Unretained(this))); | 252 const PicturePileImpl::Analysis& analysis, |
| 256 base::MessageLoopProxy::current()->PostDelayedTask( | 253 bool was_canceled, |
| 257 FROM_HERE, | 254 RasterThread raster_thread) { |
| 258 check_.callback(), | 255 RasterTaskResult result; |
| 259 base::TimeDelta::FromMilliseconds(check_interval_milliseconds_)); | 256 result.id = id; |
| 260 } | 257 result.canceled = was_canceled; |
| 261 | 258 result.raster_thread = raster_thread; |
| 262 void OnCheckForCompletedTasks() { | 259 completed_tasks_.push_back(result); |
| 263 raster_worker_pool_->CheckForCompletedTasks(); | |
| 264 ScheduleCheckForCompletedTasks(); | |
| 265 } | 260 } |
| 266 | 261 |
| 267 void OnTimeout() { | 262 void OnTimeout() { |
| 268 timed_out_ = true; | 263 timed_out_ = true; |
| 269 base::MessageLoop::current()->Quit(); | 264 base::MessageLoop::current()->Quit(); |
| 270 } | 265 } |
| 271 | 266 |
| 272 protected: | 267 protected: |
| 273 scoped_refptr<TestContextProvider> context_provider_; | 268 scoped_refptr<TestContextProvider> context_provider_; |
| 274 FakeOutputSurfaceClient output_surface_client_; | 269 FakeOutputSurfaceClient output_surface_client_; |
| 275 scoped_ptr<FakeOutputSurface> output_surface_; | 270 scoped_ptr<FakeOutputSurface> output_surface_; |
| 276 scoped_ptr<ResourceProvider> resource_provider_; | 271 scoped_ptr<ResourceProvider> resource_provider_; |
| 277 scoped_ptr<RasterWorkerPool> raster_worker_pool_; | 272 scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
| 278 base::CancelableClosure check_; | |
| 279 int check_interval_milliseconds_; | |
| 280 base::CancelableClosure timeout_; | 273 base::CancelableClosure timeout_; |
| 281 int timeout_seconds_; | 274 int timeout_seconds_; |
| 282 bool timed_out_; | 275 bool timed_out_; |
| 283 std::vector<RasterWorkerPool::RasterTask> tasks_; | 276 std::vector<RasterWorkerPool::RasterTask> tasks_; |
| 277 std::vector<RasterTaskResult> completed_tasks_; |
| 284 }; | 278 }; |
| 285 | 279 |
| 286 namespace { | 280 namespace { |
| 287 | 281 |
| 288 #define PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME) \ | 282 TEST_P(RasterWorkerPoolTest, Basic) { |
| 289 TEST_F(TEST_FIXTURE_NAME, RunPixelBuffer) { RunTest(false); } | 283 AppendTask(0u, false); |
| 284 AppendTask(1u, false); |
| 285 ScheduleTasks(); |
| 290 | 286 |
| 291 #define IMAGE_TEST_F(TEST_FIXTURE_NAME) \ | 287 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 292 TEST_F(TEST_FIXTURE_NAME, RunImage) { RunTest(true); } | |
| 293 | 288 |
| 294 #define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME) \ | 289 ASSERT_EQ(2u, completed_tasks().size()); |
| 295 PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME); \ | 290 EXPECT_FALSE(completed_tasks()[0].canceled); |
| 296 IMAGE_TEST_F(TEST_FIXTURE_NAME) | 291 EXPECT_FALSE(completed_tasks()[1].canceled); |
| 292 EXPECT_EQ(RASTER_THREAD_WORKER, completed_tasks()[0].raster_thread); |
| 293 EXPECT_EQ(RASTER_THREAD_WORKER, completed_tasks()[1].raster_thread); |
| 294 } |
| 297 | 295 |
| 298 class RasterWorkerPoolTestSofwareRaster : public RasterWorkerPoolTest { | 296 TEST_P(RasterWorkerPoolTest, GpuRaster) { |
| 299 public: | 297 AppendTask(0u, true); // GPU raster. |
| 300 virtual void OnTaskCompleted( | 298 ScheduleTasks(); |
| 301 scoped_ptr<ScopedResource> resource, | |
| 302 unsigned id, | |
| 303 const PicturePileImpl::Analysis& analysis, | |
| 304 bool was_canceled, | |
| 305 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { | |
| 306 EXPECT_FALSE(was_canceled); | |
| 307 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER, | |
| 308 raster_thread); | |
| 309 on_task_completed_ids_.push_back(id); | |
| 310 if (on_task_completed_ids_.size() == 2) | |
| 311 EndTest(); | |
| 312 } | |
| 313 | 299 |
| 314 // Overridden from RasterWorkerPoolTest: | 300 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 315 virtual void BeginTest() OVERRIDE { | |
| 316 AppendTask(0u, false); | |
| 317 AppendTask(1u, false); | |
| 318 ScheduleTasks(); | |
| 319 } | |
| 320 virtual void AfterTest() OVERRIDE { | |
| 321 EXPECT_EQ(2u, on_task_completed_ids_.size()); | |
| 322 tasks_.clear(); | |
| 323 } | |
| 324 | 301 |
| 325 std::vector<unsigned> on_task_completed_ids_; | 302 ASSERT_EQ(1u, completed_tasks().size()); |
| 326 }; | 303 EXPECT_EQ(0u, completed_tasks()[0].id); |
| 304 EXPECT_FALSE(completed_tasks()[0].canceled); |
| 305 EXPECT_EQ(RASTER_THREAD_ORIGIN, completed_tasks()[0].raster_thread); |
| 306 } |
| 327 | 307 |
| 328 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestSofwareRaster); | 308 TEST_P(RasterWorkerPoolTest, HybridRaster) { |
| 309 AppendTask(0u, false); // Software raster. |
| 310 AppendTask(1u, true); // GPU raster. |
| 311 ScheduleTasks(); |
| 329 | 312 |
| 330 class RasterWorkerPoolTestGpuRaster : public RasterWorkerPoolTest { | 313 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 331 public: | |
| 332 virtual void OnTaskCompleted( | |
| 333 scoped_ptr<ScopedResource> resource, | |
| 334 unsigned id, | |
| 335 const PicturePileImpl::Analysis& analysis, | |
| 336 bool was_canceled, | |
| 337 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { | |
| 338 EXPECT_EQ(0u, id); | |
| 339 EXPECT_FALSE(was_canceled); | |
| 340 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN, | |
| 341 raster_thread); | |
| 342 EndTest(); | |
| 343 } | |
| 344 | 314 |
| 345 // Overridden from RasterWorkerPoolTest: | 315 ASSERT_EQ(2u, completed_tasks().size()); |
| 346 virtual void BeginTest() OVERRIDE { | 316 for (int i = 0; i < 2; ++i) { |
| 347 AppendTask(0u, true); // GPU raster. | 317 EXPECT_FALSE(completed_tasks()[i].canceled); |
| 348 ScheduleTasks(); | 318 switch (completed_tasks()[i].id) { |
| 349 } | |
| 350 | |
| 351 virtual void AfterTest() OVERRIDE { EXPECT_EQ(1u, tasks_.size()); } | |
| 352 }; | |
| 353 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestGpuRaster); | |
| 354 | |
| 355 class RasterWorkerPoolTestHybridRaster : public RasterWorkerPoolTest { | |
| 356 public: | |
| 357 virtual void OnTaskCompleted( | |
| 358 scoped_ptr<ScopedResource> resource, | |
| 359 unsigned id, | |
| 360 const PicturePileImpl::Analysis& analysis, | |
| 361 bool was_canceled, | |
| 362 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { | |
| 363 EXPECT_FALSE(was_canceled); | |
| 364 switch (id) { | |
| 365 case 0u: | 319 case 0u: |
| 366 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER, | 320 EXPECT_EQ(RASTER_THREAD_WORKER, completed_tasks()[i].raster_thread); |
| 367 raster_thread); | |
| 368 break; | 321 break; |
| 369 case 1u: | 322 case 1u: |
| 370 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN, | 323 EXPECT_EQ(RASTER_THREAD_ORIGIN, completed_tasks()[i].raster_thread); |
| 371 raster_thread); | |
| 372 break; | 324 break; |
| 373 default: | 325 default: |
| 374 NOTREACHED(); | 326 NOTREACHED(); |
| 375 } | 327 } |
| 376 completed_task_ids_.push_back(id); | |
| 377 if (completed_task_ids_.size() == 2) | |
| 378 EndTest(); | |
| 379 } | 328 } |
| 329 } |
| 380 | 330 |
| 381 // Overridden from RasterWorkerPoolTest: | 331 TEST_P(RasterWorkerPoolTest, FailedMapResource) { |
| 382 virtual void BeginTest() OVERRIDE { | 332 TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d(); |
| 383 AppendTask(0u, false); // Software raster. | 333 context3d->set_times_map_image_chromium_succeeds(0); |
| 384 AppendTask(1u, true); // GPU raster. | 334 context3d->set_times_map_buffer_chromium_succeeds(0); |
| 385 ScheduleTasks(); | 335 AppendTask(0u, false); |
| 386 } | 336 ScheduleTasks(); |
| 387 | 337 |
| 388 virtual void AfterTest() OVERRIDE { | 338 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 389 EXPECT_EQ(2u, tasks_.size()); | |
| 390 EXPECT_EQ(2u, completed_task_ids_.size()); | |
| 391 } | |
| 392 | 339 |
| 393 std::vector<unsigned> completed_task_ids_; | 340 ASSERT_EQ(1u, completed_tasks().size()); |
| 394 }; | 341 EXPECT_FALSE(completed_tasks()[0].canceled); |
| 395 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestHybridRaster); | 342 EXPECT_EQ(RASTER_THREAD_WORKER, completed_tasks()[0].raster_thread); |
| 343 } |
| 396 | 344 |
| 397 class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest { | 345 // This test checks that replacing a pending raster task with another does |
| 398 public: | 346 // not prevent the DidFinishRunningTasks notification from being sent. |
| 399 virtual void OnTaskCompleted( | 347 TEST_P(RasterWorkerPoolTest, FalseThrottling) { |
| 400 scoped_ptr<ScopedResource> resource, | 348 base::Lock lock; |
| 401 unsigned id, | |
| 402 const PicturePileImpl::Analysis& analysis, | |
| 403 bool was_canceled, | |
| 404 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE { | |
| 405 EXPECT_FALSE(was_canceled); | |
| 406 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER, | |
| 407 raster_thread); | |
| 408 EndTest(); | |
| 409 } | |
| 410 | 349 |
| 411 // Overridden from RasterWorkerPoolTest: | 350 // Schedule a task that is prevented from completing with a lock. |
| 412 virtual void BeginTest() OVERRIDE { | 351 lock.Acquire(); |
| 413 TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d(); | 352 AppendBlockingTask(0u, &lock); |
| 414 context3d->set_times_map_image_chromium_succeeds(0); | 353 ScheduleTasks(); |
| 415 context3d->set_times_map_buffer_chromium_succeeds(0); | |
| 416 AppendTask(0u, false); | |
| 417 ScheduleTasks(); | |
| 418 } | |
| 419 | 354 |
| 420 virtual void AfterTest() OVERRIDE { | 355 // Schedule another task to replace the still-pending task. Because the old |
| 421 ASSERT_EQ(1u, tasks_.size()); | 356 // task is not a throttled task in the new task set, it should not prevent |
| 422 tasks_.clear(); | 357 // DidFinishRunningTasks from getting signaled. |
| 423 } | 358 tasks_.clear(); |
| 424 }; | 359 AppendTask(1u, false); |
| 360 ScheduleTasks(); |
| 425 | 361 |
| 426 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource); | 362 // Unblock the first task to allow the second task to complete. |
| 363 lock.Release(); |
| 427 | 364 |
| 428 class RasterWorkerPoolTestFalseThrottling : public RasterWorkerPoolTest { | 365 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 429 public: | 366 } |
| 430 // Overridden from RasterWorkerPoolTest: | |
| 431 virtual void BeginTest() OVERRIDE { | |
| 432 // This test checks that replacing a pending raster task with another does | |
| 433 // not prevent the DidFinishRunningTasks notification from being sent. | |
| 434 | 367 |
| 435 // Schedule a task that is prevented from completing with a lock. | 368 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests, |
| 436 lock_.Acquire(); | 369 RasterWorkerPoolTest, |
| 437 AppendBlockingTask(0u, &lock_); | 370 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
| 438 ScheduleTasks(); | 371 RASTER_WORKER_POOL_TYPE_IMAGE)); |
| 439 | |
| 440 // Schedule another task to replace the still-pending task. Because the old | |
| 441 // task is not a throttled task in the new task set, it should not prevent | |
| 442 // DidFinishRunningTasks from getting signaled. | |
| 443 tasks_.clear(); | |
| 444 AppendTask(1u, false); | |
| 445 ScheduleTasks(); | |
| 446 | |
| 447 // Unblock the first task to allow the second task to complete. | |
| 448 lock_.Release(); | |
| 449 } | |
| 450 | |
| 451 virtual void AfterTest() OVERRIDE {} | |
| 452 | |
| 453 virtual void DidFinishRunningTasks() OVERRIDE { EndTest(); } | |
| 454 | |
| 455 base::Lock lock_; | |
| 456 }; | |
| 457 | |
| 458 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFalseThrottling); | |
| 459 | 372 |
| 460 } // namespace | 373 } // namespace |
| 461 } // namespace cc | 374 } // namespace cc |
| OLD | NEW |