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

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: 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 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698