| 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 703a95da911ee4be93a66461d4e5943306761386..f8d0f8d779bebdd539b83c9246447028d83d6599 100644
|
| --- a/cc/resources/raster_worker_pool_perftest.cc
|
| +++ b/cc/resources/raster_worker_pool_perftest.cc
|
| @@ -5,6 +5,7 @@
|
| #include "cc/resources/raster_worker_pool.h"
|
|
|
| #include "base/time/time.h"
|
| +#include "cc/resources/direct_raster_worker_pool.h"
|
| #include "cc/resources/image_raster_worker_pool.h"
|
| #include "cc/resources/pixel_buffer_raster_worker_pool.h"
|
| #include "cc/resources/resource_provider.h"
|
| @@ -22,7 +23,8 @@ namespace {
|
|
|
| enum RasterWorkerPoolType {
|
| RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
|
| - RASTER_WORKER_POOL_TYPE_IMAGE
|
| + RASTER_WORKER_POOL_TYPE_IMAGE,
|
| + RASTER_WORKER_POOL_TYPE_DIRECT
|
| };
|
|
|
| static const int kTimeLimitMillis = 2000;
|
| @@ -39,6 +41,7 @@ class PerfWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
| // Overridden from internal::WorkerPoolTask:
|
| virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client)
|
| OVERRIDE {}
|
| + virtual void RunOnOriginThread() OVERRIDE {}
|
| virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client)
|
| OVERRIDE {}
|
| virtual void RunReplyOnOriginThread() OVERRIDE { Reset(); }
|
| @@ -58,8 +61,8 @@ class PerfWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
| class PerfRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| public:
|
| PerfRasterWorkerPoolTaskImpl(scoped_ptr<ScopedResource> resource,
|
| - internal::Task::Vector* dependencies)
|
| - : internal::RasterWorkerPoolTask(resource.get(), dependencies, false),
|
| + internal::WorkerPoolTask::Vector* dependencies)
|
| + : internal::RasterWorkerPoolTask(resource.get(), dependencies),
|
| resource_(resource.Pass()) {}
|
|
|
| // Overridden from internal::Task:
|
| @@ -70,16 +73,13 @@ class PerfRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| OVERRIDE {
|
| client->AcquireCanvasForRaster(this);
|
| }
|
| + virtual void RunOnOriginThread() OVERRIDE {}
|
| virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client)
|
| OVERRIDE {
|
| client->OnRasterCompleted(this, PicturePileImpl::Analysis());
|
| }
|
| virtual void RunReplyOnOriginThread() OVERRIDE { Reset(); }
|
|
|
| - // Overridden from internal::RasterWorkerPoolTask:
|
| - virtual void RunOnOriginThread(ResourceProvider* resource_provider,
|
| - ContextProvider* context_provider) OVERRIDE {}
|
| -
|
| void Reset() {
|
| did_run_ = false;
|
| did_complete_ = false;
|
| @@ -106,7 +106,6 @@ class PerfPixelBufferRasterWorkerPoolImpl : public PixelBufferRasterWorkerPool {
|
| ResourceProvider* resource_provider)
|
| : PixelBufferRasterWorkerPool(task_graph_runner,
|
| resource_provider,
|
| - NULL,
|
| std::numeric_limits<size_t>::max()) {}
|
| };
|
|
|
| @@ -116,49 +115,22 @@ class PerfImageRasterWorkerPoolImpl : public ImageRasterWorkerPool {
|
| ResourceProvider* resource_provider)
|
| : ImageRasterWorkerPool(task_graph_runner,
|
| resource_provider,
|
| - NULL,
|
| GL_TEXTURE_2D) {}
|
| };
|
|
|
| +class PerfDirectRasterWorkerPoolImpl : public DirectRasterWorkerPool {
|
| + public:
|
| + PerfDirectRasterWorkerPoolImpl(ResourceProvider* resource_provider,
|
| + ContextProvider* context_provider)
|
| + : DirectRasterWorkerPool(resource_provider, context_provider) {}
|
| +};
|
| +
|
| class RasterWorkerPoolPerfTest
|
| : public testing::TestWithParam<RasterWorkerPoolType>,
|
| public RasterWorkerPoolClient {
|
| public:
|
| - class Task : public RasterWorkerPool::Task {
|
| - public:
|
| - typedef std::vector<Task> Vector;
|
| -
|
| - static Task Create() { return Task(new PerfWorkerPoolTaskImpl); }
|
| -
|
| - void AppendTo(internal::Task::Vector* dependencies) const {
|
| - dependencies->push_back(internal_);
|
| - }
|
| -
|
| - private:
|
| - explicit Task(internal::WorkerPoolTask* task)
|
| - : RasterWorkerPool::Task(task) {}
|
| - };
|
| -
|
| - class RasterTask : public RasterWorkerPool::RasterTask {
|
| - public:
|
| - typedef std::vector<RasterTask> Vector;
|
| -
|
| - static RasterTask Create(scoped_ptr<ScopedResource> resource,
|
| - const Task::Vector& image_decode_tasks) {
|
| - internal::Task::Vector dependencies;
|
| - for (Task::Vector::const_iterator it = image_decode_tasks.begin();
|
| - it != image_decode_tasks.end();
|
| - ++it)
|
| - it->AppendTo(&dependencies);
|
| -
|
| - return RasterTask(
|
| - new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies));
|
| - }
|
| -
|
| - private:
|
| - explicit RasterTask(internal::RasterWorkerPoolTask* task)
|
| - : RasterWorkerPool::RasterTask(task) {}
|
| - };
|
| + typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> >
|
| + RasterTaskVector;
|
|
|
| RasterWorkerPoolPerfTest()
|
| : context_provider_(TestContextProvider::Create()),
|
| @@ -181,6 +153,10 @@ class RasterWorkerPoolPerfTest
|
| raster_worker_pool_.reset(new PerfImageRasterWorkerPoolImpl(
|
| task_graph_runner_.get(), resource_provider_.get()));
|
| break;
|
| + case RASTER_WORKER_POOL_TYPE_DIRECT:
|
| + raster_worker_pool_.reset(new PerfDirectRasterWorkerPoolImpl(
|
| + resource_provider_.get(), context_provider_));
|
| + break;
|
| }
|
|
|
| DCHECK(raster_worker_pool_);
|
| @@ -199,18 +175,29 @@ class RasterWorkerPoolPerfTest
|
| const OVERRIDE {
|
| return false;
|
| }
|
| - virtual void DidFinishRunningTasks() OVERRIDE {}
|
| + virtual void DidFinishRunningTasks() OVERRIDE {
|
| + raster_worker_pool_->CheckForCompletedTasks();
|
| + base::MessageLoop::current()->Quit();
|
| + }
|
| virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
|
|
|
| - void CreateImageDecodeTasks(unsigned num_image_decode_tasks,
|
| - Task::Vector* image_decode_tasks) {
|
| + void RunMessageLoopUntilAllTasksHaveCompleted() {
|
| + while (task_graph_runner_->RunTaskForTesting())
|
| + continue;
|
| + 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(Task::Create());
|
| + image_decode_tasks->push_back(new PerfWorkerPoolTaskImpl);
|
| }
|
|
|
| - void CreateRasterTasks(unsigned num_raster_tasks,
|
| - const Task::Vector& image_decode_tasks,
|
| - RasterTask::Vector* raster_tasks) {
|
| + 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) {
|
| @@ -218,42 +205,43 @@ class RasterWorkerPoolPerfTest
|
| ScopedResource::Create(resource_provider_.get()));
|
| resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
|
|
|
| + internal::WorkerPoolTask::Vector dependencies = image_decode_tasks;
|
| raster_tasks->push_back(
|
| - RasterTask::Create(resource.Pass(), image_decode_tasks));
|
| + new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies));
|
| }
|
| }
|
|
|
| - void AppendRasterTasks(RasterWorkerPool::RasterTask::Queue* tasks,
|
| - const RasterTask::Vector& raster_tasks) {
|
| - for (RasterTask::Vector::const_iterator it = raster_tasks.begin();
|
| + void BuildTaskQueue(RasterTaskQueue* queue,
|
| + const RasterTaskVector& raster_tasks) {
|
| + for (RasterTaskVector::const_iterator it = raster_tasks.begin();
|
| it != raster_tasks.end();
|
| ++it)
|
| - tasks->Append(*it, false);
|
| + queue->tasks.push_back(RasterTaskQueue::Task(it->get(), false));
|
| }
|
|
|
| void RunScheduleTasksTest(const std::string& test_name,
|
| unsigned num_raster_tasks,
|
| unsigned num_image_decode_tasks) {
|
| - Task::Vector image_decode_tasks;
|
| - RasterTask::Vector raster_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.
|
| - RasterWorkerPool::RasterTask::Queue tasks;
|
| + RasterTaskQueue queue;
|
|
|
| timer_.Reset();
|
| do {
|
| - tasks.Reset();
|
| - AppendRasterTasks(&tasks, raster_tasks);
|
| - raster_worker_pool_->ScheduleTasks(&tasks);
|
| + queue.Reset();
|
| + BuildTaskQueue(&queue, raster_tasks);
|
| + raster_worker_pool_->ScheduleTasks(&queue);
|
| raster_worker_pool_->CheckForCompletedTasks();
|
| timer_.NextLap();
|
| } while (!timer_.HasTimeLimitExpired());
|
|
|
| - RasterWorkerPool::RasterTask::Queue empty;
|
| + RasterTaskQueue empty;
|
| raster_worker_pool_->ScheduleTasks(&empty);
|
| - raster_worker_pool_->CheckForCompletedTasks();
|
| + RunMessageLoopUntilAllTasksHaveCompleted();
|
|
|
| perf_test::PrintResult("schedule_tasks",
|
| "",
|
| @@ -267,8 +255,8 @@ class RasterWorkerPoolPerfTest
|
| unsigned num_raster_tasks,
|
| unsigned num_image_decode_tasks) {
|
| const size_t kNumVersions = 2;
|
| - Task::Vector image_decode_tasks[kNumVersions];
|
| - RasterTask::Vector raster_tasks[kNumVersions];
|
| + internal::WorkerPoolTask::Vector image_decode_tasks[kNumVersions];
|
| + RasterTaskVector raster_tasks[kNumVersions];
|
| for (size_t i = 0; i < kNumVersions; ++i) {
|
| CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]);
|
| CreateRasterTasks(
|
| @@ -276,22 +264,22 @@ class RasterWorkerPoolPerfTest
|
| }
|
|
|
| // Avoid unnecessary heap allocations by reusing the same queue.
|
| - RasterWorkerPool::RasterTask::Queue tasks;
|
| + RasterTaskQueue queue;
|
|
|
| size_t count = 0;
|
| timer_.Reset();
|
| do {
|
| - tasks.Reset();
|
| - AppendRasterTasks(&tasks, raster_tasks[count % kNumVersions]);
|
| - raster_worker_pool_->ScheduleTasks(&tasks);
|
| + queue.Reset();
|
| + BuildTaskQueue(&queue, raster_tasks[count % kNumVersions]);
|
| + raster_worker_pool_->ScheduleTasks(&queue);
|
| raster_worker_pool_->CheckForCompletedTasks();
|
| ++count;
|
| timer_.NextLap();
|
| } while (!timer_.HasTimeLimitExpired());
|
|
|
| - RasterWorkerPool::RasterTask::Queue empty;
|
| + RasterTaskQueue empty;
|
| raster_worker_pool_->ScheduleTasks(&empty);
|
| - raster_worker_pool_->CheckForCompletedTasks();
|
| + RunMessageLoopUntilAllTasksHaveCompleted();
|
|
|
| perf_test::PrintResult("schedule_alternate_tasks",
|
| "",
|
| @@ -304,28 +292,26 @@ class RasterWorkerPoolPerfTest
|
| void RunScheduleAndExecuteTasksTest(const std::string& test_name,
|
| unsigned num_raster_tasks,
|
| unsigned num_image_decode_tasks) {
|
| - Task::Vector image_decode_tasks;
|
| - RasterTask::Vector raster_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.
|
| - RasterWorkerPool::RasterTask::Queue tasks;
|
| + RasterTaskQueue queue;
|
|
|
| timer_.Reset();
|
| do {
|
| - tasks.Reset();
|
| - AppendRasterTasks(&tasks, raster_tasks);
|
| - raster_worker_pool_->ScheduleTasks(&tasks);
|
| - while (task_graph_runner_->RunTaskForTesting())
|
| - continue;
|
| - raster_worker_pool_->CheckForCompletedTasks();
|
| + queue.Reset();
|
| + BuildTaskQueue(&queue, raster_tasks);
|
| + raster_worker_pool_->ScheduleTasks(&queue);
|
| + RunMessageLoopUntilAllTasksHaveCompleted();
|
| timer_.NextLap();
|
| } while (!timer_.HasTimeLimitExpired());
|
|
|
| - RasterWorkerPool::RasterTask::Queue empty;
|
| + RasterTaskQueue empty;
|
| raster_worker_pool_->ScheduleTasks(&empty);
|
| - raster_worker_pool_->CheckForCompletedTasks();
|
| + RunMessageLoopUntilAllTasksHaveCompleted();
|
|
|
| perf_test::PrintResult("schedule_and_execute_tasks",
|
| "",
|
| @@ -342,7 +328,6 @@ class RasterWorkerPoolPerfTest
|
| scoped_ptr<ResourceProvider> resource_provider_;
|
| scoped_ptr<internal::TaskGraphRunner> task_graph_runner_;
|
| scoped_ptr<RasterWorkerPool> raster_worker_pool_;
|
| - std::vector<RasterWorkerPool::RasterTask> tasks_;
|
| LapTimer timer_;
|
| };
|
|
|
| @@ -376,7 +361,8 @@ TEST_P(RasterWorkerPoolPerfTest, ScheduleAndExecuteTasks) {
|
| INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests,
|
| RasterWorkerPoolPerfTest,
|
| ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
|
| - RASTER_WORKER_POOL_TYPE_IMAGE));
|
| + RASTER_WORKER_POOL_TYPE_IMAGE,
|
| + RASTER_WORKER_POOL_TYPE_DIRECT));
|
|
|
| } // namespace
|
| } // namespace cc
|
|
|