| 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 |