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 class Task : public RasterWorkerPool::Task { |
128 public: | 133 public: |
129 typedef std::vector<Task> Vector; | 134 typedef std::vector<Task> Vector; |
130 | 135 |
131 static Task Create() { return Task(new PerfWorkerPoolTaskImpl); } | 136 static Task Create() { return Task(new PerfWorkerPoolTaskImpl); } |
132 | 137 |
133 void AppendTo(internal::Task::Vector* dependencies) const { | 138 void AppendTo(internal::WorkerPoolTask::Vector* dependencies) const { |
134 dependencies->push_back(internal_); | 139 dependencies->push_back(internal_); |
135 } | 140 } |
136 | 141 |
137 private: | 142 private: |
138 explicit Task(internal::WorkerPoolTask* task) | 143 explicit Task(internal::WorkerPoolTask* task) |
139 : RasterWorkerPool::Task(task) {} | 144 : RasterWorkerPool::Task(task) {} |
140 }; | 145 }; |
141 | 146 |
142 class RasterTask : public RasterWorkerPool::RasterTask { | 147 class RasterTask : public RasterWorkerPool::RasterTask { |
143 public: | 148 public: |
144 typedef std::vector<RasterTask> Vector; | 149 typedef std::vector<RasterTask> Vector; |
145 | 150 |
146 static RasterTask Create(scoped_ptr<ScopedResource> resource, | 151 static RasterTask Create(scoped_ptr<ScopedResource> resource, |
147 const Task::Vector& image_decode_tasks) { | 152 const Task::Vector& image_decode_tasks) { |
148 internal::Task::Vector dependencies; | 153 internal::WorkerPoolTask::Vector dependencies; |
149 for (Task::Vector::const_iterator it = image_decode_tasks.begin(); | 154 for (Task::Vector::const_iterator it = image_decode_tasks.begin(); |
150 it != image_decode_tasks.end(); | 155 it != image_decode_tasks.end(); |
151 ++it) | 156 ++it) |
152 it->AppendTo(&dependencies); | 157 it->AppendTo(&dependencies); |
153 | 158 |
154 return RasterTask( | 159 return RasterTask( |
155 new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies)); | 160 new PerfRasterWorkerPoolTaskImpl(resource.Pass(), &dependencies)); |
156 } | 161 } |
157 | 162 |
158 private: | 163 private: |
(...skipping 15 matching lines...) Expand all Loading... |
174 | 179 |
175 switch (GetParam()) { | 180 switch (GetParam()) { |
176 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: | 181 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: |
177 raster_worker_pool_.reset(new PerfPixelBufferRasterWorkerPoolImpl( | 182 raster_worker_pool_.reset(new PerfPixelBufferRasterWorkerPoolImpl( |
178 task_graph_runner_.get(), resource_provider_.get())); | 183 task_graph_runner_.get(), resource_provider_.get())); |
179 break; | 184 break; |
180 case RASTER_WORKER_POOL_TYPE_IMAGE: | 185 case RASTER_WORKER_POOL_TYPE_IMAGE: |
181 raster_worker_pool_.reset(new PerfImageRasterWorkerPoolImpl( | 186 raster_worker_pool_.reset(new PerfImageRasterWorkerPoolImpl( |
182 task_graph_runner_.get(), resource_provider_.get())); | 187 task_graph_runner_.get(), resource_provider_.get())); |
183 break; | 188 break; |
| 189 case RASTER_WORKER_POOL_TYPE_DIRECT: |
| 190 raster_worker_pool_.reset(new PerfDirectRasterWorkerPoolImpl( |
| 191 resource_provider_.get(), context_provider_)); |
| 192 break; |
184 } | 193 } |
185 | 194 |
186 DCHECK(raster_worker_pool_); | 195 DCHECK(raster_worker_pool_); |
187 raster_worker_pool_->SetClient(this); | 196 raster_worker_pool_->SetClient(this); |
188 } | 197 } |
189 virtual ~RasterWorkerPoolPerfTest() { resource_provider_.reset(); } | 198 virtual ~RasterWorkerPoolPerfTest() { resource_provider_.reset(); } |
190 | 199 |
191 // Overridden from testing::Test: | 200 // Overridden from testing::Test: |
192 virtual void TearDown() OVERRIDE { | 201 virtual void TearDown() OVERRIDE { |
193 raster_worker_pool_->Shutdown(); | 202 raster_worker_pool_->Shutdown(); |
194 raster_worker_pool_->CheckForCompletedTasks(); | 203 raster_worker_pool_->CheckForCompletedTasks(); |
195 } | 204 } |
196 | 205 |
197 // Overriden from RasterWorkerPoolClient: | 206 // Overriden from RasterWorkerPoolClient: |
198 virtual bool ShouldForceTasksRequiredForActivationToComplete() | 207 virtual bool ShouldForceTasksRequiredForActivationToComplete() |
199 const OVERRIDE { | 208 const OVERRIDE { |
200 return false; | 209 return false; |
201 } | 210 } |
202 virtual void DidFinishRunningTasks() OVERRIDE {} | 211 virtual void DidFinishRunningTasks() OVERRIDE { |
| 212 raster_worker_pool_->CheckForCompletedTasks(); |
| 213 base::MessageLoop::current()->Quit(); |
| 214 } |
203 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} | 215 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} |
204 | 216 |
| 217 void RunMessageLoopUntilAllTasksHaveCompleted() { |
| 218 while (task_graph_runner_->RunTaskForTesting()) |
| 219 continue; |
| 220 base::MessageLoop::current()->Run(); |
| 221 } |
| 222 |
205 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, | 223 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, |
206 Task::Vector* image_decode_tasks) { | 224 Task::Vector* image_decode_tasks) { |
207 for (unsigned i = 0; i < num_image_decode_tasks; ++i) | 225 for (unsigned i = 0; i < num_image_decode_tasks; ++i) |
208 image_decode_tasks->push_back(Task::Create()); | 226 image_decode_tasks->push_back(Task::Create()); |
209 } | 227 } |
210 | 228 |
211 void CreateRasterTasks(unsigned num_raster_tasks, | 229 void CreateRasterTasks(unsigned num_raster_tasks, |
212 const Task::Vector& image_decode_tasks, | 230 const Task::Vector& image_decode_tasks, |
213 RasterTask::Vector* raster_tasks) { | 231 RasterTask::Vector* raster_tasks) { |
214 const gfx::Size size(1, 1); | 232 const gfx::Size size(1, 1); |
215 | 233 |
216 for (unsigned i = 0; i < num_raster_tasks; ++i) { | 234 for (unsigned i = 0; i < num_raster_tasks; ++i) { |
217 scoped_ptr<ScopedResource> resource( | 235 scoped_ptr<ScopedResource> resource( |
218 ScopedResource::Create(resource_provider_.get())); | 236 ScopedResource::Create(resource_provider_.get())); |
219 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); | 237 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
220 | 238 |
221 raster_tasks->push_back( | 239 raster_tasks->push_back( |
222 RasterTask::Create(resource.Pass(), image_decode_tasks)); | 240 RasterTask::Create(resource.Pass(), image_decode_tasks)); |
223 } | 241 } |
224 } | 242 } |
225 | 243 |
226 void AppendRasterTasks(RasterWorkerPool::RasterTask::Queue* tasks, | 244 void BuildTaskQueue(RasterWorkerPool::RasterTask::Queue* tasks, |
227 const RasterTask::Vector& raster_tasks) { | 245 const RasterTask::Vector& raster_tasks) { |
228 for (RasterTask::Vector::const_iterator it = raster_tasks.begin(); | 246 for (RasterTask::Vector::const_iterator it = raster_tasks.begin(); |
229 it != raster_tasks.end(); | 247 it != raster_tasks.end(); |
230 ++it) | 248 ++it) |
231 tasks->Append(*it, false); | 249 tasks->Append(*it, false); |
232 } | 250 } |
233 | 251 |
234 void RunScheduleTasksTest(const std::string& test_name, | 252 void RunScheduleTasksTest(const std::string& test_name, |
235 unsigned num_raster_tasks, | 253 unsigned num_raster_tasks, |
236 unsigned num_image_decode_tasks) { | 254 unsigned num_image_decode_tasks) { |
237 Task::Vector image_decode_tasks; | 255 Task::Vector image_decode_tasks; |
238 RasterTask::Vector raster_tasks; | 256 RasterTask::Vector raster_tasks; |
239 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 257 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
240 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 258 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
241 | 259 |
242 // Avoid unnecessary heap allocations by reusing the same queue. | 260 // Avoid unnecessary heap allocations by reusing the same queue. |
243 RasterWorkerPool::RasterTask::Queue tasks; | 261 RasterWorkerPool::RasterTask::Queue queue; |
244 | 262 |
245 timer_.Reset(); | 263 timer_.Reset(); |
246 do { | 264 do { |
247 tasks.Reset(); | 265 queue.Reset(); |
248 AppendRasterTasks(&tasks, raster_tasks); | 266 BuildTaskQueue(&queue, raster_tasks); |
249 raster_worker_pool_->ScheduleTasks(&tasks); | 267 raster_worker_pool_->ScheduleTasks(&queue); |
250 raster_worker_pool_->CheckForCompletedTasks(); | 268 raster_worker_pool_->CheckForCompletedTasks(); |
251 timer_.NextLap(); | 269 timer_.NextLap(); |
252 } while (!timer_.HasTimeLimitExpired()); | 270 } while (!timer_.HasTimeLimitExpired()); |
253 | 271 |
254 RasterWorkerPool::RasterTask::Queue empty; | 272 RasterWorkerPool::RasterTask::Queue empty; |
255 raster_worker_pool_->ScheduleTasks(&empty); | 273 raster_worker_pool_->ScheduleTasks(&empty); |
256 raster_worker_pool_->CheckForCompletedTasks(); | 274 RunMessageLoopUntilAllTasksHaveCompleted(); |
257 | 275 |
258 perf_test::PrintResult("schedule_tasks", | 276 perf_test::PrintResult("schedule_tasks", |
259 "", | 277 "", |
260 test_name, | 278 test_name, |
261 timer_.LapsPerSecond(), | 279 timer_.LapsPerSecond(), |
262 "runs/s", | 280 "runs/s", |
263 true); | 281 true); |
264 } | 282 } |
265 | 283 |
266 void RunScheduleAlternateTasksTest(const std::string& test_name, | 284 void RunScheduleAlternateTasksTest(const std::string& test_name, |
267 unsigned num_raster_tasks, | 285 unsigned num_raster_tasks, |
268 unsigned num_image_decode_tasks) { | 286 unsigned num_image_decode_tasks) { |
269 const size_t kNumVersions = 2; | 287 const size_t kNumVersions = 2; |
270 Task::Vector image_decode_tasks[kNumVersions]; | 288 Task::Vector image_decode_tasks[kNumVersions]; |
271 RasterTask::Vector raster_tasks[kNumVersions]; | 289 RasterTask::Vector raster_tasks[kNumVersions]; |
272 for (size_t i = 0; i < kNumVersions; ++i) { | 290 for (size_t i = 0; i < kNumVersions; ++i) { |
273 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); | 291 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); |
274 CreateRasterTasks( | 292 CreateRasterTasks( |
275 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); | 293 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); |
276 } | 294 } |
277 | 295 |
278 // Avoid unnecessary heap allocations by reusing the same queue. | 296 // Avoid unnecessary heap allocations by reusing the same queue. |
279 RasterWorkerPool::RasterTask::Queue tasks; | 297 RasterWorkerPool::RasterTask::Queue queue; |
280 | 298 |
281 size_t count = 0; | 299 size_t count = 0; |
282 timer_.Reset(); | 300 timer_.Reset(); |
283 do { | 301 do { |
284 tasks.Reset(); | 302 queue.Reset(); |
285 AppendRasterTasks(&tasks, raster_tasks[count % kNumVersions]); | 303 BuildTaskQueue(&queue, raster_tasks[count % kNumVersions]); |
286 raster_worker_pool_->ScheduleTasks(&tasks); | 304 raster_worker_pool_->ScheduleTasks(&queue); |
287 raster_worker_pool_->CheckForCompletedTasks(); | 305 raster_worker_pool_->CheckForCompletedTasks(); |
288 ++count; | 306 ++count; |
289 timer_.NextLap(); | 307 timer_.NextLap(); |
290 } while (!timer_.HasTimeLimitExpired()); | 308 } while (!timer_.HasTimeLimitExpired()); |
291 | 309 |
292 RasterWorkerPool::RasterTask::Queue empty; | 310 RasterWorkerPool::RasterTask::Queue empty; |
293 raster_worker_pool_->ScheduleTasks(&empty); | 311 raster_worker_pool_->ScheduleTasks(&empty); |
294 raster_worker_pool_->CheckForCompletedTasks(); | 312 RunMessageLoopUntilAllTasksHaveCompleted(); |
295 | 313 |
296 perf_test::PrintResult("schedule_alternate_tasks", | 314 perf_test::PrintResult("schedule_alternate_tasks", |
297 "", | 315 "", |
298 test_name, | 316 test_name, |
299 timer_.LapsPerSecond(), | 317 timer_.LapsPerSecond(), |
300 "runs/s", | 318 "runs/s", |
301 true); | 319 true); |
302 } | 320 } |
303 | 321 |
304 void RunScheduleAndExecuteTasksTest(const std::string& test_name, | 322 void RunScheduleAndExecuteTasksTest(const std::string& test_name, |
305 unsigned num_raster_tasks, | 323 unsigned num_raster_tasks, |
306 unsigned num_image_decode_tasks) { | 324 unsigned num_image_decode_tasks) { |
307 Task::Vector image_decode_tasks; | 325 Task::Vector image_decode_tasks; |
308 RasterTask::Vector raster_tasks; | 326 RasterTask::Vector raster_tasks; |
309 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 327 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
310 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 328 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
311 | 329 |
312 // Avoid unnecessary heap allocations by reusing the same queue. | 330 // Avoid unnecessary heap allocations by reusing the same queue. |
313 RasterWorkerPool::RasterTask::Queue tasks; | 331 RasterWorkerPool::RasterTask::Queue queue; |
314 | 332 |
315 timer_.Reset(); | 333 timer_.Reset(); |
316 do { | 334 do { |
317 tasks.Reset(); | 335 queue.Reset(); |
318 AppendRasterTasks(&tasks, raster_tasks); | 336 BuildTaskQueue(&queue, raster_tasks); |
319 raster_worker_pool_->ScheduleTasks(&tasks); | 337 raster_worker_pool_->ScheduleTasks(&queue); |
320 while (task_graph_runner_->RunTaskForTesting()) | 338 RunMessageLoopUntilAllTasksHaveCompleted(); |
321 continue; | |
322 raster_worker_pool_->CheckForCompletedTasks(); | |
323 timer_.NextLap(); | 339 timer_.NextLap(); |
324 } while (!timer_.HasTimeLimitExpired()); | 340 } while (!timer_.HasTimeLimitExpired()); |
325 | 341 |
326 RasterWorkerPool::RasterTask::Queue empty; | 342 RasterWorkerPool::RasterTask::Queue empty; |
327 raster_worker_pool_->ScheduleTasks(&empty); | 343 raster_worker_pool_->ScheduleTasks(&empty); |
328 raster_worker_pool_->CheckForCompletedTasks(); | 344 RunMessageLoopUntilAllTasksHaveCompleted(); |
329 | 345 |
330 perf_test::PrintResult("schedule_and_execute_tasks", | 346 perf_test::PrintResult("schedule_and_execute_tasks", |
331 "", | 347 "", |
332 test_name, | 348 test_name, |
333 timer_.LapsPerSecond(), | 349 timer_.LapsPerSecond(), |
334 "runs/s", | 350 "runs/s", |
335 true); | 351 true); |
336 } | 352 } |
337 | 353 |
338 private: | 354 private: |
339 scoped_refptr<TestContextProvider> context_provider_; | 355 scoped_refptr<TestContextProvider> context_provider_; |
340 FakeOutputSurfaceClient output_surface_client_; | 356 FakeOutputSurfaceClient output_surface_client_; |
341 scoped_ptr<FakeOutputSurface> output_surface_; | 357 scoped_ptr<FakeOutputSurface> output_surface_; |
342 scoped_ptr<ResourceProvider> resource_provider_; | 358 scoped_ptr<ResourceProvider> resource_provider_; |
343 scoped_ptr<internal::TaskGraphRunner> task_graph_runner_; | 359 scoped_ptr<internal::TaskGraphRunner> task_graph_runner_; |
344 scoped_ptr<RasterWorkerPool> raster_worker_pool_; | 360 scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
345 std::vector<RasterWorkerPool::RasterTask> tasks_; | |
346 LapTimer timer_; | 361 LapTimer timer_; |
347 }; | 362 }; |
348 | 363 |
349 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { | 364 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { |
350 RunScheduleTasksTest("1_0", 1, 0); | 365 RunScheduleTasksTest("1_0", 1, 0); |
351 RunScheduleTasksTest("32_0", 32, 0); | 366 RunScheduleTasksTest("32_0", 32, 0); |
352 RunScheduleTasksTest("1_1", 1, 1); | 367 RunScheduleTasksTest("1_1", 1, 1); |
353 RunScheduleTasksTest("32_1", 32, 1); | 368 RunScheduleTasksTest("32_1", 32, 1); |
354 RunScheduleTasksTest("1_4", 1, 4); | 369 RunScheduleTasksTest("1_4", 1, 4); |
355 RunScheduleTasksTest("32_4", 32, 4); | 370 RunScheduleTasksTest("32_4", 32, 4); |
(...skipping 13 matching lines...) Expand all Loading... |
369 RunScheduleAndExecuteTasksTest("32_0", 32, 0); | 384 RunScheduleAndExecuteTasksTest("32_0", 32, 0); |
370 RunScheduleAndExecuteTasksTest("1_1", 1, 1); | 385 RunScheduleAndExecuteTasksTest("1_1", 1, 1); |
371 RunScheduleAndExecuteTasksTest("32_1", 32, 1); | 386 RunScheduleAndExecuteTasksTest("32_1", 32, 1); |
372 RunScheduleAndExecuteTasksTest("1_4", 1, 4); | 387 RunScheduleAndExecuteTasksTest("1_4", 1, 4); |
373 RunScheduleAndExecuteTasksTest("32_4", 32, 4); | 388 RunScheduleAndExecuteTasksTest("32_4", 32, 4); |
374 } | 389 } |
375 | 390 |
376 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, | 391 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, |
377 RasterWorkerPoolPerfTest, | 392 RasterWorkerPoolPerfTest, |
378 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 393 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, |
379 RASTER_WORKER_POOL_TYPE_IMAGE)); | 394 RASTER_WORKER_POOL_TYPE_IMAGE, |
| 395 RASTER_WORKER_POOL_TYPE_DIRECT)); |
380 | 396 |
381 } // namespace | 397 } // namespace |
382 } // namespace cc | 398 } // namespace cc |
OLD | NEW |