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/tile_task_worker_pool.h" |
6 | 6 |
7 #include "base/test/test_simple_task_runner.h" | 7 #include "base/test/test_simple_task_runner.h" |
8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
9 #include "cc/debug/lap_timer.h" | 9 #include "cc/debug/lap_timer.h" |
10 #include "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
11 #include "cc/resources/bitmap_raster_worker_pool.h" | 11 #include "cc/resources/bitmap_tile_task_worker_pool.h" |
12 #include "cc/resources/gpu_raster_worker_pool.h" | 12 #include "cc/resources/gpu_tile_task_worker_pool.h" |
13 #include "cc/resources/one_copy_raster_worker_pool.h" | 13 #include "cc/resources/one_copy_tile_task_worker_pool.h" |
14 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 14 #include "cc/resources/pixel_buffer_tile_task_worker_pool.h" |
15 #include "cc/resources/raster_buffer.h" | 15 #include "cc/resources/raster_buffer.h" |
16 #include "cc/resources/rasterizer.h" | |
17 #include "cc/resources/resource_pool.h" | 16 #include "cc/resources/resource_pool.h" |
18 #include "cc/resources/resource_provider.h" | 17 #include "cc/resources/resource_provider.h" |
19 #include "cc/resources/scoped_resource.h" | 18 #include "cc/resources/scoped_resource.h" |
20 #include "cc/resources/zero_copy_raster_worker_pool.h" | 19 #include "cc/resources/tile_task_runner.h" |
| 20 #include "cc/resources/zero_copy_tile_task_worker_pool.h" |
21 #include "cc/test/fake_output_surface.h" | 21 #include "cc/test/fake_output_surface.h" |
22 #include "cc/test/fake_output_surface_client.h" | 22 #include "cc/test/fake_output_surface_client.h" |
23 #include "cc/test/test_context_support.h" | 23 #include "cc/test/test_context_support.h" |
24 #include "cc/test/test_gpu_memory_buffer_manager.h" | 24 #include "cc/test/test_gpu_memory_buffer_manager.h" |
25 #include "cc/test/test_shared_bitmap_manager.h" | 25 #include "cc/test/test_shared_bitmap_manager.h" |
26 #include "cc/test/test_web_graphics_context_3d.h" | 26 #include "cc/test/test_web_graphics_context_3d.h" |
27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
28 #include "testing/perf/perf_test.h" | 28 #include "testing/perf/perf_test.h" |
29 #include "third_party/khronos/GLES2/gl2.h" | 29 #include "third_party/khronos/GLES2/gl2.h" |
30 | 30 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 void SetMemoryPolicyChangedCallback( | 87 void SetMemoryPolicyChangedCallback( |
88 const MemoryPolicyChangedCallback& cb) override {} | 88 const MemoryPolicyChangedCallback& cb) override {} |
89 | 89 |
90 private: | 90 private: |
91 ~PerfContextProvider() override {} | 91 ~PerfContextProvider() override {} |
92 | 92 |
93 scoped_ptr<PerfGLES2Interface> context_gl_; | 93 scoped_ptr<PerfGLES2Interface> context_gl_; |
94 TestContextSupport support_; | 94 TestContextSupport support_; |
95 }; | 95 }; |
96 | 96 |
97 enum RasterWorkerPoolType { | 97 enum TileTaskWorkerPoolType { |
98 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 98 TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER, |
99 RASTER_WORKER_POOL_TYPE_ZERO_COPY, | 99 TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY, |
100 RASTER_WORKER_POOL_TYPE_ONE_COPY, | 100 TILE_TASK_WORKER_POOL_TYPE_ONE_COPY, |
101 RASTER_WORKER_POOL_TYPE_GPU, | 101 TILE_TASK_WORKER_POOL_TYPE_GPU, |
102 RASTER_WORKER_POOL_TYPE_BITMAP | 102 TILE_TASK_WORKER_POOL_TYPE_BITMAP |
103 }; | 103 }; |
104 | 104 |
105 static const int kTimeLimitMillis = 2000; | 105 static const int kTimeLimitMillis = 2000; |
106 static const int kWarmupRuns = 5; | 106 static const int kWarmupRuns = 5; |
107 static const int kTimeCheckInterval = 10; | 107 static const int kTimeCheckInterval = 10; |
108 | 108 |
109 class PerfImageDecodeTaskImpl : public ImageDecodeTask { | 109 class PerfImageDecodeTaskImpl : public ImageDecodeTask { |
110 public: | 110 public: |
111 PerfImageDecodeTaskImpl() {} | 111 PerfImageDecodeTaskImpl() {} |
112 | 112 |
113 // Overridden from Task: | 113 // Overridden from Task: |
114 void RunOnWorkerThread() override {} | 114 void RunOnWorkerThread() override {} |
115 | 115 |
116 // Overridden from RasterizerTask: | 116 // Overridden from TileTask: |
117 void ScheduleOnOriginThread(RasterizerTaskClient* client) override {} | 117 void ScheduleOnOriginThread(TileTaskClient* client) override {} |
118 void CompleteOnOriginThread(RasterizerTaskClient* client) override {} | 118 void CompleteOnOriginThread(TileTaskClient* client) override {} |
119 void RunReplyOnOriginThread() override { Reset(); } | 119 void RunReplyOnOriginThread() override { Reset(); } |
120 | 120 |
121 void Reset() { | 121 void Reset() { |
122 did_run_ = false; | 122 did_run_ = false; |
123 did_complete_ = false; | 123 did_complete_ = false; |
124 } | 124 } |
125 | 125 |
126 protected: | 126 protected: |
127 ~PerfImageDecodeTaskImpl() override {} | 127 ~PerfImageDecodeTaskImpl() override {} |
128 | 128 |
129 private: | 129 private: |
130 DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl); | 130 DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl); |
131 }; | 131 }; |
132 | 132 |
133 class PerfRasterTaskImpl : public RasterTask { | 133 class PerfRasterTaskImpl : public RasterTask { |
134 public: | 134 public: |
135 PerfRasterTaskImpl(scoped_ptr<ScopedResource> resource, | 135 PerfRasterTaskImpl(scoped_ptr<ScopedResource> resource, |
136 ImageDecodeTask::Vector* dependencies) | 136 ImageDecodeTask::Vector* dependencies) |
137 : RasterTask(resource.get(), dependencies), resource_(resource.Pass()) {} | 137 : RasterTask(resource.get(), dependencies), resource_(resource.Pass()) {} |
138 | 138 |
139 // Overridden from Task: | 139 // Overridden from Task: |
140 void RunOnWorkerThread() override {} | 140 void RunOnWorkerThread() override {} |
141 | 141 |
142 // Overridden from RasterizerTask: | 142 // Overridden from TileTask: |
143 void ScheduleOnOriginThread(RasterizerTaskClient* client) override { | 143 void ScheduleOnOriginThread(TileTaskClient* client) override { |
144 raster_buffer_ = client->AcquireBufferForRaster(resource()); | 144 raster_buffer_ = client->AcquireBufferForRaster(resource()); |
145 } | 145 } |
146 void CompleteOnOriginThread(RasterizerTaskClient* client) override { | 146 void CompleteOnOriginThread(TileTaskClient* client) override { |
147 client->ReleaseBufferForRaster(raster_buffer_.Pass()); | 147 client->ReleaseBufferForRaster(raster_buffer_.Pass()); |
148 } | 148 } |
149 void RunReplyOnOriginThread() override { Reset(); } | 149 void RunReplyOnOriginThread() override { Reset(); } |
150 | 150 |
151 void Reset() { | 151 void Reset() { |
152 did_run_ = false; | 152 did_run_ = false; |
153 did_complete_ = false; | 153 did_complete_ = false; |
154 } | 154 } |
155 | 155 |
156 protected: | 156 protected: |
157 ~PerfRasterTaskImpl() override {} | 157 ~PerfRasterTaskImpl() override {} |
158 | 158 |
159 private: | 159 private: |
160 scoped_ptr<ScopedResource> resource_; | 160 scoped_ptr<ScopedResource> resource_; |
161 scoped_ptr<RasterBuffer> raster_buffer_; | 161 scoped_ptr<RasterBuffer> raster_buffer_; |
162 | 162 |
163 DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl); | 163 DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl); |
164 }; | 164 }; |
165 | 165 |
166 class RasterWorkerPoolPerfTestBase { | 166 class TileTaskWorkerPoolPerfTestBase { |
167 public: | 167 public: |
168 typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector; | 168 typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector; |
169 | 169 |
170 enum NamedTaskSet { ALL, REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW }; | 170 enum NamedTaskSet { ALL, REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW }; |
171 | 171 |
172 RasterWorkerPoolPerfTestBase() | 172 TileTaskWorkerPoolPerfTestBase() |
173 : context_provider_(make_scoped_refptr(new PerfContextProvider)), | 173 : context_provider_(make_scoped_refptr(new PerfContextProvider)), |
174 task_runner_(new base::TestSimpleTaskRunner), | 174 task_runner_(new base::TestSimpleTaskRunner), |
175 task_graph_runner_(new TaskGraphRunner), | 175 task_graph_runner_(new TaskGraphRunner), |
176 timer_(kWarmupRuns, | 176 timer_(kWarmupRuns, |
177 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), | 177 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), |
178 kTimeCheckInterval) {} | 178 kTimeCheckInterval) {} |
179 | 179 |
180 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, | 180 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, |
181 ImageDecodeTask::Vector* image_decode_tasks) { | 181 ImageDecodeTask::Vector* image_decode_tasks) { |
182 for (unsigned i = 0; i < num_image_decode_tasks; ++i) | 182 for (unsigned i = 0; i < num_image_decode_tasks; ++i) |
183 image_decode_tasks->push_back(new PerfImageDecodeTaskImpl); | 183 image_decode_tasks->push_back(new PerfImageDecodeTaskImpl); |
184 } | 184 } |
185 | 185 |
186 void CreateRasterTasks(unsigned num_raster_tasks, | 186 void CreateRasterTasks(unsigned num_raster_tasks, |
187 const ImageDecodeTask::Vector& image_decode_tasks, | 187 const ImageDecodeTask::Vector& image_decode_tasks, |
188 RasterTaskVector* raster_tasks) { | 188 RasterTaskVector* raster_tasks) { |
189 const gfx::Size size(1, 1); | 189 const gfx::Size size(1, 1); |
190 | 190 |
191 for (unsigned i = 0; i < num_raster_tasks; ++i) { | 191 for (unsigned i = 0; i < num_raster_tasks; ++i) { |
192 scoped_ptr<ScopedResource> resource( | 192 scoped_ptr<ScopedResource> resource( |
193 ScopedResource::Create(resource_provider_.get())); | 193 ScopedResource::Create(resource_provider_.get())); |
194 resource->Allocate( | 194 resource->Allocate(size, ResourceProvider::TextureHintImmutable, |
195 size, ResourceProvider::TextureHintImmutable, RGBA_8888); | 195 RGBA_8888); |
196 | 196 |
197 ImageDecodeTask::Vector dependencies = image_decode_tasks; | 197 ImageDecodeTask::Vector dependencies = image_decode_tasks; |
198 raster_tasks->push_back( | 198 raster_tasks->push_back( |
199 new PerfRasterTaskImpl(resource.Pass(), &dependencies)); | 199 new PerfRasterTaskImpl(resource.Pass(), &dependencies)); |
200 } | 200 } |
201 } | 201 } |
202 | 202 |
203 void BuildRasterTaskQueue(RasterTaskQueue* queue, | 203 void BuildTileTaskQueue(TileTaskQueue* queue, |
204 const RasterTaskVector& raster_tasks) { | 204 const RasterTaskVector& raster_tasks) { |
205 for (size_t i = 0u; i < raster_tasks.size(); ++i) { | 205 for (size_t i = 0u; i < raster_tasks.size(); ++i) { |
206 bool required_for_activation = (i % 2) == 0; | 206 bool required_for_activation = (i % 2) == 0; |
207 TaskSetCollection task_set_collection; | 207 TaskSetCollection task_set_collection; |
208 task_set_collection[ALL] = true; | 208 task_set_collection[ALL] = true; |
209 task_set_collection[REQUIRED_FOR_ACTIVATION] = required_for_activation; | 209 task_set_collection[REQUIRED_FOR_ACTIVATION] = required_for_activation; |
210 queue->items.push_back( | 210 queue->items.push_back( |
211 RasterTaskQueue::Item(raster_tasks[i].get(), task_set_collection)); | 211 TileTaskQueue::Item(raster_tasks[i].get(), task_set_collection)); |
212 } | 212 } |
213 } | 213 } |
214 | 214 |
215 protected: | 215 protected: |
216 scoped_refptr<ContextProvider> context_provider_; | 216 scoped_refptr<ContextProvider> context_provider_; |
217 FakeOutputSurfaceClient output_surface_client_; | 217 FakeOutputSurfaceClient output_surface_client_; |
218 scoped_ptr<FakeOutputSurface> output_surface_; | 218 scoped_ptr<FakeOutputSurface> output_surface_; |
219 scoped_ptr<ResourceProvider> resource_provider_; | 219 scoped_ptr<ResourceProvider> resource_provider_; |
220 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 220 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
221 scoped_ptr<TaskGraphRunner> task_graph_runner_; | 221 scoped_ptr<TaskGraphRunner> task_graph_runner_; |
222 LapTimer timer_; | 222 LapTimer timer_; |
223 }; | 223 }; |
224 | 224 |
225 class RasterWorkerPoolPerfTest | 225 class TileTaskWorkerPoolPerfTest |
226 : public RasterWorkerPoolPerfTestBase, | 226 : public TileTaskWorkerPoolPerfTestBase, |
227 public testing::TestWithParam<RasterWorkerPoolType>, | 227 public testing::TestWithParam<TileTaskWorkerPoolType>, |
228 public RasterizerClient { | 228 public TileTaskRunnerClient { |
229 public: | 229 public: |
230 // Overridden from testing::Test: | 230 // Overridden from testing::Test: |
231 void SetUp() override { | 231 void SetUp() override { |
232 switch (GetParam()) { | 232 switch (GetParam()) { |
233 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: | 233 case TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER: |
234 Create3dOutputSurfaceAndResourceProvider(); | 234 Create3dOutputSurfaceAndResourceProvider(); |
235 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( | 235 tile_task_worker_pool_ = PixelBufferTileTaskWorkerPool::Create( |
236 task_runner_.get(), | 236 task_runner_.get(), task_graph_runner_.get(), |
237 task_graph_runner_.get(), | 237 context_provider_.get(), resource_provider_.get(), |
238 context_provider_.get(), | |
239 resource_provider_.get(), | |
240 std::numeric_limits<size_t>::max()); | 238 std::numeric_limits<size_t>::max()); |
241 break; | 239 break; |
242 case RASTER_WORKER_POOL_TYPE_ZERO_COPY: | 240 case TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY: |
243 Create3dOutputSurfaceAndResourceProvider(); | 241 Create3dOutputSurfaceAndResourceProvider(); |
244 raster_worker_pool_ = | 242 tile_task_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create( |
245 ZeroCopyRasterWorkerPool::Create(task_runner_.get(), | 243 task_runner_.get(), task_graph_runner_.get(), |
246 task_graph_runner_.get(), | 244 resource_provider_.get()); |
247 resource_provider_.get()); | |
248 break; | 245 break; |
249 case RASTER_WORKER_POOL_TYPE_ONE_COPY: | 246 case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY: |
250 Create3dOutputSurfaceAndResourceProvider(); | 247 Create3dOutputSurfaceAndResourceProvider(); |
251 staging_resource_pool_ = ResourcePool::Create( | 248 staging_resource_pool_ = ResourcePool::Create(resource_provider_.get(), |
252 resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888); | 249 GL_TEXTURE_2D, RGBA_8888); |
253 raster_worker_pool_ = | 250 tile_task_worker_pool_ = OneCopyTileTaskWorkerPool::Create( |
254 OneCopyRasterWorkerPool::Create(task_runner_.get(), | 251 task_runner_.get(), task_graph_runner_.get(), |
255 task_graph_runner_.get(), | 252 context_provider_.get(), resource_provider_.get(), |
256 context_provider_.get(), | 253 staging_resource_pool_.get()); |
257 resource_provider_.get(), | |
258 staging_resource_pool_.get()); | |
259 break; | 254 break; |
260 case RASTER_WORKER_POOL_TYPE_GPU: | 255 case TILE_TASK_WORKER_POOL_TYPE_GPU: |
261 Create3dOutputSurfaceAndResourceProvider(); | 256 Create3dOutputSurfaceAndResourceProvider(); |
262 raster_worker_pool_ = | 257 tile_task_worker_pool_ = GpuTileTaskWorkerPool::Create( |
263 GpuRasterWorkerPool::Create(task_runner_.get(), | 258 task_runner_.get(), context_provider_.get(), |
264 context_provider_.get(), | 259 resource_provider_.get(), false); |
265 resource_provider_.get(), | |
266 false); | |
267 break; | 260 break; |
268 case RASTER_WORKER_POOL_TYPE_BITMAP: | 261 case TILE_TASK_WORKER_POOL_TYPE_BITMAP: |
269 CreateSoftwareOutputSurfaceAndResourceProvider(); | 262 CreateSoftwareOutputSurfaceAndResourceProvider(); |
270 raster_worker_pool_ = | 263 tile_task_worker_pool_ = BitmapTileTaskWorkerPool::Create( |
271 BitmapRasterWorkerPool::Create(task_runner_.get(), | 264 task_runner_.get(), task_graph_runner_.get(), |
272 task_graph_runner_.get(), | 265 resource_provider_.get()); |
273 resource_provider_.get()); | |
274 break; | 266 break; |
275 } | 267 } |
276 | 268 |
277 DCHECK(raster_worker_pool_); | 269 DCHECK(tile_task_worker_pool_); |
278 raster_worker_pool_->AsRasterizer()->SetClient(this); | 270 tile_task_worker_pool_->AsTileTaskRunner()->SetClient(this); |
279 } | 271 } |
280 void TearDown() override { | 272 void TearDown() override { |
281 raster_worker_pool_->AsRasterizer()->Shutdown(); | 273 tile_task_worker_pool_->AsTileTaskRunner()->Shutdown(); |
282 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 274 tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
283 } | 275 } |
284 | 276 |
285 // Overriden from RasterizerClient: | 277 // Overriden from TileTaskRunnerClient: |
286 void DidFinishRunningTasks(TaskSet task_set) override { | 278 void DidFinishRunningTileTasks(TaskSet task_set) override { |
287 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 279 tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
288 } | 280 } |
289 TaskSetCollection TasksThatShouldBeForcedToComplete() const override { | 281 TaskSetCollection TasksThatShouldBeForcedToComplete() const override { |
290 return TaskSetCollection(); | 282 return TaskSetCollection(); |
291 } | 283 } |
292 | 284 |
293 void RunMessageLoopUntilAllTasksHaveCompleted() { | 285 void RunMessageLoopUntilAllTasksHaveCompleted() { |
294 task_graph_runner_->RunUntilIdle(); | 286 task_graph_runner_->RunUntilIdle(); |
295 task_runner_->RunUntilIdle(); | 287 task_runner_->RunUntilIdle(); |
296 } | 288 } |
297 | 289 |
298 void RunScheduleTasksTest(const std::string& test_name, | 290 void RunScheduleTasksTest(const std::string& test_name, |
299 unsigned num_raster_tasks, | 291 unsigned num_raster_tasks, |
300 unsigned num_image_decode_tasks) { | 292 unsigned num_image_decode_tasks) { |
301 ImageDecodeTask::Vector image_decode_tasks; | 293 ImageDecodeTask::Vector image_decode_tasks; |
302 RasterTaskVector raster_tasks; | 294 RasterTaskVector raster_tasks; |
303 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 295 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
304 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 296 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
305 | 297 |
306 // Avoid unnecessary heap allocations by reusing the same queue. | 298 // Avoid unnecessary heap allocations by reusing the same queue. |
307 RasterTaskQueue queue; | 299 TileTaskQueue queue; |
308 | 300 |
309 timer_.Reset(); | 301 timer_.Reset(); |
310 do { | 302 do { |
311 queue.Reset(); | 303 queue.Reset(); |
312 BuildRasterTaskQueue(&queue, raster_tasks); | 304 BuildTileTaskQueue(&queue, raster_tasks); |
313 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue); | 305 tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue); |
314 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 306 tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
315 timer_.NextLap(); | 307 timer_.NextLap(); |
316 } while (!timer_.HasTimeLimitExpired()); | 308 } while (!timer_.HasTimeLimitExpired()); |
317 | 309 |
318 RasterTaskQueue empty; | 310 TileTaskQueue empty; |
319 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty); | 311 tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty); |
320 RunMessageLoopUntilAllTasksHaveCompleted(); | 312 RunMessageLoopUntilAllTasksHaveCompleted(); |
321 | 313 |
322 perf_test::PrintResult("schedule_tasks", | 314 perf_test::PrintResult("schedule_tasks", TestModifierString(), test_name, |
323 TestModifierString(), | 315 timer_.LapsPerSecond(), "runs/s", true); |
324 test_name, | |
325 timer_.LapsPerSecond(), | |
326 "runs/s", | |
327 true); | |
328 } | 316 } |
329 | 317 |
330 void RunScheduleAlternateTasksTest(const std::string& test_name, | 318 void RunScheduleAlternateTasksTest(const std::string& test_name, |
331 unsigned num_raster_tasks, | 319 unsigned num_raster_tasks, |
332 unsigned num_image_decode_tasks) { | 320 unsigned num_image_decode_tasks) { |
333 const size_t kNumVersions = 2; | 321 const size_t kNumVersions = 2; |
334 ImageDecodeTask::Vector image_decode_tasks[kNumVersions]; | 322 ImageDecodeTask::Vector image_decode_tasks[kNumVersions]; |
335 RasterTaskVector raster_tasks[kNumVersions]; | 323 RasterTaskVector raster_tasks[kNumVersions]; |
336 for (size_t i = 0; i < kNumVersions; ++i) { | 324 for (size_t i = 0; i < kNumVersions; ++i) { |
337 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); | 325 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); |
338 CreateRasterTasks( | 326 CreateRasterTasks(num_raster_tasks, image_decode_tasks[i], |
339 num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]); | 327 &raster_tasks[i]); |
340 } | 328 } |
341 | 329 |
342 // Avoid unnecessary heap allocations by reusing the same queue. | 330 // Avoid unnecessary heap allocations by reusing the same queue. |
343 RasterTaskQueue queue; | 331 TileTaskQueue queue; |
344 | 332 |
345 size_t count = 0; | 333 size_t count = 0; |
346 timer_.Reset(); | 334 timer_.Reset(); |
347 do { | 335 do { |
348 queue.Reset(); | 336 queue.Reset(); |
349 BuildRasterTaskQueue(&queue, raster_tasks[count % kNumVersions]); | 337 BuildTileTaskQueue(&queue, raster_tasks[count % kNumVersions]); |
350 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue); | 338 tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue); |
351 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks(); | 339 tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks(); |
352 ++count; | 340 ++count; |
353 timer_.NextLap(); | 341 timer_.NextLap(); |
354 } while (!timer_.HasTimeLimitExpired()); | 342 } while (!timer_.HasTimeLimitExpired()); |
355 | 343 |
356 RasterTaskQueue empty; | 344 TileTaskQueue empty; |
357 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty); | 345 tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty); |
358 RunMessageLoopUntilAllTasksHaveCompleted(); | 346 RunMessageLoopUntilAllTasksHaveCompleted(); |
359 | 347 |
360 perf_test::PrintResult("schedule_alternate_tasks", | 348 perf_test::PrintResult("schedule_alternate_tasks", TestModifierString(), |
361 TestModifierString(), | 349 test_name, timer_.LapsPerSecond(), "runs/s", true); |
362 test_name, | |
363 timer_.LapsPerSecond(), | |
364 "runs/s", | |
365 true); | |
366 } | 350 } |
367 | 351 |
368 void RunScheduleAndExecuteTasksTest(const std::string& test_name, | 352 void RunScheduleAndExecuteTasksTest(const std::string& test_name, |
369 unsigned num_raster_tasks, | 353 unsigned num_raster_tasks, |
370 unsigned num_image_decode_tasks) { | 354 unsigned num_image_decode_tasks) { |
371 ImageDecodeTask::Vector image_decode_tasks; | 355 ImageDecodeTask::Vector image_decode_tasks; |
372 RasterTaskVector raster_tasks; | 356 RasterTaskVector raster_tasks; |
373 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 357 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
374 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 358 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
375 | 359 |
376 // Avoid unnecessary heap allocations by reusing the same queue. | 360 // Avoid unnecessary heap allocations by reusing the same queue. |
377 RasterTaskQueue queue; | 361 TileTaskQueue queue; |
378 | 362 |
379 timer_.Reset(); | 363 timer_.Reset(); |
380 do { | 364 do { |
381 queue.Reset(); | 365 queue.Reset(); |
382 BuildRasterTaskQueue(&queue, raster_tasks); | 366 BuildTileTaskQueue(&queue, raster_tasks); |
383 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue); | 367 tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue); |
384 RunMessageLoopUntilAllTasksHaveCompleted(); | 368 RunMessageLoopUntilAllTasksHaveCompleted(); |
385 timer_.NextLap(); | 369 timer_.NextLap(); |
386 } while (!timer_.HasTimeLimitExpired()); | 370 } while (!timer_.HasTimeLimitExpired()); |
387 | 371 |
388 RasterTaskQueue empty; | 372 TileTaskQueue empty; |
389 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty); | 373 tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty); |
390 RunMessageLoopUntilAllTasksHaveCompleted(); | 374 RunMessageLoopUntilAllTasksHaveCompleted(); |
391 | 375 |
392 perf_test::PrintResult("schedule_and_execute_tasks", | 376 perf_test::PrintResult("schedule_and_execute_tasks", TestModifierString(), |
393 TestModifierString(), | 377 test_name, timer_.LapsPerSecond(), "runs/s", true); |
394 test_name, | |
395 timer_.LapsPerSecond(), | |
396 "runs/s", | |
397 true); | |
398 } | 378 } |
399 | 379 |
400 private: | 380 private: |
401 void Create3dOutputSurfaceAndResourceProvider() { | 381 void Create3dOutputSurfaceAndResourceProvider() { |
402 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); | 382 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); |
403 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 383 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
404 resource_provider_ = ResourceProvider::Create(output_surface_.get(), | 384 resource_provider_ = ResourceProvider::Create(output_surface_.get(), NULL, |
405 NULL, | |
406 &gpu_memory_buffer_manager_, | 385 &gpu_memory_buffer_manager_, |
407 NULL, | 386 NULL, 0, false, 1).Pass(); |
408 0, | |
409 false, | |
410 1).Pass(); | |
411 } | 387 } |
412 | 388 |
413 void CreateSoftwareOutputSurfaceAndResourceProvider() { | 389 void CreateSoftwareOutputSurfaceAndResourceProvider() { |
414 output_surface_ = FakeOutputSurface::CreateSoftware( | 390 output_surface_ = FakeOutputSurface::CreateSoftware( |
415 make_scoped_ptr(new SoftwareOutputDevice)); | 391 make_scoped_ptr(new SoftwareOutputDevice)); |
416 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 392 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
417 resource_provider_ = ResourceProvider::Create(output_surface_.get(), | 393 resource_provider_ = |
418 &shared_bitmap_manager_, | 394 ResourceProvider::Create(output_surface_.get(), &shared_bitmap_manager_, |
419 NULL, | 395 NULL, NULL, 0, false, 1).Pass(); |
420 NULL, | |
421 0, | |
422 false, | |
423 1).Pass(); | |
424 } | 396 } |
425 | 397 |
426 std::string TestModifierString() const { | 398 std::string TestModifierString() const { |
427 switch (GetParam()) { | 399 switch (GetParam()) { |
428 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: | 400 case TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER: |
429 return std::string("_pixel_raster_worker_pool"); | 401 return std::string("_pixel_tile_task_worker_pool"); |
430 case RASTER_WORKER_POOL_TYPE_ZERO_COPY: | 402 case TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY: |
431 return std::string("_zero_copy_raster_worker_pool"); | 403 return std::string("_zero_copy_tile_task_worker_pool"); |
432 case RASTER_WORKER_POOL_TYPE_ONE_COPY: | 404 case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY: |
433 return std::string("_one_copy_raster_worker_pool"); | 405 return std::string("_one_copy_tile_task_worker_pool"); |
434 case RASTER_WORKER_POOL_TYPE_GPU: | 406 case TILE_TASK_WORKER_POOL_TYPE_GPU: |
435 return std::string("_gpu_raster_worker_pool"); | 407 return std::string("_gpu_tile_task_worker_pool"); |
436 case RASTER_WORKER_POOL_TYPE_BITMAP: | 408 case TILE_TASK_WORKER_POOL_TYPE_BITMAP: |
437 return std::string("_bitmap_raster_worker_pool"); | 409 return std::string("_bitmap_tile_task_worker_pool"); |
438 } | 410 } |
439 NOTREACHED(); | 411 NOTREACHED(); |
440 return std::string(); | 412 return std::string(); |
441 } | 413 } |
442 | 414 |
443 scoped_ptr<ResourcePool> staging_resource_pool_; | 415 scoped_ptr<ResourcePool> staging_resource_pool_; |
444 scoped_ptr<RasterWorkerPool> raster_worker_pool_; | 416 scoped_ptr<TileTaskWorkerPool> tile_task_worker_pool_; |
445 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | 417 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |
446 TestSharedBitmapManager shared_bitmap_manager_; | 418 TestSharedBitmapManager shared_bitmap_manager_; |
447 }; | 419 }; |
448 | 420 |
449 TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) { | 421 TEST_P(TileTaskWorkerPoolPerfTest, ScheduleTasks) { |
450 RunScheduleTasksTest("1_0", 1, 0); | 422 RunScheduleTasksTest("1_0", 1, 0); |
451 RunScheduleTasksTest("32_0", 32, 0); | 423 RunScheduleTasksTest("32_0", 32, 0); |
452 RunScheduleTasksTest("1_1", 1, 1); | 424 RunScheduleTasksTest("1_1", 1, 1); |
453 RunScheduleTasksTest("32_1", 32, 1); | 425 RunScheduleTasksTest("32_1", 32, 1); |
454 RunScheduleTasksTest("1_4", 1, 4); | 426 RunScheduleTasksTest("1_4", 1, 4); |
455 RunScheduleTasksTest("32_4", 32, 4); | 427 RunScheduleTasksTest("32_4", 32, 4); |
456 } | 428 } |
457 | 429 |
458 TEST_P(RasterWorkerPoolPerfTest, ScheduleAlternateTasks) { | 430 TEST_P(TileTaskWorkerPoolPerfTest, ScheduleAlternateTasks) { |
459 RunScheduleAlternateTasksTest("1_0", 1, 0); | 431 RunScheduleAlternateTasksTest("1_0", 1, 0); |
460 RunScheduleAlternateTasksTest("32_0", 32, 0); | 432 RunScheduleAlternateTasksTest("32_0", 32, 0); |
461 RunScheduleAlternateTasksTest("1_1", 1, 1); | 433 RunScheduleAlternateTasksTest("1_1", 1, 1); |
462 RunScheduleAlternateTasksTest("32_1", 32, 1); | 434 RunScheduleAlternateTasksTest("32_1", 32, 1); |
463 RunScheduleAlternateTasksTest("1_4", 1, 4); | 435 RunScheduleAlternateTasksTest("1_4", 1, 4); |
464 RunScheduleAlternateTasksTest("32_4", 32, 4); | 436 RunScheduleAlternateTasksTest("32_4", 32, 4); |
465 } | 437 } |
466 | 438 |
467 TEST_P(RasterWorkerPoolPerfTest, ScheduleAndExecuteTasks) { | 439 TEST_P(TileTaskWorkerPoolPerfTest, ScheduleAndExecuteTasks) { |
468 RunScheduleAndExecuteTasksTest("1_0", 1, 0); | 440 RunScheduleAndExecuteTasksTest("1_0", 1, 0); |
469 RunScheduleAndExecuteTasksTest("32_0", 32, 0); | 441 RunScheduleAndExecuteTasksTest("32_0", 32, 0); |
470 RunScheduleAndExecuteTasksTest("1_1", 1, 1); | 442 RunScheduleAndExecuteTasksTest("1_1", 1, 1); |
471 RunScheduleAndExecuteTasksTest("32_1", 32, 1); | 443 RunScheduleAndExecuteTasksTest("32_1", 32, 1); |
472 RunScheduleAndExecuteTasksTest("1_4", 1, 4); | 444 RunScheduleAndExecuteTasksTest("1_4", 1, 4); |
473 RunScheduleAndExecuteTasksTest("32_4", 32, 4); | 445 RunScheduleAndExecuteTasksTest("32_4", 32, 4); |
474 } | 446 } |
475 | 447 |
476 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests, | 448 INSTANTIATE_TEST_CASE_P( |
477 RasterWorkerPoolPerfTest, | 449 TileTaskWorkerPoolPerfTests, |
478 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, | 450 TileTaskWorkerPoolPerfTest, |
479 RASTER_WORKER_POOL_TYPE_ZERO_COPY, | 451 ::testing::Values(TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER, |
480 RASTER_WORKER_POOL_TYPE_ONE_COPY, | 452 TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY, |
481 RASTER_WORKER_POOL_TYPE_GPU, | 453 TILE_TASK_WORKER_POOL_TYPE_ONE_COPY, |
482 RASTER_WORKER_POOL_TYPE_BITMAP)); | 454 TILE_TASK_WORKER_POOL_TYPE_GPU, |
| 455 TILE_TASK_WORKER_POOL_TYPE_BITMAP)); |
483 | 456 |
484 class RasterWorkerPoolCommonPerfTest : public RasterWorkerPoolPerfTestBase, | 457 class TileTaskWorkerPoolCommonPerfTest : public TileTaskWorkerPoolPerfTestBase, |
485 public testing::Test { | 458 public testing::Test { |
486 public: | 459 public: |
487 // Overridden from testing::Test: | 460 // Overridden from testing::Test: |
488 void SetUp() override { | 461 void SetUp() override { |
489 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); | 462 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); |
490 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 463 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
491 resource_provider_ = | 464 resource_provider_ = |
492 ResourceProvider::Create( | 465 ResourceProvider::Create(output_surface_.get(), NULL, NULL, NULL, 0, |
493 output_surface_.get(), NULL, NULL, NULL, 0, false, 1).Pass(); | 466 false, 1).Pass(); |
494 } | 467 } |
495 | 468 |
496 void RunBuildRasterTaskQueueTest(const std::string& test_name, | 469 void RunBuildTileTaskQueueTest(const std::string& test_name, |
497 unsigned num_raster_tasks, | 470 unsigned num_raster_tasks, |
498 unsigned num_image_decode_tasks) { | 471 unsigned num_image_decode_tasks) { |
499 ImageDecodeTask::Vector image_decode_tasks; | 472 ImageDecodeTask::Vector image_decode_tasks; |
500 RasterTaskVector raster_tasks; | 473 RasterTaskVector raster_tasks; |
501 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); | 474 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); |
502 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); | 475 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); |
503 | 476 |
504 // Avoid unnecessary heap allocations by reusing the same queue. | 477 // Avoid unnecessary heap allocations by reusing the same queue. |
505 RasterTaskQueue queue; | 478 TileTaskQueue queue; |
506 | 479 |
507 timer_.Reset(); | 480 timer_.Reset(); |
508 do { | 481 do { |
509 queue.Reset(); | 482 queue.Reset(); |
510 BuildRasterTaskQueue(&queue, raster_tasks); | 483 BuildTileTaskQueue(&queue, raster_tasks); |
511 timer_.NextLap(); | 484 timer_.NextLap(); |
512 } while (!timer_.HasTimeLimitExpired()); | 485 } while (!timer_.HasTimeLimitExpired()); |
513 | 486 |
514 perf_test::PrintResult("build_raster_task_queue", | 487 perf_test::PrintResult("build_raster_task_queue", "", test_name, |
515 "", | 488 timer_.LapsPerSecond(), "runs/s", true); |
516 test_name, | |
517 timer_.LapsPerSecond(), | |
518 "runs/s", | |
519 true); | |
520 } | 489 } |
521 }; | 490 }; |
522 | 491 |
523 TEST_F(RasterWorkerPoolCommonPerfTest, BuildRasterTaskQueue) { | 492 TEST_F(TileTaskWorkerPoolCommonPerfTest, BuildTileTaskQueue) { |
524 RunBuildRasterTaskQueueTest("1_0", 1, 0); | 493 RunBuildTileTaskQueueTest("1_0", 1, 0); |
525 RunBuildRasterTaskQueueTest("32_0", 32, 0); | 494 RunBuildTileTaskQueueTest("32_0", 32, 0); |
526 RunBuildRasterTaskQueueTest("1_1", 1, 1); | 495 RunBuildTileTaskQueueTest("1_1", 1, 1); |
527 RunBuildRasterTaskQueueTest("32_1", 32, 1); | 496 RunBuildTileTaskQueueTest("32_1", 32, 1); |
528 RunBuildRasterTaskQueueTest("1_4", 1, 4); | 497 RunBuildTileTaskQueueTest("1_4", 1, 4); |
529 RunBuildRasterTaskQueueTest("32_4", 32, 4); | 498 RunBuildTileTaskQueueTest("32_4", 32, 4); |
530 } | 499 } |
531 | 500 |
532 } // namespace | 501 } // namespace |
533 } // namespace cc | 502 } // namespace cc |
OLD | NEW |