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

Side by Side Diff: cc/raster/raster_buffer_provider_perftest.cc

Issue 1866043006: cc: Remove ScheduleOnOriginThread() and CompleteOnOriginThread(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 4 years, 7 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
« no previous file with comments | « no previous file | cc/raster/raster_buffer_provider_unittest.cc » ('j') | cc/raster/task.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/test/test_simple_task_runner.h" 10 #include "base/test/test_simple_task_runner.h"
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 RASTER_BUFFER_PROVIDER_TYPE_GPU, 116 RASTER_BUFFER_PROVIDER_TYPE_GPU,
117 RASTER_BUFFER_PROVIDER_TYPE_BITMAP 117 RASTER_BUFFER_PROVIDER_TYPE_BITMAP
118 }; 118 };
119 119
120 static const int kTimeLimitMillis = 2000; 120 static const int kTimeLimitMillis = 2000;
121 static const int kWarmupRuns = 5; 121 static const int kWarmupRuns = 5;
122 static const int kTimeCheckInterval = 10; 122 static const int kTimeCheckInterval = 10;
123 123
124 class PerfImageDecodeTaskImpl : public TileTask { 124 class PerfImageDecodeTaskImpl : public TileTask {
125 public: 125 public:
126 PerfImageDecodeTaskImpl() : TileTask(true) {} 126 PerfImageDecodeTaskImpl() : TileTask(TileTask::Type::IMAGE_DECODE, true) {}
127 127
128 // Overridden from Task: 128 // Overridden from Task:
129 void RunOnWorkerThread() override {} 129 void RunOnWorkerThread() override {}
130 130
131 // Overridden from TileTask:
132 void ScheduleOnOriginThread(RasterBufferProvider* provider) override {}
133 void CompleteOnOriginThread(RasterBufferProvider* provider) override {
134 Reset();
135 }
136
137 void Reset() {
138 state().Reset();
139 did_complete_ = false;
140 }
141
142 protected: 131 protected:
143 ~PerfImageDecodeTaskImpl() override {} 132 ~PerfImageDecodeTaskImpl() override {}
144 133
145 private: 134 private:
146 DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl); 135 DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl);
147 }; 136 };
148 137
149 class PerfRasterTaskImpl : public TileTask { 138 class PerfRasterTaskImpl : public TileTask {
150 public: 139 public:
151 PerfRasterTaskImpl(std::unique_ptr<ScopedResource> resource, 140 PerfRasterTaskImpl(std::unique_ptr<ScopedResource> resource,
141 std::unique_ptr<RasterBuffer> raster_buffer,
152 TileTask::Vector* dependencies) 142 TileTask::Vector* dependencies)
153 : TileTask(true, dependencies), resource_(std::move(resource)) {} 143 : TileTask(TileTask::Type::RASTER, true, dependencies),
144 resource_(std::move(resource)),
145 raster_buffer_(std::move(raster_buffer)) {}
154 146
155 // Overridden from Task: 147 // Overridden from Task:
156 void RunOnWorkerThread() override {} 148 void RunOnWorkerThread() override {}
157 149
158 // Overridden from TileTask:
159 void ScheduleOnOriginThread(RasterBufferProvider* provider) override {
160 // No tile ids are given to support partial updates.
161 raster_buffer_ = provider->AcquireBufferForRaster(resource_.get(), 0, 0);
162 }
163 void CompleteOnOriginThread(RasterBufferProvider* provider) override {
164 provider->ReleaseBufferForRaster(std::move(raster_buffer_));
165 Reset();
166 }
167
168 void Reset() {
169 state().Reset();
170 did_complete_ = false;
171 }
172
173 protected: 150 protected:
174 ~PerfRasterTaskImpl() override {} 151 ~PerfRasterTaskImpl() override {}
175 152
176 private: 153 private:
154 friend class RasterBufferProviderPerfTest;
155
177 std::unique_ptr<ScopedResource> resource_; 156 std::unique_ptr<ScopedResource> resource_;
178 std::unique_ptr<RasterBuffer> raster_buffer_; 157 std::unique_ptr<RasterBuffer> raster_buffer_;
179 158
180 DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl); 159 DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl);
181 }; 160 };
182 161
183 class RasterBufferProviderPerfTestBase { 162 class RasterBufferProviderPerfTestBase {
184 public: 163 public:
185 typedef std::vector<scoped_refptr<TileTask>> RasterTaskVector; 164 typedef std::vector<scoped_refptr<TileTask>> RasterTaskVector;
186 165
187 enum NamedTaskSet { REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW, ALL }; 166 enum NamedTaskSet { REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW, ALL };
188 167
189 RasterBufferProviderPerfTestBase() 168 RasterBufferProviderPerfTestBase()
190 : context_provider_(make_scoped_refptr(new PerfContextProvider)), 169 : context_provider_(make_scoped_refptr(new PerfContextProvider)),
191 task_runner_(new base::TestSimpleTaskRunner), 170 task_runner_(new base::TestSimpleTaskRunner),
192 task_graph_runner_(new SynchronousTaskGraphRunner), 171 task_graph_runner_(new SynchronousTaskGraphRunner),
193 timer_(kWarmupRuns, 172 timer_(kWarmupRuns,
194 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), 173 base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
195 kTimeCheckInterval) {} 174 kTimeCheckInterval) {}
196 175
197 void CreateImageDecodeTasks(unsigned num_image_decode_tasks, 176 void CreateImageDecodeTasks(unsigned num_image_decode_tasks,
198 TileTask::Vector* image_decode_tasks) { 177 TileTask::Vector* image_decode_tasks) {
199 for (unsigned i = 0; i < num_image_decode_tasks; ++i) 178 for (unsigned i = 0; i < num_image_decode_tasks; ++i)
200 image_decode_tasks->push_back(new PerfImageDecodeTaskImpl); 179 image_decode_tasks->push_back(new PerfImageDecodeTaskImpl);
201 } 180 }
202 181
203 void CreateRasterTasks(unsigned num_raster_tasks, 182 void CreateRasterTasks(TileTaskManager* tile_task_manager,
183 unsigned num_raster_tasks,
204 const TileTask::Vector& image_decode_tasks, 184 const TileTask::Vector& image_decode_tasks,
205 RasterTaskVector* raster_tasks) { 185 RasterTaskVector* raster_tasks) {
206 const gfx::Size size(1, 1); 186 const gfx::Size size(1, 1);
207 187
208 for (unsigned i = 0; i < num_raster_tasks; ++i) { 188 for (unsigned i = 0; i < num_raster_tasks; ++i) {
209 std::unique_ptr<ScopedResource> resource( 189 std::unique_ptr<ScopedResource> resource(
210 ScopedResource::Create(resource_provider_.get())); 190 ScopedResource::Create(resource_provider_.get()));
211 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, 191 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
212 RGBA_8888); 192 RGBA_8888);
213 193
194 // No tile ids are given to support partial updates.
195 std::unique_ptr<RasterBuffer> raster_buffer;
196 if (tile_task_manager) {
197 raster_buffer = tile_task_manager->GetRasterBufferProvider()
198 ->AcquireBufferForRaster(resource.get(), 0, 0);
199 }
214 TileTask::Vector dependencies = image_decode_tasks; 200 TileTask::Vector dependencies = image_decode_tasks;
215 raster_tasks->push_back( 201 raster_tasks->push_back(new PerfRasterTaskImpl(
216 new PerfRasterTaskImpl(std::move(resource), &dependencies)); 202 std::move(resource), std::move(raster_buffer), &dependencies));
217 } 203 }
218 } 204 }
219 205
220 void BuildTileTaskGraph(TaskGraph* graph, 206 void BuildTileTaskGraph(TaskGraph* graph,
221 const RasterTaskVector& raster_tasks) { 207 const RasterTaskVector& raster_tasks) {
222 uint16_t priority = 0; 208 uint16_t priority = 0;
223 209
224 for (auto& raster_task : raster_tasks) { 210 for (auto& raster_task : raster_tasks) {
225 priority++; 211 priority++;
226 212
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 break; 276 break;
291 } 277 }
292 278
293 DCHECK(raster_buffer_provider); 279 DCHECK(raster_buffer_provider);
294 280
295 tile_task_manager_ = TileTaskManagerImpl::Create( 281 tile_task_manager_ = TileTaskManagerImpl::Create(
296 std::move(raster_buffer_provider), task_graph_runner_.get()); 282 std::move(raster_buffer_provider), task_graph_runner_.get());
297 } 283 }
298 void TearDown() override { 284 void TearDown() override {
299 tile_task_manager_->Shutdown(); 285 tile_task_manager_->Shutdown();
300 tile_task_manager_->CheckForCompletedTasks(); 286 CheckForCompletedTasks();
301 } 287 }
302 288
303 void RunMessageLoopUntilAllTasksHaveCompleted() { 289 void RunMessageLoopUntilAllTasksHaveCompleted() {
304 task_graph_runner_->RunUntilIdle(); 290 task_graph_runner_->RunUntilIdle();
305 task_runner_->RunUntilIdle(); 291 task_runner_->RunUntilIdle();
306 } 292 }
307 293
308 void RunScheduleTasksTest(const std::string& test_name, 294 void RunScheduleTasksTest(const std::string& test_name,
309 unsigned num_raster_tasks, 295 unsigned num_raster_tasks,
310 unsigned num_image_decode_tasks) { 296 unsigned num_image_decode_tasks) {
311 TileTask::Vector image_decode_tasks; 297 TileTask::Vector image_decode_tasks;
312 RasterTaskVector raster_tasks; 298 RasterTaskVector raster_tasks;
313 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); 299 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
314 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); 300 CreateRasterTasks(tile_task_manager_.get(), num_raster_tasks,
301 image_decode_tasks, &raster_tasks);
315 302
316 // Avoid unnecessary heap allocations by reusing the same graph. 303 // Avoid unnecessary heap allocations by reusing the same graph.
317 TaskGraph graph; 304 TaskGraph graph;
318 305
319 timer_.Reset(); 306 timer_.Reset();
320 do { 307 do {
321 graph.Reset(); 308 graph.Reset();
322 BuildTileTaskGraph(&graph, raster_tasks); 309 BuildTileTaskGraph(&graph, raster_tasks);
323 tile_task_manager_->ScheduleTasks(&graph); 310 tile_task_manager_->ScheduleTasks(&graph);
324 tile_task_manager_->CheckForCompletedTasks(); 311 CheckForCompletedTasks();
325 timer_.NextLap(); 312 timer_.NextLap();
326 } while (!timer_.HasTimeLimitExpired()); 313 } while (!timer_.HasTimeLimitExpired());
327 314
328 TaskGraph empty; 315 TaskGraph empty;
329 tile_task_manager_->ScheduleTasks(&empty); 316 tile_task_manager_->ScheduleTasks(&empty);
330 RunMessageLoopUntilAllTasksHaveCompleted(); 317 RunMessageLoopUntilAllTasksHaveCompleted();
331 318
332 perf_test::PrintResult("schedule_tasks", TestModifierString(), test_name, 319 perf_test::PrintResult("schedule_tasks", TestModifierString(), test_name,
333 timer_.LapsPerSecond(), "runs/s", true); 320 timer_.LapsPerSecond(), "runs/s", true);
334 } 321 }
335 322
336 void RunScheduleAlternateTasksTest(const std::string& test_name, 323 void RunScheduleAlternateTasksTest(const std::string& test_name,
337 unsigned num_raster_tasks, 324 unsigned num_raster_tasks,
338 unsigned num_image_decode_tasks) { 325 unsigned num_image_decode_tasks) {
339 const size_t kNumVersions = 2; 326 const size_t kNumVersions = 2;
340 TileTask::Vector image_decode_tasks[kNumVersions]; 327 TileTask::Vector image_decode_tasks[kNumVersions];
341 RasterTaskVector raster_tasks[kNumVersions]; 328 RasterTaskVector raster_tasks[kNumVersions];
342 for (size_t i = 0; i < kNumVersions; ++i) { 329 for (size_t i = 0; i < kNumVersions; ++i) {
343 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]); 330 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]);
344 CreateRasterTasks(num_raster_tasks, image_decode_tasks[i], 331 CreateRasterTasks(tile_task_manager_.get(), num_raster_tasks,
345 &raster_tasks[i]); 332 image_decode_tasks[i], &raster_tasks[i]);
346 } 333 }
347 334
348 // Avoid unnecessary heap allocations by reusing the same graph. 335 // Avoid unnecessary heap allocations by reusing the same graph.
349 TaskGraph graph; 336 TaskGraph graph;
350 337
351 size_t count = 0; 338 size_t count = 0;
352 timer_.Reset(); 339 timer_.Reset();
353 do { 340 do {
354 graph.Reset(); 341 graph.Reset();
355 BuildTileTaskGraph(&graph, raster_tasks[count % kNumVersions]); 342 BuildTileTaskGraph(&graph, raster_tasks[count % kNumVersions]);
356 tile_task_manager_->ScheduleTasks(&graph); 343 tile_task_manager_->ScheduleTasks(&graph);
357 tile_task_manager_->CheckForCompletedTasks(); 344 CheckForCompletedTasks();
358 ++count; 345 ++count;
359 timer_.NextLap(); 346 timer_.NextLap();
360 } while (!timer_.HasTimeLimitExpired()); 347 } while (!timer_.HasTimeLimitExpired());
361 348
362 TaskGraph empty; 349 TaskGraph empty;
363 tile_task_manager_->ScheduleTasks(&empty); 350 tile_task_manager_->ScheduleTasks(&empty);
364 RunMessageLoopUntilAllTasksHaveCompleted(); 351 RunMessageLoopUntilAllTasksHaveCompleted();
365 352
366 perf_test::PrintResult("schedule_alternate_tasks", TestModifierString(), 353 perf_test::PrintResult("schedule_alternate_tasks", TestModifierString(),
367 test_name, timer_.LapsPerSecond(), "runs/s", true); 354 test_name, timer_.LapsPerSecond(), "runs/s", true);
368 } 355 }
369 356
370 void RunScheduleAndExecuteTasksTest(const std::string& test_name, 357 void RunScheduleAndExecuteTasksTest(const std::string& test_name,
371 unsigned num_raster_tasks, 358 unsigned num_raster_tasks,
372 unsigned num_image_decode_tasks) { 359 unsigned num_image_decode_tasks) {
373 TileTask::Vector image_decode_tasks; 360 TileTask::Vector image_decode_tasks;
374 RasterTaskVector raster_tasks; 361 RasterTaskVector raster_tasks;
375 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); 362 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
376 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); 363 CreateRasterTasks(tile_task_manager_.get(), num_raster_tasks,
364 image_decode_tasks, &raster_tasks);
377 365
378 // Avoid unnecessary heap allocations by reusing the same graph. 366 // Avoid unnecessary heap allocations by reusing the same graph.
379 TaskGraph graph; 367 TaskGraph graph;
380 368
381 timer_.Reset(); 369 timer_.Reset();
382 do { 370 do {
383 graph.Reset(); 371 graph.Reset();
384 BuildTileTaskGraph(&graph, raster_tasks); 372 BuildTileTaskGraph(&graph, raster_tasks);
385 tile_task_manager_->ScheduleTasks(&graph); 373 tile_task_manager_->ScheduleTasks(&graph);
386 RunMessageLoopUntilAllTasksHaveCompleted(); 374 RunMessageLoopUntilAllTasksHaveCompleted();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 return std::string("_one_copy_raster_buffer_provider"); 407 return std::string("_one_copy_raster_buffer_provider");
420 case RASTER_BUFFER_PROVIDER_TYPE_GPU: 408 case RASTER_BUFFER_PROVIDER_TYPE_GPU:
421 return std::string("_gpu_raster_buffer_provider"); 409 return std::string("_gpu_raster_buffer_provider");
422 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP: 410 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
423 return std::string("_bitmap_raster_buffer_provider"); 411 return std::string("_bitmap_raster_buffer_provider");
424 } 412 }
425 NOTREACHED(); 413 NOTREACHED();
426 return std::string(); 414 return std::string();
427 } 415 }
428 416
417 void CheckForCompletedTasks() {
418 Task::Vector completed_tasks;
419 tile_task_manager_->CollectCompletedTasks(&completed_tasks);
420
421 for (auto task : completed_tasks) {
422 TileTask* tile_task = static_cast<TileTask*>(task.get());
423 switch (tile_task->type()) {
424 case TileTask::Type::RASTER:
425 OnRasterTaskCompleted(tile_task);
426 break;
427 case TileTask::Type::IMAGE_DECODE:
428 break;
429 default:
430 NOTREACHED();
431 }
432
433 // Instead of calling DidComplete(), call Reset() as same task would be
434 // reused as if new.
435 task->state().Reset();
436 }
437
438 completed_tasks.clear();
439 }
440
441 void OnRasterTaskCompleted(TileTask* task) {
442 PerfRasterTaskImpl* raster_task = static_cast<PerfRasterTaskImpl*>(task);
443 tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster(
444 std::move(raster_task->raster_buffer_));
445 }
446
429 std::unique_ptr<TileTaskManager> tile_task_manager_; 447 std::unique_ptr<TileTaskManager> tile_task_manager_;
430 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; 448 TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
431 TestSharedBitmapManager shared_bitmap_manager_; 449 TestSharedBitmapManager shared_bitmap_manager_;
432 }; 450 };
433 451
434 TEST_P(RasterBufferProviderPerfTest, ScheduleTasks) { 452 TEST_P(RasterBufferProviderPerfTest, ScheduleTasks) {
435 RunScheduleTasksTest("1_0", 1, 0); 453 RunScheduleTasksTest("1_0", 1, 0);
436 RunScheduleTasksTest("32_0", 32, 0); 454 RunScheduleTasksTest("32_0", 32, 0);
437 RunScheduleTasksTest("1_1", 1, 1); 455 RunScheduleTasksTest("1_1", 1, 1);
438 RunScheduleTasksTest("32_1", 32, 1); 456 RunScheduleTasksTest("32_1", 32, 1);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 resource_provider_ = 494 resource_provider_ =
477 FakeResourceProvider::Create(output_surface_.get(), nullptr); 495 FakeResourceProvider::Create(output_surface_.get(), nullptr);
478 } 496 }
479 497
480 void RunBuildTileTaskGraphTest(const std::string& test_name, 498 void RunBuildTileTaskGraphTest(const std::string& test_name,
481 unsigned num_raster_tasks, 499 unsigned num_raster_tasks,
482 unsigned num_image_decode_tasks) { 500 unsigned num_image_decode_tasks) {
483 TileTask::Vector image_decode_tasks; 501 TileTask::Vector image_decode_tasks;
484 RasterTaskVector raster_tasks; 502 RasterTaskVector raster_tasks;
485 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); 503 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
486 CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks); 504 CreateRasterTasks(nullptr, num_raster_tasks, image_decode_tasks,
505 &raster_tasks);
487 506
488 // Avoid unnecessary heap allocations by reusing the same graph. 507 // Avoid unnecessary heap allocations by reusing the same graph.
489 TaskGraph graph; 508 TaskGraph graph;
490 509
491 timer_.Reset(); 510 timer_.Reset();
492 do { 511 do {
493 graph.Reset(); 512 graph.Reset();
494 BuildTileTaskGraph(&graph, raster_tasks); 513 BuildTileTaskGraph(&graph, raster_tasks);
495 timer_.NextLap(); 514 timer_.NextLap();
496 } while (!timer_.HasTimeLimitExpired()); 515 } while (!timer_.HasTimeLimitExpired());
497 516
498 perf_test::PrintResult("build_raster_task_graph", "", test_name, 517 perf_test::PrintResult("build_raster_task_graph", "", test_name,
499 timer_.LapsPerSecond(), "runs/s", true); 518 timer_.LapsPerSecond(), "runs/s", true);
500 } 519 }
501 }; 520 };
502 521
503 TEST_F(RasterBufferProviderCommonPerfTest, BuildTileTaskGraph) { 522 TEST_F(RasterBufferProviderCommonPerfTest, BuildTileTaskGraph) {
504 RunBuildTileTaskGraphTest("1_0", 1, 0); 523 RunBuildTileTaskGraphTest("1_0", 1, 0);
505 RunBuildTileTaskGraphTest("32_0", 32, 0); 524 RunBuildTileTaskGraphTest("32_0", 32, 0);
506 RunBuildTileTaskGraphTest("1_1", 1, 1); 525 RunBuildTileTaskGraphTest("1_1", 1, 1);
507 RunBuildTileTaskGraphTest("32_1", 32, 1); 526 RunBuildTileTaskGraphTest("32_1", 32, 1);
508 RunBuildTileTaskGraphTest("1_4", 1, 4); 527 RunBuildTileTaskGraphTest("1_4", 1, 4);
509 RunBuildTileTaskGraphTest("32_4", 32, 4); 528 RunBuildTileTaskGraphTest("32_4", 32, 4);
510 } 529 }
511 530
512 } // namespace 531 } // namespace
513 } // namespace cc 532 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/raster/raster_buffer_provider_unittest.cc » ('j') | cc/raster/task.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698