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