| 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/time/time.h" | 7 #include "base/time/time.h" |
| 8 #include "cc/resources/direct_raster_worker_pool.h" |
| 8 #include "cc/resources/image_raster_worker_pool.h" | 9 #include "cc/resources/image_raster_worker_pool.h" |
| 9 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 10 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| 10 #include "cc/resources/resource_provider.h" | 11 #include "cc/resources/resource_provider.h" |
| 11 #include "cc/resources/scoped_resource.h" | 12 #include "cc/resources/scoped_resource.h" |
| 12 #include "cc/test/fake_output_surface.h" | 13 #include "cc/test/fake_output_surface.h" |
| 13 #include "cc/test/fake_output_surface_client.h" | 14 #include "cc/test/fake_output_surface_client.h" |
| 14 #include "cc/test/lap_timer.h" | 15 #include "cc/test/lap_timer.h" |
| 15 #include "cc/test/test_web_graphics_context_3d.h" | 16 #include "cc/test/test_web_graphics_context_3d.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "testing/perf/perf_test.h" | 18 #include "testing/perf/perf_test.h" |
| 18 #include "third_party/khronos/GLES2/gl2.h" | 19 #include "third_party/khronos/GLES2/gl2.h" |
| 19 | 20 |
| 20 namespace cc { | 21 namespace cc { |
| 21 namespace { | 22 namespace { |
| 22 | 23 |
| 23 enum RasterWorkerPoolType { | 24 enum RasterWorkerPoolType { |
| 24 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 25 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
| 25 RASTER_WORKER_POOL_TYPE_IMAGE | 26 RASTER_WORKER_POOL_TYPE_IMAGE, |
| 27 RASTER_WORKER_POOL_TYPE_DIRECT |
| 26 }; | 28 }; |
| 27 | 29 |
| 28 static const int kTimeLimitMillis = 2000; | 30 static const int kTimeLimitMillis = 2000; |
| 29 static const int kWarmupRuns = 5; | 31 static const int kWarmupRuns = 5; |
| 30 static const int kTimeCheckInterval = 10; | 32 static const int kTimeCheckInterval = 10; |
| 31 | 33 |
| 32 class PerfWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 34 class PerfWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 33 public: | 35 public: |
| 34 PerfWorkerPoolTaskImpl() {} | 36 PerfWorkerPoolTaskImpl() {} |
| 35 | 37 |
| 36 // Overridden from internal::Task: | 38 // Overridden from internal::Task: |
| 37 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {} | 39 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {} |
| 38 | 40 |
| 39 // Overridden from internal::WorkerPoolTask: | 41 // Overridden from internal::WorkerPoolTask: |
| 40 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 42 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) |
| 41 OVERRIDE {} | 43 OVERRIDE {} |
| 44 virtual void RunOnOriginThread() OVERRIDE {} |
| 42 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 45 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) |
| 43 OVERRIDE {} | 46 OVERRIDE {} |
| 44 virtual void RunReplyOnOriginThread() OVERRIDE { Reset(); } | 47 virtual void RunReplyOnOriginThread() OVERRIDE { Reset(); } |
| 45 | 48 |
| 46 void Reset() { | 49 void Reset() { |
| 47 did_run_ = false; | 50 did_run_ = false; |
| 48 did_complete_ = false; | 51 did_complete_ = false; |
| 49 } | 52 } |
| 50 | 53 |
| 51 protected: | 54 protected: |
| 52 virtual ~PerfWorkerPoolTaskImpl() {} | 55 virtual ~PerfWorkerPoolTaskImpl() {} |
| 53 | 56 |
| 54 private: | 57 private: |
| 55 DISALLOW_COPY_AND_ASSIGN(PerfWorkerPoolTaskImpl); | 58 DISALLOW_COPY_AND_ASSIGN(PerfWorkerPoolTaskImpl); |
| 56 }; | 59 }; |
| 57 | 60 |
| 58 class PerfRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 61 class PerfRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
| 59 public: | 62 public: |
| 60 PerfRasterWorkerPoolTaskImpl(scoped_ptr<ScopedResource> resource, | 63 PerfRasterWorkerPoolTaskImpl(scoped_ptr<ScopedResource> resource, |
| 61 internal::Task::Vector* dependencies) | 64 internal::WorkerPoolTask::Vector* dependencies) |
| 62 : internal::RasterWorkerPoolTask(resource.get(), dependencies, false), | 65 : internal::RasterWorkerPoolTask(resource.get(), dependencies), |
| 63 resource_(resource.Pass()) {} | 66 resource_(resource.Pass()) {} |
| 64 | 67 |
| 65 // Overridden from internal::Task: | 68 // Overridden from internal::Task: |
| 66 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {} | 69 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {} |
| 67 | 70 |
| 68 // Overridden from internal::WorkerPoolTask: | 71 // Overridden from internal::WorkerPoolTask: |
| 69 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 72 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) |
| 70 OVERRIDE { | 73 OVERRIDE { |
| 71 client->AcquireCanvasForRaster(this); | 74 client->AcquireCanvasForRaster(this); |
| 72 } | 75 } |
| 76 virtual void RunOnOriginThread() OVERRIDE {} |
| 73 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 77 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) |
| 74 OVERRIDE { | 78 OVERRIDE { |
| 75 client->OnRasterCompleted(this, PicturePileImpl::Analysis()); | 79 client->OnRasterCompleted(this, PicturePileImpl::Analysis()); |
| 76 } | 80 } |
| 77 virtual void RunReplyOnOriginThread() OVERRIDE { Reset(); } | 81 virtual void RunReplyOnOriginThread() OVERRIDE { Reset(); } |
| 78 | 82 |
| 79 // Overridden from internal::RasterWorkerPoolTask: | |
| 80 virtual void RunOnOriginThread(ResourceProvider* resource_provider, | |
| 81 ContextProvider* context_provider) OVERRIDE {} | |
| 82 | |
| 83 void Reset() { | 83 void Reset() { |
| 84 did_run_ = false; | 84 did_run_ = false; |
| 85 did_complete_ = false; | 85 did_complete_ = false; |
| 86 } | 86 } |
| 87 | 87 |
| 88 protected: | 88 protected: |
| 89 virtual ~PerfRasterWorkerPoolTaskImpl() {} | 89 virtual ~PerfRasterWorkerPoolTaskImpl() {} |
| 90 | 90 |
| 91 private: | 91 private: |
| 92 scoped_ptr<ScopedResource> resource_; | 92 scoped_ptr<ScopedResource> resource_; |
| 93 | 93 |
| 94 DISALLOW_COPY_AND_ASSIGN(PerfRasterWorkerPoolTaskImpl); | 94 DISALLOW_COPY_AND_ASSIGN(PerfRasterWorkerPoolTaskImpl); |
| 95 }; | 95 }; |
| 96 | 96 |
| 97 class PerfTaskGraphRunnerImpl : public internal::TaskGraphRunner { | 97 class PerfTaskGraphRunnerImpl : public internal::TaskGraphRunner { |
| 98 public: | 98 public: |
| 99 PerfTaskGraphRunnerImpl() : internal::TaskGraphRunner(0, "Perf") {} | 99 PerfTaskGraphRunnerImpl() : internal::TaskGraphRunner(0, "Perf") {} |
| 100 }; | 100 }; |
| 101 | 101 |
| 102 class PerfPixelBufferRasterWorkerPoolImpl : public PixelBufferRasterWorkerPool { | 102 class PerfPixelBufferRasterWorkerPoolImpl : public PixelBufferRasterWorkerPool { |
| 103 public: | 103 public: |
| 104 PerfPixelBufferRasterWorkerPoolImpl( | 104 PerfPixelBufferRasterWorkerPoolImpl( |
| 105 internal::TaskGraphRunner* task_graph_runner, | 105 internal::TaskGraphRunner* task_graph_runner, |
| 106 ResourceProvider* resource_provider) | 106 ResourceProvider* resource_provider) |
| 107 : PixelBufferRasterWorkerPool(task_graph_runner, | 107 : PixelBufferRasterWorkerPool(task_graph_runner, |
| 108 resource_provider, | 108 resource_provider, |
| 109 NULL, | |
| 110 std::numeric_limits<size_t>::max()) {} | 109 std::numeric_limits<size_t>::max()) {} |
| 111 }; | 110 }; |
| 112 | 111 |
| 113 class PerfImageRasterWorkerPoolImpl : public ImageRasterWorkerPool { | 112 class PerfImageRasterWorkerPoolImpl : public ImageRasterWorkerPool { |
| 114 public: | 113 public: |
| 115 PerfImageRasterWorkerPoolImpl(internal::TaskGraphRunner* task_graph_runner, | 114 PerfImageRasterWorkerPoolImpl(internal::TaskGraphRunner* task_graph_runner, |
| 116 ResourceProvider* resource_provider) | 115 ResourceProvider* resource_provider) |
| 117 : ImageRasterWorkerPool(task_graph_runner, | 116 : ImageRasterWorkerPool(task_graph_runner, |
| 118 resource_provider, | 117 resource_provider, |
| 119 NULL, | |
| 120 GL_TEXTURE_2D) {} | 118 GL_TEXTURE_2D) {} |
| 121 }; | 119 }; |
| 122 | 120 |
| 121 class PerfDirectRasterWorkerPoolImpl : public DirectRasterWorkerPool { |
| 122 public: |
| 123 PerfDirectRasterWorkerPoolImpl(ResourceProvider* resource_provider, |
| 124 ContextProvider* context_provider) |
| 125 : DirectRasterWorkerPool(resource_provider, context_provider) {} |
| 126 }; |
| 127 |
| 123 class RasterWorkerPoolPerfTest | 128 class RasterWorkerPoolPerfTest |
| 124 : public testing::TestWithParam<RasterWorkerPoolType>, | 129 : public testing::TestWithParam<RasterWorkerPoolType>, |
| 125 public RasterWorkerPoolClient { | 130 public RasterWorkerPoolClient { |
| 126 public: | 131 public: |
| 127 class Task : public RasterWorkerPool::Task { | 132 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > |
| 128 public: | 133 RasterTaskVector; |
| 129 typedef std::vector<Task> Vector; | |
| 130 | |
| 131 static Task Create() { return Task(new PerfWorkerPoolTaskImpl); } | |
| 132 | |
| 133 void AppendTo(internal::Task::Vector* dependencies) const { | |
| 134 dependencies->push_back(internal_); | |
| 135 } | |
| 136 | |
| 137 private: | |
| 138 explicit Task(internal::WorkerPoolTask* task) | |
| 139 : RasterWorkerPool::Task(task) {} | |
| 140 }; | |
| 141 | |
| 142 class RasterTask : public RasterWorkerPool::RasterTask { | |
| 143 public: | |
| 144 typedef std::vector<RasterTask> Vector; | |
| 145 | |
| 146 static RasterTask Create(scoped_ptr<ScopedResource> resource, | |
| 147 const Task::Vector& image_decode_tasks) { | |
| 148 internal::Task::Vector dependencies; | |
| 149 for (Task::Vector::const_iterator it = image_decode_tasks.begin(); | |
| 150 it != image_decode_tasks.end(); | |
| 151 ++it) | |
| 152 it->AppendTo(&dependencies); | |
| 153 | |
| 154 return RasterTask( | |
| 155 new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies)); | |
| 156 } | |
| 157 | |
| 158 private: | |
| 159 explicit RasterTask(internal::RasterWorkerPoolTask* task) | |
| 160 : RasterWorkerPool::RasterTask(task) {} | |
| 161 }; | |
| 162 | 134 |
| 163 RasterWorkerPoolPerfTest() | 135 RasterWorkerPoolPerfTest() |
| 164 : context_provider_(TestContextProvider::Create()), | 136 : context_provider_(TestContextProvider::Create()), |
| 165 task_graph_runner_(new PerfTaskGraphRunnerImpl), | 137 task_graph_runner_(new PerfTaskGraphRunnerImpl), |
| 166 timer_(kWarmupRuns, | 138 timer_(kWarmupRuns, |
| 167 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), | 139 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), |
| 168 kTimeCheckInterval) { | 140 kTimeCheckInterval) { |
| 169 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); | 141 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); |
| 170 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 142 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
| 171 | 143 |
| 172 resource_provider_ = ResourceProvider::Create( | 144 resource_provider_ = ResourceProvider::Create( |
| 173 output_surface_.get(), NULL, 0, false, 1).Pass(); | 145 output_surface_.get(), NULL, 0, false, 1).Pass(); |
| 174 | 146 |
| 175 switch (GetParam()) { | 147 switch (GetParam()) { |
| 176 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: | 148 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: |
| 177 raster_worker_pool_.reset(new PerfPixelBufferRasterWorkerPoolImpl( | 149 raster_worker_pool_.reset(new PerfPixelBufferRasterWorkerPoolImpl( |
| 178 task_graph_runner_.get(), resource_provider_.get())); | 150 task_graph_runner_.get(), resource_provider_.get())); |
| 179 break; | 151 break; |
| 180 case RASTER_WORKER_POOL_TYPE_IMAGE: | 152 case RASTER_WORKER_POOL_TYPE_IMAGE: |
| 181 raster_worker_pool_.reset(new PerfImageRasterWorkerPoolImpl( | 153 raster_worker_pool_.reset(new PerfImageRasterWorkerPoolImpl( |
| 182 task_graph_runner_.get(), resource_provider_.get())); | 154 task_graph_runner_.get(), resource_provider_.get())); |
| 183 break; | 155 break; |
| 156 case RASTER_WORKER_POOL_TYPE_DIRECT: |
| 157 raster_worker_pool_.reset(new PerfDirectRasterWorkerPoolImpl( |
| 158 resource_provider_.get(), context_provider_)); |
| 159 break; |
| 184 } | 160 } |
| 185 | 161 |
| 186 DCHECK(raster_worker_pool_); | 162 DCHECK(raster_worker_pool_); |
| 187 raster_worker_pool_->SetClient(this); | 163 raster_worker_pool_->SetClient(this); |
| 188 } | 164 } |
| 189 virtual ~RasterWorkerPoolPerfTest() { resource_provider_.reset(); } | 165 virtual ~RasterWorkerPoolPerfTest() { resource_provider_.reset(); } |
| 190 | 166 |
| 191 // Overridden from testing::Test: | 167 // Overridden from testing::Test: |
| 192 virtual void TearDown() OVERRIDE { | 168 virtual void TearDown() OVERRIDE { |
| 193 raster_worker_pool_->Shutdown(); | 169 raster_worker_pool_->Shutdown(); |
| 194 raster_worker_pool_->CheckForCompletedTasks(); | 170 raster_worker_pool_->CheckForCompletedTasks(); |
| 195 } | 171 } |
| 196 | 172 |
| 197 // Overriden from RasterWorkerPoolClient: | 173 // Overriden from RasterWorkerPoolClient: |
| 198 virtual bool ShouldForceTasksRequiredForActivationToComplete() | 174 virtual bool ShouldForceTasksRequiredForActivationToComplete() |
| 199 const OVERRIDE { | 175 const OVERRIDE { |
| 200 return false; | 176 return false; |
| 201 } | 177 } |
| 202 virtual void DidFinishRunningTasks() OVERRIDE {} | 178 virtual void DidFinishRunningTasks() OVERRIDE { |
| 179 raster_worker_pool_->CheckForCompletedTasks(); |
| 180 base::MessageLoop::current()->Quit(); |
| 181 } |
| 203 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} | 182 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} |
| 204 | 183 |
| 205 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, | 184 void RunMessageLoopUntilAllTasksHaveCompleted() { |
| 206 Task::Vector* image_decode_tasks) { | 185 while (task_graph_runner_->RunTaskForTesting()) |
| 207 for (unsigned i = 0; i < num_image_decode_tasks; ++i) | 186 continue; |
| 208 image_decode_tasks->push_back(Task::Create()); | 187 base::MessageLoop::current()->Run(); |
| 209 } | 188 } |
| 210 | 189 |
| 211 void CreateRasterTasks(unsigned num_raster_tasks, | 190 void CreateImageDecodeTasks( |
| 212 const Task::Vector& image_decode_tasks, | 191 unsigned num_image_decode_tasks, |
| 213 RasterTask::Vector* raster_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) { |
| 214 const gfx::Size size(1, 1); | 201 const gfx::Size size(1, 1); |
| 215 | 202 |
| 216 for (unsigned i = 0; i < num_raster_tasks; ++i) { | 203 for (unsigned i = 0; i < num_raster_tasks; ++i) { |
| 217 scoped_ptr<ScopedResource> resource( | 204 scoped_ptr<ScopedResource> resource( |
| 218 ScopedResource::Create(resource_provider_.get())); | 205 ScopedResource::Create(resource_provider_.get())); |
| 219 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); | 206 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
| 220 | 207 |
| 208 internal::WorkerPoolTask::Vector dependencies = image_decode_tasks; |
| 221 raster_tasks->push_back( | 209 raster_tasks->push_back( |
| 222 RasterTask::Create(resource.Pass(), image_decode_tasks)); | 210 new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies)); |
| 223 } | 211 } |
| 224 } | 212 } |
| 225 | 213 |
| 226 void AppendRasterTasks(RasterWorkerPool::RasterTask::Queue* tasks, | 214 void BuildTaskQueue(RasterTaskQueue* queue, |
| 227 const RasterTask::Vector& raster_tasks) { | 215 const RasterTaskVector& raster_tasks) { |
| 228 for (RasterTask::Vector::const_iterator it = raster_tasks.begin(); | 216 for (RasterTaskVector::const_iterator it = raster_tasks.begin(); |
| 229 it != raster_tasks.end(); | 217 it != raster_tasks.end(); |
| 230 ++it) | 218 ++it) |
| 231 tasks->Append(*it, false); | 219 queue->tasks.push_back(RasterTaskQueue::Task(it->get(), false)); |
| 232 } | 220 } |
| 233 | 221 |
| 234 void RunScheduleTasksTest(const std::string& test_name, | 222 void RunScheduleTasksTest(const std::string& test_name, |
| 235 unsigned num_raster_tasks, | 223 unsigned num_raster_tasks, |
| 236 unsigned num_image_decode_tasks) { | 224 unsigned num_image_decode_tasks) { |
| 237 Task::Vector image_decode_tasks; | 225 internal::WorkerPoolTask::Vector image_decode_tasks; |
| 238 RasterTask::Vector raster_tasks; | 226 RasterTaskVector raster_tasks; |
| 239 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 227 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
| 240 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 228 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
| 241 | 229 |
| 242 // Avoid unnecessary heap allocations by reusing the same queue. | 230 // Avoid unnecessary heap allocations by reusing the same queue. |
| 243 RasterWorkerPool::RasterTask::Queue tasks; | 231 RasterTaskQueue queue; |
| 244 | 232 |
| 245 timer_.Reset(); | 233 timer_.Reset(); |
| 246 do { | 234 do { |
| 247 tasks.Reset(); | 235 queue.Reset(); |
| 248 AppendRasterTasks(&tasks, raster_tasks); | 236 BuildTaskQueue(&queue, raster_tasks); |
| 249 raster_worker_pool_->ScheduleTasks(&tasks); | 237 raster_worker_pool_->ScheduleTasks(&queue); |
| 250 raster_worker_pool_->CheckForCompletedTasks(); | 238 raster_worker_pool_->CheckForCompletedTasks(); |
| 251 timer_.NextLap(); | 239 timer_.NextLap(); |
| 252 } while (!timer_.HasTimeLimitExpired()); | 240 } while (!timer_.HasTimeLimitExpired()); |
| 253 | 241 |
| 254 RasterWorkerPool::RasterTask::Queue empty; | 242 RasterTaskQueue empty; |
| 255 raster_worker_pool_->ScheduleTasks(&empty); | 243 raster_worker_pool_->ScheduleTasks(&empty); |
| 256 raster_worker_pool_->CheckForCompletedTasks(); | 244 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 257 | 245 |
| 258 perf_test::PrintResult("schedule_tasks", | 246 perf_test::PrintResult("schedule_tasks", |
| 259 "", | 247 "", |
| 260 test_name, | 248 test_name, |
| 261 timer_.LapsPerSecond(), | 249 timer_.LapsPerSecond(), |
| 262 "runs/s", | 250 "runs/s", |
| 263 true); | 251 true); |
| 264 } | 252 } |
| 265 | 253 |
| 266 void RunScheduleAlternateTasksTest(const std::string& test_name, | 254 void RunScheduleAlternateTasksTest(const std::string& test_name, |
| 267 unsigned num_raster_tasks, | 255 unsigned num_raster_tasks, |
| 268 unsigned num_image_decode_tasks) { | 256 unsigned num_image_decode_tasks) { |
| 269 const size_t kNumVersions = 2; | 257 const size_t kNumVersions = 2; |
| 270 Task::Vector image_decode_tasks[kNumVersions]; | 258 internal::WorkerPoolTask::Vector image_decode_tasks[kNumVersions]; |
| 271 RasterTask::Vector raster_tasks[kNumVersions]; | 259 RasterTaskVector raster_tasks[kNumVersions]; |
| 272 for (size_t i = 0; i < kNumVersions; ++i) { | 260 for (size_t i = 0; i < kNumVersions; ++i) { |
| 273 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); | 261 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); |
| 274 CreateRasterTasks( | 262 CreateRasterTasks( |
| 275 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); | 263 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); |
| 276 } | 264 } |
| 277 | 265 |
| 278 // Avoid unnecessary heap allocations by reusing the same queue. | 266 // Avoid unnecessary heap allocations by reusing the same queue. |
| 279 RasterWorkerPool::RasterTask::Queue tasks; | 267 RasterTaskQueue queue; |
| 280 | 268 |
| 281 size_t count = 0; | 269 size_t count = 0; |
| 282 timer_.Reset(); | 270 timer_.Reset(); |
| 283 do { | 271 do { |
| 284 tasks.Reset(); | 272 queue.Reset(); |
| 285 AppendRasterTasks(&tasks, raster_tasks[count % kNumVersions]); | 273 BuildTaskQueue(&queue, raster_tasks[count % kNumVersions]); |
| 286 raster_worker_pool_->ScheduleTasks(&tasks); | 274 raster_worker_pool_->ScheduleTasks(&queue); |
| 287 raster_worker_pool_->CheckForCompletedTasks(); | 275 raster_worker_pool_->CheckForCompletedTasks(); |
| 288 ++count; | 276 ++count; |
| 289 timer_.NextLap(); | 277 timer_.NextLap(); |
| 290 } while (!timer_.HasTimeLimitExpired()); | 278 } while (!timer_.HasTimeLimitExpired()); |
| 291 | 279 |
| 292 RasterWorkerPool::RasterTask::Queue empty; | 280 RasterTaskQueue empty; |
| 293 raster_worker_pool_->ScheduleTasks(&empty); | 281 raster_worker_pool_->ScheduleTasks(&empty); |
| 294 raster_worker_pool_->CheckForCompletedTasks(); | 282 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 295 | 283 |
| 296 perf_test::PrintResult("schedule_alternate_tasks", | 284 perf_test::PrintResult("schedule_alternate_tasks", |
| 297 "", | 285 "", |
| 298 test_name, | 286 test_name, |
| 299 timer_.LapsPerSecond(), | 287 timer_.LapsPerSecond(), |
| 300 "runs/s", | 288 "runs/s", |
| 301 true); | 289 true); |
| 302 } | 290 } |
| 303 | 291 |
| 304 void RunScheduleAndExecuteTasksTest(const std::string& test_name, | 292 void RunScheduleAndExecuteTasksTest(const std::string& test_name, |
| 305 unsigned num_raster_tasks, | 293 unsigned num_raster_tasks, |
| 306 unsigned num_image_decode_tasks) { | 294 unsigned num_image_decode_tasks) { |
| 307 Task::Vector image_decode_tasks; | 295 internal::WorkerPoolTask::Vector image_decode_tasks; |
| 308 RasterTask::Vector raster_tasks; | 296 RasterTaskVector raster_tasks; |
| 309 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 297 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
| 310 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 298 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
| 311 | 299 |
| 312 // Avoid unnecessary heap allocations by reusing the same queue. | 300 // Avoid unnecessary heap allocations by reusing the same queue. |
| 313 RasterWorkerPool::RasterTask::Queue tasks; | 301 RasterTaskQueue queue; |
| 314 | 302 |
| 315 timer_.Reset(); | 303 timer_.Reset(); |
| 316 do { | 304 do { |
| 317 tasks.Reset(); | 305 queue.Reset(); |
| 318 AppendRasterTasks(&tasks, raster_tasks); | 306 BuildTaskQueue(&queue, raster_tasks); |
| 319 raster_worker_pool_->ScheduleTasks(&tasks); | 307 raster_worker_pool_->ScheduleTasks(&queue); |
| 320 while (task_graph_runner_->RunTaskForTesting()) | 308 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 321 continue; | |
| 322 raster_worker_pool_->CheckForCompletedTasks(); | |
| 323 timer_.NextLap(); | 309 timer_.NextLap(); |
| 324 } while (!timer_.HasTimeLimitExpired()); | 310 } while (!timer_.HasTimeLimitExpired()); |
| 325 | 311 |
| 326 RasterWorkerPool::RasterTask::Queue empty; | 312 RasterTaskQueue empty; |
| 327 raster_worker_pool_->ScheduleTasks(&empty); | 313 raster_worker_pool_->ScheduleTasks(&empty); |
| 328 raster_worker_pool_->CheckForCompletedTasks(); | 314 RunMessageLoopUntilAllTasksHaveCompleted(); |
| 329 | 315 |
| 330 perf_test::PrintResult("schedule_and_execute_tasks", | 316 perf_test::PrintResult("schedule_and_execute_tasks", |
| 331 "", | 317 "", |
| 332 test_name, | 318 test_name, |
| 333 timer_.LapsPerSecond(), | 319 timer_.LapsPerSecond(), |
| 334 "runs/s", | 320 "runs/s", |
| 335 true); | 321 true); |
| 336 } | 322 } |
| 337 | 323 |
| 338 private: | 324 private: |
| 339 scoped_refptr<TestContextProvider> context_provider_; | 325 scoped_refptr<TestContextProvider> context_provider_; |
| 340 FakeOutputSurfaceClient output_surface_client_; | 326 FakeOutputSurfaceClient output_surface_client_; |
| 341 scoped_ptr<FakeOutputSurface> output_surface_; | 327 scoped_ptr<FakeOutputSurface> output_surface_; |
| 342 scoped_ptr<ResourceProvider> resource_provider_; | 328 scoped_ptr<ResourceProvider> resource_provider_; |
| 343 scoped_ptr<internal::TaskGraphRunner> task_graph_runner_; | 329 scoped_ptr<internal::TaskGraphRunner> task_graph_runner_; |
| 344 scoped_ptr<RasterWorkerPool> raster_worker_pool_; | 330 scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
| 345 std::vector<RasterWorkerPool::RasterTask> tasks_; | |
| 346 LapTimer timer_; | 331 LapTimer timer_; |
| 347 }; | 332 }; |
| 348 | 333 |
| 349 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { | 334 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { |
| 350 RunScheduleTasksTest("1_0", 1, 0); | 335 RunScheduleTasksTest("1_0", 1, 0); |
| 351 RunScheduleTasksTest("32_0", 32, 0); | 336 RunScheduleTasksTest("32_0", 32, 0); |
| 352 RunScheduleTasksTest("1_1", 1, 1); | 337 RunScheduleTasksTest("1_1", 1, 1); |
| 353 RunScheduleTasksTest("32_1", 32, 1); | 338 RunScheduleTasksTest("32_1", 32, 1); |
| 354 RunScheduleTasksTest("1_4", 1, 4); | 339 RunScheduleTasksTest("1_4", 1, 4); |
| 355 RunScheduleTasksTest("32_4", 32, 4); | 340 RunScheduleTasksTest("32_4", 32, 4); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 369 RunScheduleAndExecuteTasksTest("32_0", 32, 0); | 354 RunScheduleAndExecuteTasksTest("32_0", 32, 0); |
| 370 RunScheduleAndExecuteTasksTest("1_1", 1, 1); | 355 RunScheduleAndExecuteTasksTest("1_1", 1, 1); |
| 371 RunScheduleAndExecuteTasksTest("32_1", 32, 1); | 356 RunScheduleAndExecuteTasksTest("32_1", 32, 1); |
| 372 RunScheduleAndExecuteTasksTest("1_4", 1, 4); | 357 RunScheduleAndExecuteTasksTest("1_4", 1, 4); |
| 373 RunScheduleAndExecuteTasksTest("32_4", 32, 4); | 358 RunScheduleAndExecuteTasksTest("32_4", 32, 4); |
| 374 } | 359 } |
| 375 | 360 |
| 376 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, | 361 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, |
| 377 RasterWorkerPoolPerfTest, | 362 RasterWorkerPoolPerfTest, |
| 378 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 363 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
| 379 RASTER_WORKER_POOL_TYPE_IMAGE)); | 364 RASTER_WORKER_POOL_TYPE_IMAGE, |
| 365 RASTER_WORKER_POOL_TYPE_DIRECT)); |
| 380 | 366 |
| 381 } // namespace | 367 } // namespace |
| 382 } // namespace cc | 368 } // namespace cc |
| OLD | NEW |