| 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/raster/tile_task_worker_pool.h" |    5 #include "cc/raster/tile_task_worker_pool.h" | 
|    6  |    6  | 
 |    7 #include <algorithm> | 
|    7 #include <limits> |    8 #include <limits> | 
|    8 #include <vector> |    9 #include <vector> | 
|    9  |   10  | 
|   10 #include "base/cancelable_callback.h" |   11 #include "base/cancelable_callback.h" | 
|   11 #include "base/location.h" |   12 #include "base/location.h" | 
|   12 #include "base/single_thread_task_runner.h" |   13 #include "base/single_thread_task_runner.h" | 
|   13 #include "base/thread_task_runner_handle.h" |   14 #include "base/thread_task_runner_handle.h" | 
|   14 #include "cc/base/unique_notifier.h" |   15 #include "cc/base/unique_notifier.h" | 
|   15 #include "cc/raster/bitmap_tile_task_worker_pool.h" |   16 #include "cc/raster/bitmap_tile_task_worker_pool.h" | 
|   16 #include "cc/raster/gpu_rasterizer.h" |   17 #include "cc/raster/gpu_rasterizer.h" | 
|   17 #include "cc/raster/gpu_tile_task_worker_pool.h" |   18 #include "cc/raster/gpu_tile_task_worker_pool.h" | 
|   18 #include "cc/raster/one_copy_tile_task_worker_pool.h" |   19 #include "cc/raster/one_copy_tile_task_worker_pool.h" | 
|   19 #include "cc/raster/raster_buffer.h" |   20 #include "cc/raster/raster_buffer.h" | 
 |   21 #include "cc/raster/synchronous_task_graph_runner.h" | 
