Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: cc/resources/raster_worker_pool_perftest.cc

Issue 171423015: cc: Improve RasterWorkerPool perftests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/time/time.h" 7 #include "base/time/time.h"
8 #include "cc/resources/direct_raster_worker_pool.h" 8 #include "cc/resources/direct_raster_worker_pool.h"
9 #include "cc/resources/image_raster_worker_pool.h" 9 #include "cc/resources/image_raster_worker_pool.h"
10 #include "cc/resources/pixel_buffer_raster_worker_pool.h" 10 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 GL_TEXTURE_2D) {} 118 GL_TEXTURE_2D) {}
119 }; 119 };
120 120
121 class PerfDirectRasterWorkerPoolImpl : public DirectRasterWorkerPool { 121 class PerfDirectRasterWorkerPoolImpl : public DirectRasterWorkerPool {
122 public: 122 public:
123 PerfDirectRasterWorkerPoolImpl(ResourceProvider* resource_provider, 123 PerfDirectRasterWorkerPoolImpl(ResourceProvider* resource_provider,
124 ContextProvider* context_provider) 124 ContextProvider* context_provider)
125 : DirectRasterWorkerPool(resource_provider, context_provider) {} 125 : DirectRasterWorkerPool(resource_provider, context_provider) {}
126 }; 126 };
127 127
128 class RasterWorkerPoolPerfTest 128 class RasterWorkerPoolPerfTestBase {
129 : public testing::TestWithParam<RasterWorkerPoolType>,
130 public RasterWorkerPoolClient {
131 public: 129 public:
132 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > 130 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> >
133 RasterTaskVector; 131 RasterTaskVector;
134 132
135 RasterWorkerPoolPerfTest() 133 RasterWorkerPoolPerfTestBase()
136 : context_provider_(TestContextProvider::Create()), 134 : context_provider_(TestContextProvider::Create()),
137 task_graph_runner_(new PerfTaskGraphRunnerImpl),
138 timer_(kWarmupRuns, 135 timer_(kWarmupRuns,
139 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), 136 base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
140 kTimeCheckInterval) { 137 kTimeCheckInterval) {
141 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); 138 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
142 CHECK(output_surface_->BindToClient(&output_surface_client_)); 139 CHECK(output_surface_->BindToClient(&output_surface_client_));
143 140
144 resource_provider_ = ResourceProvider::Create( 141 resource_provider_ = ResourceProvider::Create(
145 output_surface_.get(), NULL, 0, false, 1).Pass(); 142 output_surface_.get(), NULL, 0, false, 1).Pass();
143 }
144 virtual ~RasterWorkerPoolPerfTestBase() { resource_provider_.reset(); }
146 145
146 void CreateImageDecodeTasks(
147 unsigned num_image_decode_tasks,
148 internal::WorkerPoolTask::Vector* image_decode_tasks) {
149 for (unsigned i = 0; i < num_image_decode_tasks; ++i)
150 image_decode_tasks->push_back(new PerfWorkerPoolTaskImpl);
151 }
152
153 void CreateRasterTasks(
154 unsigned num_raster_tasks,
155 const internal::WorkerPoolTask::Vector& image_decode_tasks,
156 RasterTaskVector* raster_tasks) {
157 const gfx::Size size(1, 1);
158
159 for (unsigned i = 0; i < num_raster_tasks; ++i) {
160 scoped_ptr<ScopedResource> resource(
161 ScopedResource::Create(resource_provider_.get()));
162 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
163
164 internal::WorkerPoolTask::Vector dependencies = image_decode_tasks;
165 raster_tasks->push_back(
166 new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies));
167 }
168 }
169
170 void BuildRasterTaskQueue(RasterTaskQueue* queue,
171 const RasterTaskVector& raster_tasks) {
172 for (size_t i = 0u; i < raster_tasks.size(); ++i) {
173 bool required_for_activation = (i % 2) == 0;
174 queue->items.push_back(RasterTaskQueue::Item(raster_tasks[i].get(),
175 required_for_activation));
176 queue->required_for_activation_count += required_for_activation;
177 }
178 }
179
180 protected:
181 scoped_refptr<TestContextProvider> context_provider_;
182 FakeOutputSurfaceClient output_surface_client_;
183 scoped_ptr<FakeOutputSurface> output_surface_;
184 scoped_ptr<ResourceProvider> resource_provider_;
185 LapTimer timer_;
186 };
187
188 class RasterWorkerPoolPerfTest
189 : public RasterWorkerPoolPerfTestBase,
190 public testing::TestWithParam<RasterWorkerPoolType>,
191 public RasterWorkerPoolClient {
192 public:
193 RasterWorkerPoolPerfTest() : task_graph_runner_(new PerfTaskGraphRunnerImpl) {
147 switch (GetParam()) { 194 switch (GetParam()) {
148 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: 195 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER:
149 raster_worker_pool_.reset(new PerfPixelBufferRasterWorkerPoolImpl( 196 raster_worker_pool_.reset(new PerfPixelBufferRasterWorkerPoolImpl(
150 task_graph_runner_.get(), resource_provider_.get())); 197 task_graph_runner_.get(), resource_provider_.get()));
151 break; 198 break;
152 case RASTER_WORKER_POOL_TYPE_IMAGE: 199 case RASTER_WORKER_POOL_TYPE_IMAGE:
153 raster_worker_pool_.reset(new PerfImageRasterWorkerPoolImpl( 200 raster_worker_pool_.reset(new PerfImageRasterWorkerPoolImpl(
154 task_graph_runner_.get(), resource_provider_.get())); 201 task_graph_runner_.get(), resource_provider_.get()));
155 break; 202 break;
156 case RASTER_WORKER_POOL_TYPE_DIRECT: 203 case RASTER_WORKER_POOL_TYPE_DIRECT:
157 raster_worker_pool_.reset(new PerfDirectRasterWorkerPoolImpl( 204 raster_worker_pool_.reset(new PerfDirectRasterWorkerPoolImpl(
158 resource_provider_.get(), context_provider_)); 205 resource_provider_.get(), context_provider_));
159 break; 206 break;
160 } 207 }
161 208
162 DCHECK(raster_worker_pool_); 209 DCHECK(raster_worker_pool_);
163 raster_worker_pool_->SetClient(this); 210 raster_worker_pool_->SetClient(this);
164 } 211 }
165 virtual ~RasterWorkerPoolPerfTest() { resource_provider_.reset(); }
166 212
167 // Overridden from testing::Test: 213 // Overridden from testing::Test:
168 virtual void TearDown() OVERRIDE { 214 virtual void TearDown() OVERRIDE {
169 raster_worker_pool_->Shutdown(); 215 raster_worker_pool_->Shutdown();
170 raster_worker_pool_->CheckForCompletedTasks(); 216 raster_worker_pool_->CheckForCompletedTasks();
171 } 217 }
172 218
173 // Overriden from RasterWorkerPoolClient: 219 // Overriden from RasterWorkerPoolClient:
174 virtual bool ShouldForceTasksRequiredForActivationToComplete() 220 virtual bool ShouldForceTasksRequiredForActivationToComplete()
175 const OVERRIDE { 221 const OVERRIDE {
176 return false; 222 return false;
177 } 223 }
178 virtual void DidFinishRunningTasks() OVERRIDE { 224 virtual void DidFinishRunningTasks() OVERRIDE {
179 raster_worker_pool_->CheckForCompletedTasks(); 225 raster_worker_pool_->CheckForCompletedTasks();
180 base::MessageLoop::current()->Quit(); 226 base::MessageLoop::current()->Quit();
181 } 227 }
182 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} 228 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
183 229
184 void RunMessageLoopUntilAllTasksHaveCompleted() { 230 void RunMessageLoopUntilAllTasksHaveCompleted() {
185 while (task_graph_runner_->RunTaskForTesting()) 231 while (task_graph_runner_->RunTaskForTesting())
186 continue; 232 continue;
187 base::MessageLoop::current()->Run(); 233 base::MessageLoop::current()->Run();
188 } 234 }
189 235
190 void CreateImageDecodeTasks(
191 unsigned num_image_decode_tasks,
192 internal::WorkerPoolTask::Vector* image_decode_tasks) {
193 for (unsigned i = 0; i < num_image_decode_tasks; ++i)
194 image_decode_tasks->push_back(new PerfWorkerPoolTaskImpl);
195 }
196
197 void CreateRasterTasks(
198 unsigned num_raster_tasks,
199 const internal::WorkerPoolTask::Vector& image_decode_tasks,
200 RasterTaskVector* raster_tasks) {
201 const gfx::Size size(1, 1);
202
203 for (unsigned i = 0; i < num_raster_tasks; ++i) {
204 scoped_ptr<ScopedResource> resource(
205 ScopedResource::Create(resource_provider_.get()));
206 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
207
208 internal::WorkerPoolTask::Vector dependencies = image_decode_tasks;
209 raster_tasks->push_back(
210 new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies));
211 }
212 }
213
214 void BuildTaskQueue(RasterTaskQueue* queue,
215 const RasterTaskVector& raster_tasks) {
216 for (RasterTaskVector::const_iterator it = raster_tasks.begin();
217 it != raster_tasks.end();
218 ++it)
219 queue->items.push_back(RasterTaskQueue::Item(it->get(), false));
220 }
221
222 void RunScheduleTasksTest(const std::string& test_name, 236 void RunScheduleTasksTest(const std::string& test_name,
223 unsigned num_raster_tasks, 237 unsigned num_raster_tasks,
224 unsigned num_image_decode_tasks) { 238 unsigned num_image_decode_tasks) {
225 internal::WorkerPoolTask::Vector image_decode_tasks; 239 internal::WorkerPoolTask::Vector image_decode_tasks;
226 RasterTaskVector raster_tasks; 240 RasterTaskVector raster_tasks;
227 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); 241 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
228 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); 242 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
229 243
230 // Avoid unnecessary heap allocations by reusing the same queue. 244 // Avoid unnecessary heap allocations by reusing the same queue.
231 RasterTaskQueue queue; 245 RasterTaskQueue queue;
232 246
233 timer_.Reset(); 247 timer_.Reset();
234 do { 248 do {
235 queue.Reset(); 249 queue.Reset();
236 BuildTaskQueue(&queue, raster_tasks); 250 BuildRasterTaskQueue(&queue, raster_tasks);
237 raster_worker_pool_->ScheduleTasks(&queue); 251 raster_worker_pool_->ScheduleTasks(&queue);
238 raster_worker_pool_->CheckForCompletedTasks(); 252 raster_worker_pool_->CheckForCompletedTasks();
239 timer_.NextLap(); 253 timer_.NextLap();
240 } while (!timer_.HasTimeLimitExpired()); 254 } while (!timer_.HasTimeLimitExpired());
241 255
242 RasterTaskQueue empty; 256 RasterTaskQueue empty;
243 raster_worker_pool_->ScheduleTasks(&empty); 257 raster_worker_pool_->ScheduleTasks(&empty);
244 RunMessageLoopUntilAllTasksHaveCompleted(); 258 RunMessageLoopUntilAllTasksHaveCompleted();
245 259
246 perf_test::PrintResult("schedule_tasks", 260 perf_test::PrintResult("schedule_tasks",
(...skipping 16 matching lines...) Expand all
263 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); 277 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]);
264 } 278 }
265 279
266 // Avoid unnecessary heap allocations by reusing the same queue. 280 // Avoid unnecessary heap allocations by reusing the same queue.
267 RasterTaskQueue queue; 281 RasterTaskQueue queue;
268 282
269 size_t count = 0; 283 size_t count = 0;
270 timer_.Reset(); 284 timer_.Reset();
271 do { 285 do {
272 queue.Reset(); 286 queue.Reset();
273 BuildTaskQueue(&queue, raster_tasks[count % kNumVersions]); 287 BuildRasterTaskQueue(&queue, raster_tasks[count % kNumVersions]);
274 raster_worker_pool_->ScheduleTasks(&queue); 288 raster_worker_pool_->ScheduleTasks(&queue);
275 raster_worker_pool_->CheckForCompletedTasks(); 289 raster_worker_pool_->CheckForCompletedTasks();
276 ++count; 290 ++count;
277 timer_.NextLap(); 291 timer_.NextLap();
278 } while (!timer_.HasTimeLimitExpired()); 292 } while (!timer_.HasTimeLimitExpired());
279 293
280 RasterTaskQueue empty; 294 RasterTaskQueue empty;
281 raster_worker_pool_->ScheduleTasks(&empty); 295 raster_worker_pool_->ScheduleTasks(&empty);
282 RunMessageLoopUntilAllTasksHaveCompleted(); 296 RunMessageLoopUntilAllTasksHaveCompleted();
283 297
(...skipping 12 matching lines...) Expand all
296 RasterTaskVector raster_tasks; 310 RasterTaskVector raster_tasks;
297 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); 311 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
298 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); 312 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
299 313
300 // Avoid unnecessary heap allocations by reusing the same queue. 314 // Avoid unnecessary heap allocations by reusing the same queue.
301 RasterTaskQueue queue; 315 RasterTaskQueue queue;
302 316
303 timer_.Reset(); 317 timer_.Reset();
304 do { 318 do {
305 queue.Reset(); 319 queue.Reset();
306 BuildTaskQueue(&queue, raster_tasks); 320 BuildRasterTaskQueue(&queue, raster_tasks);
307 raster_worker_pool_->ScheduleTasks(&queue); 321 raster_worker_pool_->ScheduleTasks(&queue);
308 RunMessageLoopUntilAllTasksHaveCompleted(); 322 RunMessageLoopUntilAllTasksHaveCompleted();
309 timer_.NextLap(); 323 timer_.NextLap();
310 } while (!timer_.HasTimeLimitExpired()); 324 } while (!timer_.HasTimeLimitExpired());
311 325
312 RasterTaskQueue empty; 326 RasterTaskQueue empty;
313 raster_worker_pool_->ScheduleTasks(&empty); 327 raster_worker_pool_->ScheduleTasks(&empty);
314 RunMessageLoopUntilAllTasksHaveCompleted(); 328 RunMessageLoopUntilAllTasksHaveCompleted();
315 329
316 perf_test::PrintResult("schedule_and_execute_tasks", 330 perf_test::PrintResult("schedule_and_execute_tasks",
(...skipping 11 matching lines...) Expand all
328 return std::string("_pixel_raster_worker_pool"); 342 return std::string("_pixel_raster_worker_pool");
329 case RASTER_WORKER_POOL_TYPE_IMAGE: 343 case RASTER_WORKER_POOL_TYPE_IMAGE:
330 return std::string("_image_raster_worker_pool"); 344 return std::string("_image_raster_worker_pool");
331 case RASTER_WORKER_POOL_TYPE_DIRECT: 345 case RASTER_WORKER_POOL_TYPE_DIRECT:
332 return std::string("_direct_raster_worker_pool"); 346 return std::string("_direct_raster_worker_pool");
333 } 347 }
334 NOTREACHED(); 348 NOTREACHED();
335 return std::string(); 349 return std::string();
336 } 350 }
337 351
338 scoped_refptr<TestContextProvider> context_provider_;
339 FakeOutputSurfaceClient output_surface_client_;
340 scoped_ptr<FakeOutputSurface> output_surface_;
341 scoped_ptr<ResourceProvider> resource_provider_;
342 scoped_ptr<internal::TaskGraphRunner> task_graph_runner_; 352 scoped_ptr<internal::TaskGraphRunner> task_graph_runner_;
343 scoped_ptr<RasterWorkerPool> raster_worker_pool_; 353 scoped_ptr<RasterWorkerPool> raster_worker_pool_;
344 LapTimer timer_;
345 }; 354 };
346 355
347 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { 356 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) {
348 RunScheduleTasksTest("1_0", 1, 0); 357 RunScheduleTasksTest("1_0", 1, 0);
349 RunScheduleTasksTest("32_0", 32, 0); 358 RunScheduleTasksTest("32_0", 32, 0);
350 RunScheduleTasksTest("1_1", 1, 1); 359 RunScheduleTasksTest("1_1", 1, 1);
351 RunScheduleTasksTest("32_1", 32, 1); 360 RunScheduleTasksTest("32_1", 32, 1);
352 RunScheduleTasksTest("1_4", 1, 4); 361 RunScheduleTasksTest("1_4", 1, 4);
353 RunScheduleTasksTest("32_4", 32, 4); 362 RunScheduleTasksTest("32_4", 32, 4);
354 } 363 }
(...skipping 15 matching lines...) Expand all
370 RunScheduleAndExecuteTasksTest("1_4", 1, 4); 379 RunScheduleAndExecuteTasksTest("1_4", 1, 4);
371 RunScheduleAndExecuteTasksTest("32_4", 32, 4); 380 RunScheduleAndExecuteTasksTest("32_4", 32, 4);
372 } 381 }
373 382
374 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, 383 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests,
375 RasterWorkerPoolPerfTest, 384 RasterWorkerPoolPerfTest,
376 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, 385 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
377 RASTER_WORKER_POOL_TYPE_IMAGE, 386 RASTER_WORKER_POOL_TYPE_IMAGE,
378 RASTER_WORKER_POOL_TYPE_DIRECT)); 387 RASTER_WORKER_POOL_TYPE_DIRECT));
379 388
389 class RasterWorkerPoolCommonPerfTest : public RasterWorkerPoolPerfTestBase,
390 public testing::Test {
391 public:
392 void RunBuildRasterTaskQueueTest(const std::string& test_name,
393 unsigned num_raster_tasks,
394 unsigned num_image_decode_tasks) {
395 internal::WorkerPoolTask::Vector image_decode_tasks;
396 RasterTaskVector raster_tasks;
397 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
398 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
399
400 // Avoid unnecessary heap allocations by reusing the same queue.
401 RasterTaskQueue queue;
402
403 timer_.Reset();
404 do {
405 queue.Reset();
406 BuildRasterTaskQueue(&queue, raster_tasks);
407 timer_.NextLap();
408 } while (!timer_.HasTimeLimitExpired());
409
410 perf_test::PrintResult("build_raster_task_queue",
411 "",
412 test_name,
413 timer_.LapsPerSecond(),
414 "runs/s",
415 true);
416 }
417 };
418
419 TEST_F(RasterWorkerPoolCommonPerfTest, BuildRasterTaskQueue) {
420 RunBuildRasterTaskQueueTest("1_0", 1, 0);
421 RunBuildRasterTaskQueueTest("32_0", 32, 0);
422 RunBuildRasterTaskQueueTest("1_1", 1, 1);
423 RunBuildRasterTaskQueueTest("32_1", 32, 1);
424 RunBuildRasterTaskQueueTest("1_4", 1, 4);
425 RunBuildRasterTaskQueueTest("32_4", 32, 4);
426 }
427
380 } // namespace 428 } // namespace
381 } // namespace cc 429 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698