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

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

Issue 165603002: cc: Move GPU raster to DirectRasterWorkerPool. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove rastertaskqueue changes and refactor worker pool delegate 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
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/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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698