Index: cc/resources/raster_worker_pool_perftest.cc |
diff --git a/cc/resources/raster_worker_pool_perftest.cc b/cc/resources/raster_worker_pool_perftest.cc |
index f120ae41517db690b550c42af4cf81c1d2821229..dfd3955152ab47132a71a3c680dfff0e406fc406 100644 |
--- a/cc/resources/raster_worker_pool_perftest.cc |
+++ b/cc/resources/raster_worker_pool_perftest.cc |
@@ -125,16 +125,13 @@ class PerfDirectRasterWorkerPoolImpl : public DirectRasterWorkerPool { |
: DirectRasterWorkerPool(resource_provider, context_provider) {} |
}; |
-class RasterWorkerPoolPerfTest |
- : public testing::TestWithParam<RasterWorkerPoolType>, |
- public RasterWorkerPoolClient { |
+class RasterWorkerPoolPerfTestBase { |
public: |
typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > |
RasterTaskVector; |
- RasterWorkerPoolPerfTest() |
+ RasterWorkerPoolPerfTestBase() |
: context_provider_(TestContextProvider::Create()), |
- task_graph_runner_(new PerfTaskGraphRunnerImpl), |
timer_(kWarmupRuns, |
base::TimeDelta::FromMilliseconds(kTimeLimitMillis), |
kTimeCheckInterval) { |
@@ -143,7 +140,57 @@ class RasterWorkerPoolPerfTest |
resource_provider_ = ResourceProvider::Create( |
output_surface_.get(), NULL, 0, false, 1).Pass(); |
+ } |
+ virtual ~RasterWorkerPoolPerfTestBase() { resource_provider_.reset(); } |
+ |
+ void CreateImageDecodeTasks( |
+ unsigned num_image_decode_tasks, |
+ internal::WorkerPoolTask::Vector* image_decode_tasks) { |
+ for (unsigned i = 0; i < num_image_decode_tasks; ++i) |
+ image_decode_tasks->push_back(new PerfWorkerPoolTaskImpl); |
+ } |
+ |
+ void CreateRasterTasks( |
+ unsigned num_raster_tasks, |
+ const internal::WorkerPoolTask::Vector& image_decode_tasks, |
+ RasterTaskVector* raster_tasks) { |
+ const gfx::Size size(1, 1); |
+ |
+ for (unsigned i = 0; i < num_raster_tasks; ++i) { |
+ scoped_ptr<ScopedResource> resource( |
+ ScopedResource::Create(resource_provider_.get())); |
+ resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
+ |
+ internal::WorkerPoolTask::Vector dependencies = image_decode_tasks; |
+ raster_tasks->push_back( |
+ new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies)); |
+ } |
+ } |
+ |
+ void BuildRasterTaskQueue(RasterTaskQueue* queue, |
+ const RasterTaskVector& raster_tasks) { |
+ for (size_t i = 0u; i < raster_tasks.size(); ++i) { |
+ bool required_for_activation = (i % 2) == 0; |
+ queue->items.push_back(RasterTaskQueue::Item(raster_tasks[i].get(), |
+ required_for_activation)); |
+ queue->required_for_activation_count += required_for_activation; |
+ } |
+ } |
+ |
+ protected: |
+ scoped_refptr<TestContextProvider> context_provider_; |
+ FakeOutputSurfaceClient output_surface_client_; |
+ scoped_ptr<FakeOutputSurface> output_surface_; |
+ scoped_ptr<ResourceProvider> resource_provider_; |
+ LapTimer timer_; |
+}; |
+class RasterWorkerPoolPerfTest |
+ : public RasterWorkerPoolPerfTestBase, |
+ public testing::TestWithParam<RasterWorkerPoolType>, |
+ public RasterWorkerPoolClient { |
+ public: |
+ RasterWorkerPoolPerfTest() : task_graph_runner_(new PerfTaskGraphRunnerImpl) { |
switch (GetParam()) { |
case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: |
raster_worker_pool_.reset(new PerfPixelBufferRasterWorkerPoolImpl( |
@@ -162,7 +209,6 @@ class RasterWorkerPoolPerfTest |
DCHECK(raster_worker_pool_); |
raster_worker_pool_->SetClient(this); |
} |
- virtual ~RasterWorkerPoolPerfTest() { resource_provider_.reset(); } |
// Overridden from testing::Test: |
virtual void TearDown() OVERRIDE { |
@@ -187,38 +233,6 @@ class RasterWorkerPoolPerfTest |
base::MessageLoop::current()->Run(); |
} |
- void CreateImageDecodeTasks( |
- unsigned num_image_decode_tasks, |
- internal::WorkerPoolTask::Vector* image_decode_tasks) { |
- for (unsigned i = 0; i < num_image_decode_tasks; ++i) |
- image_decode_tasks->push_back(new PerfWorkerPoolTaskImpl); |
- } |
- |
- void CreateRasterTasks( |
- unsigned num_raster_tasks, |
- const internal::WorkerPoolTask::Vector& image_decode_tasks, |
- RasterTaskVector* raster_tasks) { |
- const gfx::Size size(1, 1); |
- |
- for (unsigned i = 0; i < num_raster_tasks; ++i) { |
- scoped_ptr<ScopedResource> resource( |
- ScopedResource::Create(resource_provider_.get())); |
- resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
- |
- internal::WorkerPoolTask::Vector dependencies = image_decode_tasks; |
- raster_tasks->push_back( |
- new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies)); |
- } |
- } |
- |
- void BuildTaskQueue(RasterTaskQueue* queue, |
- const RasterTaskVector& raster_tasks) { |
- for (RasterTaskVector::const_iterator it = raster_tasks.begin(); |
- it != raster_tasks.end(); |
- ++it) |
- queue->items.push_back(RasterTaskQueue::Item(it->get(), false)); |
- } |
- |
void RunScheduleTasksTest(const std::string& test_name, |
unsigned num_raster_tasks, |
unsigned num_image_decode_tasks) { |
@@ -233,7 +247,7 @@ class RasterWorkerPoolPerfTest |
timer_.Reset(); |
do { |
queue.Reset(); |
- BuildTaskQueue(&queue, raster_tasks); |
+ BuildRasterTaskQueue(&queue, raster_tasks); |
raster_worker_pool_->ScheduleTasks(&queue); |
raster_worker_pool_->CheckForCompletedTasks(); |
timer_.NextLap(); |
@@ -270,7 +284,7 @@ class RasterWorkerPoolPerfTest |
timer_.Reset(); |
do { |
queue.Reset(); |
- BuildTaskQueue(&queue, raster_tasks[count % kNumVersions]); |
+ BuildRasterTaskQueue(&queue, raster_tasks[count % kNumVersions]); |
raster_worker_pool_->ScheduleTasks(&queue); |
raster_worker_pool_->CheckForCompletedTasks(); |
++count; |
@@ -303,7 +317,7 @@ class RasterWorkerPoolPerfTest |
timer_.Reset(); |
do { |
queue.Reset(); |
- BuildTaskQueue(&queue, raster_tasks); |
+ BuildRasterTaskQueue(&queue, raster_tasks); |
raster_worker_pool_->ScheduleTasks(&queue); |
RunMessageLoopUntilAllTasksHaveCompleted(); |
timer_.NextLap(); |
@@ -335,13 +349,8 @@ class RasterWorkerPoolPerfTest |
return std::string(); |
} |
- scoped_refptr<TestContextProvider> context_provider_; |
- FakeOutputSurfaceClient output_surface_client_; |
- scoped_ptr<FakeOutputSurface> output_surface_; |
- scoped_ptr<ResourceProvider> resource_provider_; |
scoped_ptr<internal::TaskGraphRunner> task_graph_runner_; |
scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
- LapTimer timer_; |
}; |
TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { |
@@ -377,5 +386,44 @@ INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, |
RASTER_WORKER_POOL_TYPE_IMAGE, |
RASTER_WORKER_POOL_TYPE_DIRECT)); |
+class RasterWorkerPoolCommonPerfTest : public RasterWorkerPoolPerfTestBase, |
+ public testing::Test { |
+ public: |
+ void RunBuildRasterTaskQueueTest(const std::string& test_name, |
+ unsigned num_raster_tasks, |
+ unsigned num_image_decode_tasks) { |
+ internal::WorkerPoolTask::Vector image_decode_tasks; |
+ RasterTaskVector raster_tasks; |
+ CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
+ CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
+ |
+ // Avoid unnecessary heap allocations by reusing the same queue. |
+ RasterTaskQueue queue; |
+ |
+ timer_.Reset(); |
+ do { |
+ queue.Reset(); |
+ BuildRasterTaskQueue(&queue, raster_tasks); |
+ timer_.NextLap(); |
+ } while (!timer_.HasTimeLimitExpired()); |
+ |
+ perf_test::PrintResult("build_raster_task_queue", |
+ "", |
+ test_name, |
+ timer_.LapsPerSecond(), |
+ "runs/s", |
+ true); |
+ } |
+}; |
+ |
+TEST_F(RasterWorkerPoolCommonPerfTest, BuildRasterTaskQueue) { |
+ RunBuildRasterTaskQueueTest("1_0", 1, 0); |
+ RunBuildRasterTaskQueueTest("32_0", 32, 0); |
+ RunBuildRasterTaskQueueTest("1_1", 1, 1); |
+ RunBuildRasterTaskQueueTest("32_1", 32, 1); |
+ RunBuildRasterTaskQueueTest("1_4", 1, 4); |
+ RunBuildRasterTaskQueueTest("32_4", 32, 4); |
+} |
+ |
} // namespace |
} // namespace cc |