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 "base/test/test_simple_task_runner.h" | 7 #include "base/test/test_simple_task_runner.h" |
| 8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
| 9 #include "cc/debug/lap_timer.h" | 9 #include "cc/debug/lap_timer.h" |
| 10 #include "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
| 11 #include "cc/resources/bitmap_raster_worker_pool.h" | 11 #include "cc/resources/bitmap_raster_worker_pool.h" |
| 12 #include "cc/resources/gpu_raster_worker_pool.h" | 12 #include "cc/resources/gpu_raster_worker_pool.h" |
| 13 #include "cc/resources/one_copy_raster_worker_pool.h" | 13 #include "cc/resources/one_copy_raster_worker_pool.h" |
| 14 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 14 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| 15 #include "cc/resources/raster_buffer.h" | 15 #include "cc/resources/raster_buffer.h" |
| 16 #include "cc/resources/rasterizer.h" | 16 #include "cc/resources/tile_task_runner.h" |
| 17 #include "cc/resources/resource_pool.h" | 17 #include "cc/resources/resource_pool.h" |
| 18 #include "cc/resources/resource_provider.h" | 18 #include "cc/resources/resource_provider.h" |
| 19 #include "cc/resources/scoped_resource.h" | 19 #include "cc/resources/scoped_resource.h" |
| 20 #include "cc/resources/zero_copy_raster_worker_pool.h" | 20 #include "cc/resources/zero_copy_raster_worker_pool.h" |
| 21 #include "cc/test/fake_output_surface.h" | 21 #include "cc/test/fake_output_surface.h" |
| 22 #include "cc/test/fake_output_surface_client.h" | 22 #include "cc/test/fake_output_surface_client.h" |
| 23 #include "cc/test/test_context_support.h" | 23 #include "cc/test/test_context_support.h" |
| 24 #include "cc/test/test_gpu_memory_buffer_manager.h" | 24 #include "cc/test/test_gpu_memory_buffer_manager.h" |
| 25 #include "cc/test/test_shared_bitmap_manager.h" | 25 #include "cc/test/test_shared_bitmap_manager.h" |
| 26 #include "cc/test/test_web_graphics_context_3d.h" | 26 #include "cc/test/test_web_graphics_context_3d.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 87 void SetMemoryPolicyChangedCallback( | 87 void SetMemoryPolicyChangedCallback( |
| 88 const MemoryPolicyChangedCallback& cb) override {} | 88 const MemoryPolicyChangedCallback& cb) override {} |
| 89 | 89 |
| 90 private: | 90 private: |
| 91 ~PerfContextProvider() override {} | 91 ~PerfContextProvider() override {} |
| 92 | 92 |
| 93 scoped_ptr<PerfGLES2Interface> context_gl_; | 93 scoped_ptr<PerfGLES2Interface> context_gl_; |
| 94 TestContextSupport support_; | 94 TestContextSupport support_; |
| 95 }; | 95 }; |
| 96 | 96 |
| 97 enum RasterWorkerPoolType { | 97 enum TileTaskWorkerPoolType { |
| 98 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 98 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
| 99 RASTER_WORKER_POOL_TYPE_ZERO_COPY, | 99 RASTER_WORKER_POOL_TYPE_ZERO_COPY, |
| 100 RASTER_WORKER_POOL_TYPE_ONE_COPY, | 100 RASTER_WORKER_POOL_TYPE_ONE_COPY, |
| 101 RASTER_WORKER_POOL_TYPE_GPU, | 101 RASTER_WORKER_POOL_TYPE_GPU, |
| 102 RASTER_WORKER_POOL_TYPE_BITMAP | 102 RASTER_WORKER_POOL_TYPE_BITMAP |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 static const int kTimeLimitMillis = 2000; | 105 static const int kTimeLimitMillis = 2000; |
| 106 static const int kWarmupRuns = 5; | 106 static const int kWarmupRuns = 5; |
| 107 static const int kTimeCheckInterval = 10; | 107 static const int kTimeCheckInterval = 10; |
| 108 | 108 |
| 109 class PerfImageDecodeTaskImpl : public ImageDecodeTask { | 109 class PerfImageDecodeTaskImpl : public ImageDecodeTask { |
| 110 public: | 110 public: |
| 111 PerfImageDecodeTaskImpl() {} | 111 PerfImageDecodeTaskImpl() {} |
| 112 | 112 |
| 113 // Overridden from Task: | 113 // Overridden from Task: |
| 114 void RunOnWorkerThread() override {} | 114 void RunOnWorkerThread() override {} |
| 115 | 115 |
| 116 // Overridden from RasterizerTask: | 116 // Overridden from TileTask: |
| 117 void ScheduleOnOriginThread(RasterizerTaskClient* client) override {} | 117 void ScheduleOnOriginThread(TileTaskClient* client) override {} |
| 118 void CompleteOnOriginThread(RasterizerTaskClient* client) override {} | 118 void CompleteOnOriginThread(TileTaskClient* client) override {} |
| 119 void RunReplyOnOriginThread() override { Reset(); } | 119 void RunReplyOnOriginThread() override { Reset(); } |
| 120 | 120 |
| 121 void Reset() { | 121 void Reset() { |
| 122 did_run_ = false; | 122 did_run_ = false; |
| 123 did_complete_ = false; | 123 did_complete_ = false; |
| 124 } | 124 } |
| 125 | 125 |
| 126 protected: | 126 protected: |
| 127 ~PerfImageDecodeTaskImpl() override {} | 127 ~PerfImageDecodeTaskImpl() override {} |
| 128 | 128 |
| 129 private: | 129 private: |
| 130 DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl); | 130 DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl); |
| 131 }; | 131 }; |
| 132 | 132 |
| 133 class PerfRasterTaskImpl : public RasterTask { | 133 class PerfRasterTaskImpl : public RasterTask { |
| 134 public: | 134 public: |
| 135 PerfRasterTaskImpl(scoped_ptr<ScopedResource> resource, | 135 PerfRasterTaskImpl(scoped_ptr<ScopedResource> resource, |
| 136 ImageDecodeTask::Vector* dependencies) | 136 ImageDecodeTask::Vector* dependencies) |
| 137 : RasterTask(resource.get(), dependencies), resource_(resource.Pass()) {} | 137 : RasterTask(resource.get(), dependencies), resource_(resource.Pass()) {} |
| 138 | 138 |
| 139 // Overridden from Task: | 139 // Overridden from Task: |
| 140 void RunOnWorkerThread() override {} | 140 void RunOnWorkerThread() override {} |
| 141 | 141 |
| 142 // Overridden from RasterizerTask: | 142 // Overridden from TileTask: |
| 143 void ScheduleOnOriginThread(RasterizerTaskClient* client) override { | 143 void ScheduleOnOriginThread(TileTaskClient* client) override { |
| 144 raster_buffer_ = client->AcquireBufferForRaster(resource()); | 144 raster_buffer_ = client->AcquireBufferForRaster(resource()); |
| 145 } | 145 } |
| 146 void CompleteOnOriginThread(RasterizerTaskClient* client) override { | 146 void CompleteOnOriginThread(TileTaskClient* client) override { |
| 147 client->ReleaseBufferForRaster(raster_buffer_.Pass()); | 147 client->ReleaseBufferForRaster(raster_buffer_.Pass()); |
| 148 } | 148 } |
| 149 void RunReplyOnOriginThread() override { Reset(); } | 149 void RunReplyOnOriginThread() override { Reset(); } |
| 150 | 150 |
| 151 void Reset() { | 151 void Reset() { |
| 152 did_run_ = false; | 152 did_run_ = false; |
| 153 did_complete_ = false; | 153 did_complete_ = false; |
| 154 } | 154 } |
| 155 | 155 |
| 156 protected: | 156 protected: |
| 157 ~PerfRasterTaskImpl() override {} | 157 ~PerfRasterTaskImpl() override {} |
| 158 | 158 |
| 159 private: | 159 private: |
| 160 scoped_ptr<ScopedResource> resource_; | 160 scoped_ptr<ScopedResource> resource_; |
| 161 scoped_ptr<RasterBuffer> raster_buffer_; | 161 scoped_ptr<RasterBuffer> raster_buffer_; |
| 162 | 162 |
| 163 DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl); | 163 DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl); |
| 164 }; | 164 }; |
| 165 | 165 |
| 166 class RasterWorkerPoolPerfTestBase { | 166 class TileTaskWorkerPoolPerfTestBase { |
| 167 public: | 167 public: |
| 168 typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector; | 168 typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector; |
| 169 | 169 |
| 170 enum NamedTaskSet { ALL, REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW }; | 170 enum NamedTaskSet { ALL, REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW }; |
| 171 | 171 |
| 172 RasterWorkerPoolPerfTestBase() | 172 TileTaskWorkerPoolPerfTestBase() |
| 173 : context_provider_(make_scoped_refptr(new PerfContextProvider)), | 173 : context_provider_(make_scoped_refptr(new PerfContextProvider)), |
| 174 task_runner_(new base::TestSimpleTaskRunner), | 174 task_runner_(new base::TestSimpleTaskRunner), |
| 175 task_graph_runner_(new TaskGraphRunner), | 175 task_graph_runner_(new TaskGraphRunner), |
| 176 timer_(kWarmupRuns, | 176 timer_(kWarmupRuns, |
| 177 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), | 177 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), |
| 178 kTimeCheckInterval) {} | 178 kTimeCheckInterval) {} |
| 179 | 179 |
| 180 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, | 180 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, |
| 181 ImageDecodeTask::Vector* image_decode_tasks) { | 181 ImageDecodeTask::Vector* image_decode_tasks) { |
| 182 for (unsigned i = 0; i < num_image_decode_tasks; ++i) | 182 for (unsigned i = 0; i < num_image_decode_tasks; ++i) |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 193 ScopedResource::Create(resource_provider_.get())); | 193 ScopedResource::Create(resource_provider_.get())); |
| 194 resource->Allocate( | 194 resource->Allocate( |
| 195 size, ResourceProvider::TextureHintImmutable, RGBA_8888); | 195 size, ResourceProvider::TextureHintImmutable, RGBA_8888); |
| 196 | 196 |
| 197 ImageDecodeTask::Vector dependencies = image_decode_tasks; | 197 ImageDecodeTask::Vector dependencies = image_decode_tasks; |
| 198 raster_tasks->push_back( | 198 raster_tasks->push_back( |
| 199 new PerfRasterTaskImpl(resource.Pass(), &dependencies)); | 199 new PerfRasterTaskImpl(resource.Pass(), &dependencies)); |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 void BuildRasterTaskQueue(RasterTaskQueue* queue, | 203 void BuildTileTaskQueue(TileTaskQueue* queue, |
| 204 const RasterTaskVector& raster_tasks) { | 204 const RasterTaskVector& raster_tasks) { |
| 205 for (size_t i = 0u; i < raster_tasks.size(); ++i) { | 205 for (size_t i = 0u; i < raster_tasks.size(); ++i) { |
| 206 bool required_for_activation = (i % 2) == 0; | 206 bool required_for_activation = (i % 2) == 0; |
| 207 TaskSetCollection task_set_collection; | 207 TaskSetCollection task_set_collection; |
| 208 task_set_collection[ALL] = true; | 208 task_set_collection[ALL] = true; |
| 209 task_set_collection[REQUIRED_FOR_ACTIVATION] = required_for_activation; | 209 task_set_collection[REQUIRED_FOR_ACTIVATION] = required_for_activation; |
| 210 queue->items.push_back( | 210 queue->items.push_back( |
| 211 RasterTaskQueue::Item(raster_tasks[i].get(), task_set_collection)); | 211 TileTaskQueue::Item(raster_tasks[i].get(), task_set_collection)); |
| 212 } | 212 } |
| 213 } | 213 } |
| 214 | 214 |
| 215 protected: | 215 protected: |
| 216 scoped_refptr<ContextProvider> context_provider_; | 216 scoped_refptr<ContextProvider> context_provider_; |
| 217 FakeOutputSurfaceClient output_surface_client_; | 217 FakeOutputSurfaceClient output_surface_client_; |
| 218 scoped_ptr<FakeOutputSurface> output_surface_; | 218 scoped_ptr<FakeOutputSurface> output_surface_; |
| 219 scoped_ptr<ResourceProvider> resource_provider_; | 219 scoped_ptr<ResourceProvider> resource_provider_; |
| 220 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 220 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 221 scoped_ptr<TaskGraphRunner> task_graph_runner_; | 221 scoped_ptr<TaskGraphRunner> task_graph_runner_; |
| 222 LapTimer timer_; | 222 LapTimer timer_; |
| 223 }; | 223 }; |
| 224 | 224 |
| 225 class RasterWorkerPoolPerfTest | 225 class TileTaskWorkerPoolPerfTest |
| 226 : public RasterWorkerPoolPerfTestBase, | 226 : public TileTaskWorkerPoolPerfTestBase, |
| 227 public testing::TestWithParam<RasterWorkerPoolType>, | 227 public testing::TestWithParam<TileTaskWorkerPoolType>, |
| 228 public RasterizerClient { | 228 public TileTaskRunnerClient { |
| 229 public: | 229 public: |
| 230 // Overridden from testing::Test: | 230 // Overridden from testing::Test: |
| 231 void SetUp() override { | 231 void SetUp() override { |
| 232 switch (GetParam()) { | 232 switch (GetParam()) { |
| 233 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: | 233 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: |
| 234 Create3dOutputSurfaceAndResourceProvider(); | 234 Create3dOutputSurfaceAndResourceProvider(); |
| 235 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( | 235 raster_worker_pool_ = PixelBufferTileTaskWorkerPool::Create( |
| 236 task_runner_.get(), | 236 task_runner_.get(), task_graph_runner_.get(), |
| 237 task_graph_runner_.get(), | 237 context_provider_.get(), resource_provider_.get(), |
| 238 context_provider_.get(), | |
| 239 resource_provider_.get(), | |
| 240 std::numeric_limits<size_t>::max()); | 238 std::numeric_limits<size_t>::max()); |
| 241 break; | 239 break; |
| 242 case RASTER_WORKER_POOL_TYPE_ZERO_COPY: | 240 case RASTER_WORKER_POOL_TYPE_ZERO_COPY: |
| 243 Create3dOutputSurfaceAndResourceProvider(); | 241 Create3dOutputSurfaceAndResourceProvider(); |
| 244 raster_worker_pool_ = | 242 raster_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create( |
| 245 ZeroCopyRasterWorkerPool::Create(task_runner_.get(), | 243 task_runner_.get(), task_graph_runner_.get(), |
| 246 task_graph_runner_.get(), | 244 resource_provider_.get()); |
| 247 resource_provider_.get()); | |
| 248 break; | 245 break; |
| 249 case RASTER_WORKER_POOL_TYPE_ONE_COPY: | 246 case RASTER_WORKER_POOL_TYPE_ONE_COPY: |
| 250 Create3dOutputSurfaceAndResourceProvider(); | 247 Create3dOutputSurfaceAndResourceProvider(); |
| 251 staging_resource_pool_ = ResourcePool::Create( | 248 staging_resource_pool_ = ResourcePool::Create( |
| 252 resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888); | 249 resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888); |
| 253 raster_worker_pool_ = | 250 raster_worker_pool_ = OneCopyTileTaskWorkerPool::Create( |
| 254 OneCopyRasterWorkerPool::Create(task_runner_.get(), | 251 task_runner_.get(), task_graph_runner_.get(), |
| 255 task_graph_runner_.get(), | 252 context_provider_.get(), resource_provider_.get(), |
| 256 context_provider_.get(), | 253 staging_resource_pool_.get()); |
| 257 resource_provider_.get(), | |
| 258 staging_resource_pool_.get()); | |
| 259 break; | 254 break; |
| 260 case RASTER_WORKER_POOL_TYPE_GPU: | 255 case RASTER_WORKER_POOL_TYPE_GPU: |
| 261 Create3dOutputSurfaceAndResourceProvider(); | 256 Create3dOutputSurfaceAndResourceProvider(); |
| 262 raster_worker_pool_ = | 257 raster_worker_pool_ = GpuTileTaskWorkerPool::Create( |
| 263 GpuRasterWorkerPool::Create(task_runner_.get(), | 258 task_runner_.get(), context_provider_.get(), |
| 264 context_provider_.get(), | 259 resource_provider_.get(), false); |
| 265 resource_provider_.get(), | |
| 266 false); | |
| 267 break; | 260 break; |
| 268 case RASTER_WORKER_POOL_TYPE_BITMAP: | 261 case RASTER_WORKER_POOL_TYPE_BITMAP: |
| 269 CreateSoftwareOutputSurfaceAndResourceProvider(); | 262 CreateSoftwareOutputSurfaceAndResourceProvider(); |
| 270 raster_worker_pool_ = | 263 raster_worker_pool_ = BitmapTileTaskWorkerPool::Create( |
| 271 BitmapRasterWorkerPool::Create(task_runner_.get(), | 264 task_runner_.get(), task_graph_runner_.get(), |
| 272 task_graph_runner_.get(), | 265 resource_provider_.get()); |
| 273 resource_provider_.get()); | |
| 274 break; | 266 break; |
| 275 } | 267 } |
| 276 | 268 |
| 277 DCHECK(raster_worker_pool_); | 269 DCHECK(raster_worker_pool_); |
| 278 raster_worker_pool_->AsRasterizer()->SetClient(this); | 270 raster_worker_pool_->AsTileTaskRunner()->SetClient(this); |
| 279 } | 271 } |
| 280 void TearDown() override { | 272 void TearDown() override { |
| 281 raster_worker_pool_->AsRasterizer()->Shutdown(); | 273 raster_worker_pool_->AsTileTaskRunner()->Shutdown(); |
| 282 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 274 raster_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
| 283 } | 275 } |
| 284 | 276 |
| 285 // Overriden from RasterizerClient: | 277 // Overriden from TileTaskRunnerClient: |
| 286 void DidFinishRunningTasks(TaskSet task_set) override { | 278 void DidFinishRunningTileTasks(TaskSet task_set) override { |
| 287 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 279 raster_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
| 288 } | 280 } |
| 289 TaskSetCollection TasksThatShouldBeForcedToComplete() const override { | 281 TaskSetCollection TasksThatShouldBeForcedToComplete() const override { |
| 290 return TaskSetCollection(); | 282 return TaskSetCollection(); |
| 291 } | 283 } |
| 292 | 284 |
| 293 void RunMessageLoopUntilAllTasksHaveCompleted() { | 285 void RunMessageLoopUntilAllTasksHaveCompleted() { |
| 294 task_graph_runner_->RunUntilIdle(); | 286 task_graph_runner_->RunUntilIdle(); |
| 295 task_runner_->RunUntilIdle(); | 287 task_runner_->RunUntilIdle(); |
| 296 } | 288 } |
| 297 | 289 |
| 298 void RunScheduleTasksTest(const std::string& test_name, | 290 void RunScheduleTasksTest(const std::string& test_name, |
| 299 unsigned num_raster_tasks, | 291 unsigned num_raster_tasks, |
| 300 unsigned num_image_decode_tasks) { | 292 unsigned num_image_decode_tasks) { |
| 301 ImageDecodeTask::Vector image_decode_tasks; | 293 ImageDecodeTask::Vector image_decode_tasks; |
| 302 RasterTaskVector raster_tasks; | 294 RasterTaskVector raster_tasks; |
| 303 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 295 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
| 304 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 296 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
| 305 | 297 |
| 306 // Avoid unnecessary heap allocations by reusing the same queue. | 298 // Avoid unnecessary heap allocations by reusing the same queue. |
| 307 RasterTaskQueue queue; | 299 TileTaskQueue queue; |
| 308 | 300 |
| 309 timer_.Reset(); | 301 timer_.Reset(); |
| 310 do { | 302 do { |
| 311 queue.Reset(); | 303 queue.Reset(); |
| 312 BuildRasterTaskQueue(&queue, raster_tasks); | 304 BuildTileTaskQueue(&queue, raster_tasks); |
| 313 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue); | 305 raster_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue); |
| 314 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 306 raster_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
| 315 timer_.NextLap(); | 307 timer_.NextLap(); |
| 316 } while (!timer_.HasTimeLimitExpired()); | 308 } while (!timer_.HasTimeLimitExpired()); |
| 317 | 309 |
| 318 RasterTaskQueue empty; | 310 TileTaskQueue empty; |
| 319 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty); | 311 raster_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty); |
| 320 RunMessageLoopUntilAllTasksHaveCompleted(); | 312 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 321 | 313 |
| 322 perf_test::PrintResult("schedule_tasks", | 314 perf_test::PrintResult("schedule_tasks", |
| 323 TestModifierString(), | 315 TestModifierString(), |
| 324 test_name, | 316 test_name, |
| 325 timer_.LapsPerSecond(), | 317 timer_.LapsPerSecond(), |
| 326 "runs/s", | 318 "runs/s", |
| 327 true); | 319 true); |
| 328 } | 320 } |
| 329 | 321 |
| 330 void RunScheduleAlternateTasksTest(const std::string& test_name, | 322 void RunScheduleAlternateTasksTest(const std::string& test_name, |
| 331 unsigned num_raster_tasks, | 323 unsigned num_raster_tasks, |
| 332 unsigned num_image_decode_tasks) { | 324 unsigned num_image_decode_tasks) { |
| 333 const size_t kNumVersions = 2; | 325 const size_t kNumVersions = 2; |
| 334 ImageDecodeTask::Vector image_decode_tasks[kNumVersions]; | 326 ImageDecodeTask::Vector image_decode_tasks[kNumVersions]; |
| 335 RasterTaskVector raster_tasks[kNumVersions]; | 327 RasterTaskVector raster_tasks[kNumVersions]; |
| 336 for (size_t i = 0; i < kNumVersions; ++i) { | 328 for (size_t i = 0; i < kNumVersions; ++i) { |
| 337 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); | 329 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); |
| 338 CreateRasterTasks( | 330 CreateRasterTasks( |
| 339 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); | 331 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); |
| 340 } | 332 } |
| 341 | 333 |
| 342 // Avoid unnecessary heap allocations by reusing the same queue. | 334 // Avoid unnecessary heap allocations by reusing the same queue. |
| 343 RasterTaskQueue queue; | 335 TileTaskQueue queue; |
| 344 | 336 |
| 345 size_t count = 0; | 337 size_t count = 0; |
| 346 timer_.Reset(); | 338 timer_.Reset(); |
| 347 do { | 339 do { |
| 348 queue.Reset(); | 340 queue.Reset(); |
| 349 BuildRasterTaskQueue(&queue, raster_tasks[count % kNumVersions]); | 341 BuildTileTaskQueue(&queue, raster_tasks[count % kNumVersions]); |
| 350 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue); | 342 raster_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue); |
| 351 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 343 raster_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
| 352 ++count; | 344 ++count; |
| 353 timer_.NextLap(); | 345 timer_.NextLap(); |
| 354 } while (!timer_.HasTimeLimitExpired()); | 346 } while (!timer_.HasTimeLimitExpired()); |
| 355 | 347 |
| 356 RasterTaskQueue empty; | 348 TileTaskQueue empty; |
| 357 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty); | 349 raster_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty); |
| 358 RunMessageLoopUntilAllTasksHaveCompleted(); | 350 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 359 | 351 |
| 360 perf_test::PrintResult("schedule_alternate_tasks", | 352 perf_test::PrintResult("schedule_alternate_tasks", |
| 361 TestModifierString(), | 353 TestModifierString(), |
| 362 test_name, | 354 test_name, |
| 363 timer_.LapsPerSecond(), | 355 timer_.LapsPerSecond(), |
| 364 "runs/s", | 356 "runs/s", |
| 365 true); | 357 true); |
| 366 } | 358 } |
| 367 | 359 |
| 368 void RunScheduleAndExecuteTasksTest(const std::string& test_name, | 360 void RunScheduleAndExecuteTasksTest(const std::string& test_name, |
| 369 unsigned num_raster_tasks, | 361 unsigned num_raster_tasks, |
| 370 unsigned num_image_decode_tasks) { | 362 unsigned num_image_decode_tasks) { |
| 371 ImageDecodeTask::Vector image_decode_tasks; | 363 ImageDecodeTask::Vector image_decode_tasks; |
| 372 RasterTaskVector raster_tasks; | 364 RasterTaskVector raster_tasks; |
| 373 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 365 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
| 374 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 366 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
| 375 | 367 |
| 376 // Avoid unnecessary heap allocations by reusing the same queue. | 368 // Avoid unnecessary heap allocations by reusing the same queue. |
| 377 RasterTaskQueue queue; | 369 TileTaskQueue queue; |
| 378 | 370 |
| 379 timer_.Reset(); | 371 timer_.Reset(); |
| 380 do { | 372 do { |
| 381 queue.Reset(); | 373 queue.Reset(); |
| 382 BuildRasterTaskQueue(&queue, raster_tasks); | 374 BuildTileTaskQueue(&queue, raster_tasks); |
| 383 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue); | 375 raster_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue); |
| 384 RunMessageLoopUntilAllTasksHaveCompleted(); | 376 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 385 timer_.NextLap(); | 377 timer_.NextLap(); |
| 386 } while (!timer_.HasTimeLimitExpired()); | 378 } while (!timer_.HasTimeLimitExpired()); |
| 387 | 379 |
| 388 RasterTaskQueue empty; | 380 TileTaskQueue empty; |
| 389 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty); | 381 raster_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty); |
| 390 RunMessageLoopUntilAllTasksHaveCompleted(); | 382 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 391 | 383 |
| 392 perf_test::PrintResult("schedule_and_execute_tasks", | 384 perf_test::PrintResult("schedule_and_execute_tasks", |
| 393 TestModifierString(), | 385 TestModifierString(), |
| 394 test_name, | 386 test_name, |
| 395 timer_.LapsPerSecond(), | 387 timer_.LapsPerSecond(), |
| 396 "runs/s", | 388 "runs/s", |
| 397 true); | 389 true); |
| 398 } | 390 } |
| 399 | 391 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 427 switch (GetParam()) { | 419 switch (GetParam()) { |
| 428 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: | 420 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: |
| 429 return std::string("_pixel_raster_worker_pool"); | 421 return std::string("_pixel_raster_worker_pool"); |
| 430 case RASTER_WORKER_POOL_TYPE_ZERO_COPY: | 422 case RASTER_WORKER_POOL_TYPE_ZERO_COPY: |
| 431 return std::string("_zero_copy_raster_worker_pool"); | 423 return std::string("_zero_copy_raster_worker_pool"); |
| 432 case RASTER_WORKER_POOL_TYPE_ONE_COPY: | 424 case RASTER_WORKER_POOL_TYPE_ONE_COPY: |
| 433 return std::string("_one_copy_raster_worker_pool"); | 425 return std::string("_one_copy_raster_worker_pool"); |
| 434 case RASTER_WORKER_POOL_TYPE_GPU: | 426 case RASTER_WORKER_POOL_TYPE_GPU: |
| 435 return std::string("_gpu_raster_worker_pool"); | 427 return std::string("_gpu_raster_worker_pool"); |
| 436 case RASTER_WORKER_POOL_TYPE_BITMAP: | 428 case RASTER_WORKER_POOL_TYPE_BITMAP: |
| 437 return std::string("_bitmap_raster_worker_pool"); | 429 return std::string("_bitmap_raster_worker_pool"); |
|
reveman
2014/12/08 17:07:07
should we update the modifier strings as part of t
vmiura
2014/12/08 23:41:01
Done.
| |
| 438 } | 430 } |
| 439 NOTREACHED(); | 431 NOTREACHED(); |
| 440 return std::string(); | 432 return std::string(); |
| 441 } | 433 } |
| 442 | 434 |
| 443 scoped_ptr<ResourcePool> staging_resource_pool_; | 435 scoped_ptr<ResourcePool> staging_resource_pool_; |
| 444 scoped_ptr<RasterWorkerPool> raster_worker_pool_; | 436 scoped_ptr<TileTaskWorkerPool> raster_worker_pool_; |
| 445 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | 437 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |
| 446 TestSharedBitmapManager shared_bitmap_manager_; | 438 TestSharedBitmapManager shared_bitmap_manager_; |
| 447 }; | 439 }; |
| 448 | 440 |
| 449 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { | 441 TEST_P(TileTaskWorkerPoolPerfTest, ScheduleTasks) { |
| 450 RunScheduleTasksTest("1_0", 1, 0); | 442 RunScheduleTasksTest("1_0", 1, 0); |
| 451 RunScheduleTasksTest("32_0", 32, 0); | 443 RunScheduleTasksTest("32_0", 32, 0); |
| 452 RunScheduleTasksTest("1_1", 1, 1); | 444 RunScheduleTasksTest("1_1", 1, 1); |
| 453 RunScheduleTasksTest("32_1", 32, 1); | 445 RunScheduleTasksTest("32_1", 32, 1); |
| 454 RunScheduleTasksTest("1_4", 1, 4); | 446 RunScheduleTasksTest("1_4", 1, 4); |
| 455 RunScheduleTasksTest("32_4", 32, 4); | 447 RunScheduleTasksTest("32_4", 32, 4); |
| 456 } | 448 } |
| 457 | 449 |
| 458 TEST_P(RasterWorkerPoolPerfTest, ScheduleAlternateTasks) { | 450 TEST_P(TileTaskWorkerPoolPerfTest, ScheduleAlternateTasks) { |
| 459 RunScheduleAlternateTasksTest("1_0", 1, 0); | 451 RunScheduleAlternateTasksTest("1_0", 1, 0); |
| 460 RunScheduleAlternateTasksTest("32_0", 32, 0); | 452 RunScheduleAlternateTasksTest("32_0", 32, 0); |
| 461 RunScheduleAlternateTasksTest("1_1", 1, 1); | 453 RunScheduleAlternateTasksTest("1_1", 1, 1); |
| 462 RunScheduleAlternateTasksTest("32_1", 32, 1); | 454 RunScheduleAlternateTasksTest("32_1", 32, 1); |
| 463 RunScheduleAlternateTasksTest("1_4", 1, 4); | 455 RunScheduleAlternateTasksTest("1_4", 1, 4); |
| 464 RunScheduleAlternateTasksTest("32_4", 32, 4); | 456 RunScheduleAlternateTasksTest("32_4", 32, 4); |
| 465 } | 457 } |
| 466 | 458 |
| 467 TEST_P(RasterWorkerPoolPerfTest, ScheduleAndExecuteTasks) { | 459 TEST_P(TileTaskWorkerPoolPerfTest, ScheduleAndExecuteTasks) { |
| 468 RunScheduleAndExecuteTasksTest("1_0", 1, 0); | 460 RunScheduleAndExecuteTasksTest("1_0", 1, 0); |
| 469 RunScheduleAndExecuteTasksTest("32_0", 32, 0); | 461 RunScheduleAndExecuteTasksTest("32_0", 32, 0); |
| 470 RunScheduleAndExecuteTasksTest("1_1", 1, 1); | 462 RunScheduleAndExecuteTasksTest("1_1", 1, 1); |
| 471 RunScheduleAndExecuteTasksTest("32_1", 32, 1); | 463 RunScheduleAndExecuteTasksTest("32_1", 32, 1); |
| 472 RunScheduleAndExecuteTasksTest("1_4", 1, 4); | 464 RunScheduleAndExecuteTasksTest("1_4", 1, 4); |
| 473 RunScheduleAndExecuteTasksTest("32_4", 32, 4); | 465 RunScheduleAndExecuteTasksTest("32_4", 32, 4); |
| 474 } | 466 } |
| 475 | 467 |
| 476 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, | 468 INSTANTIATE_TEST_CASE_P(TileTaskWorkerPoolPerfTests, |
| 477 RasterWorkerPoolPerfTest, | 469 TileTaskWorkerPoolPerfTest, |
| 478 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 470 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
| 479 RASTER_WORKER_POOL_TYPE_ZERO_COPY, | 471 RASTER_WORKER_POOL_TYPE_ZERO_COPY, |
| 480 RASTER_WORKER_POOL_TYPE_ONE_COPY, | 472 RASTER_WORKER_POOL_TYPE_ONE_COPY, |
| 481 RASTER_WORKER_POOL_TYPE_GPU, | 473 RASTER_WORKER_POOL_TYPE_GPU, |
| 482 RASTER_WORKER_POOL_TYPE_BITMAP)); | 474 RASTER_WORKER_POOL_TYPE_BITMAP)); |
| 483 | 475 |
| 484 class RasterWorkerPoolCommonPerfTest : public RasterWorkerPoolPerfTestBase, | 476 class TileTaskWorkerPoolCommonPerfTest : public TileTaskWorkerPoolPerfTestBase, |
| 485 public testing::Test { | 477 public testing::Test { |
| 486 public: | 478 public: |
| 487 // Overridden from testing::Test: | 479 // Overridden from testing::Test: |
| 488 void SetUp() override { | 480 void SetUp() override { |
| 489 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); | 481 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); |
| 490 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 482 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
| 491 resource_provider_ = | 483 resource_provider_ = |
| 492 ResourceProvider::Create( | 484 ResourceProvider::Create( |
| 493 output_surface_.get(), NULL, NULL, NULL, 0, false, 1).Pass(); | 485 output_surface_.get(), NULL, NULL, NULL, 0, false, 1).Pass(); |
| 494 } | 486 } |
| 495 | 487 |
| 496 void RunBuildRasterTaskQueueTest(const std::string& test_name, | 488 void RunBuildTileTaskQueueTest(const std::string& test_name, |
| 497 unsigned num_raster_tasks, | 489 unsigned num_raster_tasks, |
| 498 unsigned num_image_decode_tasks) { | 490 unsigned num_image_decode_tasks) { |
| 499 ImageDecodeTask::Vector image_decode_tasks; | 491 ImageDecodeTask::Vector image_decode_tasks; |
| 500 RasterTaskVector raster_tasks; | 492 RasterTaskVector raster_tasks; |
| 501 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 493 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
| 502 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 494 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
| 503 | 495 |
| 504 // Avoid unnecessary heap allocations by reusing the same queue. | 496 // Avoid unnecessary heap allocations by reusing the same queue. |
| 505 RasterTaskQueue queue; | 497 TileTaskQueue queue; |
| 506 | 498 |
| 507 timer_.Reset(); | 499 timer_.Reset(); |
| 508 do { | 500 do { |
| 509 queue.Reset(); | 501 queue.Reset(); |
| 510 BuildRasterTaskQueue(&queue, raster_tasks); | 502 BuildTileTaskQueue(&queue, raster_tasks); |
| 511 timer_.NextLap(); | 503 timer_.NextLap(); |
| 512 } while (!timer_.HasTimeLimitExpired()); | 504 } while (!timer_.HasTimeLimitExpired()); |
| 513 | 505 |
| 514 perf_test::PrintResult("build_raster_task_queue", | 506 perf_test::PrintResult("build_raster_task_queue", |
| 515 "", | 507 "", |
| 516 test_name, | 508 test_name, |
| 517 timer_.LapsPerSecond(), | 509 timer_.LapsPerSecond(), |
| 518 "runs/s", | 510 "runs/s", |
| 519 true); | 511 true); |
| 520 } | 512 } |
| 521 }; | 513 }; |
| 522 | 514 |
| 523 TEST_F(RasterWorkerPoolCommonPerfTest, BuildRasterTaskQueue) { | 515 TEST_F(TileTaskWorkerPoolCommonPerfTest, BuildTileTaskQueue) { |
| 524 RunBuildRasterTaskQueueTest("1_0", 1, 0); | 516 RunBuildTileTaskQueueTest("1_0", 1, 0); |
| 525 RunBuildRasterTaskQueueTest("32_0", 32, 0); | 517 RunBuildTileTaskQueueTest("32_0", 32, 0); |
| 526 RunBuildRasterTaskQueueTest("1_1", 1, 1); | 518 RunBuildTileTaskQueueTest("1_1", 1, 1); |
| 527 RunBuildRasterTaskQueueTest("32_1", 32, 1); | 519 RunBuildTileTaskQueueTest("32_1", 32, 1); |
| 528 RunBuildRasterTaskQueueTest("1_4", 1, 4); | 520 RunBuildTileTaskQueueTest("1_4", 1, 4); |
| 529 RunBuildRasterTaskQueueTest("32_4", 32, 4); | 521 RunBuildTileTaskQueueTest("32_4", 32, 4); |
| 530 } | 522 } |
| 531 | 523 |
| 532 } // namespace | 524 } // namespace |
| 533 } // namespace cc | 525 } // namespace cc |
| OLD | NEW |