|   20 #include "cc/raster/tile_task_runner.h" |   22 #include "cc/raster/tile_task_runner.h" | 
|   21 #include "cc/raster/zero_copy_tile_task_worker_pool.h" |   23 #include "cc/raster/zero_copy_tile_task_worker_pool.h" | 
|   22 #include "cc/resources/resource_pool.h" |   24 #include "cc/resources/resource_pool.h" | 
|   23 #include "cc/resources/resource_provider.h" |   25 #include "cc/resources/resource_provider.h" | 
|   24 #include "cc/resources/scoped_resource.h" |   26 #include "cc/resources/scoped_resource.h" | 
|   25 #include "cc/test/fake_display_list_raster_source.h" |   27 #include "cc/test/fake_display_list_raster_source.h" | 
|   26 #include "cc/test/fake_output_surface.h" |   28 #include "cc/test/fake_output_surface.h" | 
|   27 #include "cc/test/fake_output_surface_client.h" |   29 #include "cc/test/fake_output_surface_client.h" | 
|   28 #include "cc/test/fake_resource_provider.h" |   30 #include "cc/test/fake_resource_provider.h" | 
|   29 #include "cc/test/test_gpu_memory_buffer_manager.h" |   31 #include "cc/test/test_gpu_memory_buffer_manager.h" | 
|   30 #include "cc/test/test_shared_bitmap_manager.h" |   32 #include "cc/test/test_shared_bitmap_manager.h" | 
|   31 #include "cc/test/test_task_graph_runner.h" |  | 
|   32 #include "cc/test/test_web_graphics_context_3d.h" |   33 #include "cc/test/test_web_graphics_context_3d.h" | 
|   33 #include "gpu/GLES2/gl2extchromium.h" |   34 #include "gpu/GLES2/gl2extchromium.h" | 
|   34 #include "testing/gtest/include/gtest/gtest.h" |   35 #include "testing/gtest/include/gtest/gtest.h" | 
|   35  |   36  | 
|   36 namespace cc { |   37 namespace cc { | 
|   37 namespace { |   38 namespace { | 
|   38  |   39  | 
|   39 const size_t kMaxBytesPerCopyOperation = 1000U; |   40 const size_t kMaxBytesPerCopyOperation = 1000U; | 
|   40 const size_t kMaxStagingBuffers = 32U; |   41 const size_t kMaxStagingBuffers = 32U; | 
|   41  |   42  | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  109  protected: |  110  protected: | 
|  110   ~BlockingTestRasterTaskImpl() override {} |  111   ~BlockingTestRasterTaskImpl() override {} | 
|  111  |  112  | 
|  112  private: |  113  private: | 
|  113   base::Lock* lock_; |  114   base::Lock* lock_; | 
|  114  |  115  | 
|  115   DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterTaskImpl); |  116   DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterTaskImpl); | 
|  116 }; |  117 }; | 
|  117  |  118  | 
|  118 class TileTaskWorkerPoolTest |  119 class TileTaskWorkerPoolTest | 
|  119     : public testing::TestWithParam<TileTaskWorkerPoolType>, |  120     : public testing::TestWithParam<TileTaskWorkerPoolType> { | 
|  120       public TileTaskRunnerClient { |  | 
|  121  public: |  121  public: | 
|  122   struct RasterTaskResult { |  122   struct RasterTaskResult { | 
|  123     unsigned id; |  123     unsigned id; | 
|  124     bool canceled; |  124     bool canceled; | 
|  125   }; |  125   }; | 
|  126  |  126  | 
|  127   typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector; |  127   typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector; | 
|  128  |  128  | 
|  129   enum NamedTaskSet { REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW, ALL }; |  129   enum NamedTaskSet { REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW, ALL }; | 
|  130  |  130  | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  163         break; |  163         break; | 
|  164       case TILE_TASK_WORKER_POOL_TYPE_BITMAP: |  164       case TILE_TASK_WORKER_POOL_TYPE_BITMAP: | 
|  165         CreateSoftwareOutputSurfaceAndResourceProvider(); |  165         CreateSoftwareOutputSurfaceAndResourceProvider(); | 
|  166         tile_task_worker_pool_ = BitmapTileTaskWorkerPool::Create( |  166         tile_task_worker_pool_ = BitmapTileTaskWorkerPool::Create( | 
|  167             base::ThreadTaskRunnerHandle::Get().get(), &task_graph_runner_, |  167             base::ThreadTaskRunnerHandle::Get().get(), &task_graph_runner_, | 
|  168             resource_provider_.get()); |  168             resource_provider_.get()); | 
|  169         break; |  169         break; | 
|  170     } |  170     } | 
|  171  |  171  | 
|  172     DCHECK(tile_task_worker_pool_); |  172     DCHECK(tile_task_worker_pool_); | 
|  173     tile_task_worker_pool_->AsTileTaskRunner()->SetClient(this); |  | 
|  174   } |  173   } | 
|  175  |  174  | 
|  176   void TearDown() override { |  175   void TearDown() override { | 
|  177     tile_task_worker_pool_->AsTileTaskRunner()->Shutdown(); |  176     tile_task_worker_pool_->AsTileTaskRunner()->Shutdown(); | 
|  178     tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |  177     tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); | 
|  179   } |  178   } | 
|  180  |  179  | 
|  181   void AllTileTasksFinished() { |  180   void AllTileTasksFinished() { | 
|  182     tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |  181     tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); | 
|  183     base::MessageLoop::current()->QuitWhenIdle(); |  182     base::MessageLoop::current()->QuitWhenIdle(); | 
|  184   } |  183   } | 
|  185  |  184  | 
|  186   // Overriden from TileTaskWorkerPoolClient: |  | 
|  187   void DidFinishRunningTileTasks(TaskSet task_set) override { |  | 
|  188     EXPECT_FALSE(completed_task_sets_[task_set]); |  | 
|  189     completed_task_sets_[task_set] = true; |  | 
|  190     if (task_set == ALL) { |  | 
|  191       EXPECT_TRUE((~completed_task_sets_).none()); |  | 
|  192       all_tile_tasks_finished_.Schedule(); |  | 
|  193     } |  | 
|  194   } |  | 
|  195  |  | 
|  196   void RunMessageLoopUntilAllTasksHaveCompleted() { |  185   void RunMessageLoopUntilAllTasksHaveCompleted() { | 
|  197     if (timeout_seconds_) { |  186     task_graph_runner_.RunUntilIdle(); | 
|  198       timeout_.Reset(base::Bind(&TileTaskWorkerPoolTest::OnTimeout, |  187     tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); | 
|  199                                 base::Unretained(this))); |  | 
|  200       base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |  | 
|  201           FROM_HERE, timeout_.callback(), |  | 
|  202           base::TimeDelta::FromSeconds(timeout_seconds_)); |  | 
|  203     } |  | 
|  204  |  | 
|  205     base::MessageLoop::current()->Run(); |  | 
|  206  |  | 
|  207     timeout_.Cancel(); |  | 
|  208  |  | 
|  209     ASSERT_FALSE(timed_out_) << "Test timed out"; |  | 
|  210   } |  188   } | 
|  211  |  189  | 
|  212   void ScheduleTasks() { |  190   void ScheduleTasks() { | 
|  213     TileTaskQueue queue; |  191     graph_.Reset(); | 
 |  192  | 
 |  193     size_t priority = 0; | 
|  214  |  194  | 
|  215     for (RasterTaskVector::const_iterator it = tasks_.begin(); |  195     for (RasterTaskVector::const_iterator it = tasks_.begin(); | 
|  216          it != tasks_.end(); ++it) { |  196          it != tasks_.end(); ++it) { | 
|  217       TaskSetCollection task_sets; |  197       graph_.nodes.emplace_back(it->get(), priority++, 0 /* dependencies */); | 
|  218       task_sets[REQUIRED_FOR_ACTIVATION] = true; |  | 
|  219       task_sets[REQUIRED_FOR_DRAW] = true; |  | 
|  220       task_sets[ALL] = true; |  | 
|  221       queue.items.push_back(TileTaskQueue::Item(it->get(), task_sets)); |  | 
|  222     } |  198     } | 
|  223  |  199  | 
|  224     completed_task_sets_.reset(); |  200     tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&graph_); | 
|  225     tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue); |  | 
|  226   } |  201   } | 
|  227  |  202  | 
|  228   void AppendTask(unsigned id, const gfx::Size& size) { |  203   void AppendTask(unsigned id, const gfx::Size& size) { | 
|  229     scoped_ptr<ScopedResource> resource( |  204     scoped_ptr<ScopedResource> resource( | 
|  230         ScopedResource::Create(resource_provider_.get())); |  205         ScopedResource::Create(resource_provider_.get())); | 
|  231     resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |  206     resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 
|  232                        RGBA_8888); |  207                        RGBA_8888); | 
|  233     const Resource* const_resource = resource.get(); |  208     const Resource* const_resource = resource.get(); | 
|  234  |  209  | 
|  235     ImageDecodeTask::Vector empty; |  210     ImageDecodeTask::Vector empty; | 
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  308  |  283  | 
|  309  protected: |  284  protected: | 
|  310   scoped_refptr<TestContextProvider> context_provider_; |  285   scoped_refptr<TestContextProvider> context_provider_; | 
|  311   scoped_refptr<TestContextProvider> worker_context_provider_; |  286   scoped_refptr<TestContextProvider> worker_context_provider_; | 
|  312   FakeOutputSurfaceClient output_surface_client_; |  287   FakeOutputSurfaceClient output_surface_client_; | 
|  313   scoped_ptr<FakeOutputSurface> output_surface_; |  288   scoped_ptr<FakeOutputSurface> output_surface_; | 
|  314   scoped_ptr<ResourceProvider> resource_provider_; |  289   scoped_ptr<ResourceProvider> resource_provider_; | 
|  315   scoped_ptr<TileTaskWorkerPool> tile_task_worker_pool_; |  290   scoped_ptr<TileTaskWorkerPool> tile_task_worker_pool_; | 
|  316   TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |  291   TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | 
|  317   TestSharedBitmapManager shared_bitmap_manager_; |  292   TestSharedBitmapManager shared_bitmap_manager_; | 
|  318   TestTaskGraphRunner task_graph_runner_; |  293   SynchronousTaskGraphRunner task_graph_runner_; | 
|  319   base::CancelableClosure timeout_; |  294   base::CancelableClosure timeout_; | 
|  320   UniqueNotifier all_tile_tasks_finished_; |  295   UniqueNotifier all_tile_tasks_finished_; | 
|  321   int timeout_seconds_; |  296   int timeout_seconds_; | 
|  322   bool timed_out_; |  297   bool timed_out_; | 
|  323   RasterTaskVector tasks_; |  298   RasterTaskVector tasks_; | 
|  324   std::vector<RasterTaskResult> completed_tasks_; |  299   std::vector<RasterTaskResult> completed_tasks_; | 
|  325   TaskSetCollection completed_task_sets_; |  300   TaskGraph graph_; | 
|  326 }; |  301 }; | 
|  327  |  302  | 
|  328 TEST_P(TileTaskWorkerPoolTest, Basic) { |  303 TEST_P(TileTaskWorkerPoolTest, Basic) { | 
|  329   AppendTask(0u); |  304   AppendTask(0u); | 
|  330   AppendTask(1u); |  305   AppendTask(1u); | 
|  331   ScheduleTasks(); |  306   ScheduleTasks(); | 
|  332  |  307  | 
|  333   RunMessageLoopUntilAllTasksHaveCompleted(); |  308   RunMessageLoopUntilAllTasksHaveCompleted(); | 
|  334  |  309  | 
|  335   ASSERT_EQ(2u, completed_tasks().size()); |  310   ASSERT_EQ(2u, completed_tasks().size()); | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  384   AppendTask(1u); |  359   AppendTask(1u); | 
|  385   ScheduleTasks(); |  360   ScheduleTasks(); | 
|  386  |  361  | 
|  387   RunMessageLoopUntilAllTasksHaveCompleted(); |  362   RunMessageLoopUntilAllTasksHaveCompleted(); | 
|  388  |  363  | 
|  389   ASSERT_EQ(2u, completed_tasks().size()); |  364   ASSERT_EQ(2u, completed_tasks().size()); | 
|  390   EXPECT_FALSE(completed_tasks()[0].canceled); |  365   EXPECT_FALSE(completed_tasks()[0].canceled); | 
|  391   EXPECT_FALSE(completed_tasks()[1].canceled); |  366   EXPECT_FALSE(completed_tasks()[1].canceled); | 
|  392 } |  367 } | 
|  393  |  368  | 
|  394 TEST_P(TileTaskWorkerPoolTest, ScheduleEmptyStillTriggersCallback) { |  | 
|  395   // Don't append any tasks, just call ScheduleTasks. |  | 
|  396   ScheduleTasks(); |  | 
|  397  |  | 
|  398   EXPECT_FALSE(completed_task_sets_[REQUIRED_FOR_ACTIVATION]); |  | 
|  399   EXPECT_FALSE(completed_task_sets_[REQUIRED_FOR_DRAW]); |  | 
|  400   EXPECT_FALSE(completed_task_sets_[ALL]); |  | 
|  401  |  | 
|  402   RunMessageLoopUntilAllTasksHaveCompleted(); |  | 
|  403  |  | 
|  404   EXPECT_TRUE(completed_task_sets_[REQUIRED_FOR_ACTIVATION]); |  | 
|  405   EXPECT_TRUE(completed_task_sets_[REQUIRED_FOR_DRAW]); |  | 
|  406   EXPECT_TRUE(completed_task_sets_[ALL]); |  | 
|  407 } |  | 
|  408  |  | 
|  409 INSTANTIATE_TEST_CASE_P(TileTaskWorkerPoolTests, |  369 INSTANTIATE_TEST_CASE_P(TileTaskWorkerPoolTests, | 
|  410                         TileTaskWorkerPoolTest, |  370                         TileTaskWorkerPoolTest, | 
|  411                         ::testing::Values(TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY, |  371                         ::testing::Values(TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY, | 
|  412                                           TILE_TASK_WORKER_POOL_TYPE_ONE_COPY, |  372                                           TILE_TASK_WORKER_POOL_TYPE_ONE_COPY, | 
|  413                                           TILE_TASK_WORKER_POOL_TYPE_GPU, |  373                                           TILE_TASK_WORKER_POOL_TYPE_GPU, | 
|  414                                           TILE_TASK_WORKER_POOL_TYPE_BITMAP)); |  374                                           TILE_TASK_WORKER_POOL_TYPE_BITMAP)); | 
|  415  |  375  | 
|  416 }  // namespace |  376 }  // namespace | 
|  417 }  // namespace cc |  377 }  // namespace cc | 
| OLD | NEW |