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

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

Issue 1951193002: cc: Add mailbox support to ResourceProvider write locks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@worker_context_stream
Patch Set: strict sync token check Created 4 years, 6 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
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"
11 #include "base/time/time.h" 11 #include "base/time/time.h"
12 #include "cc/debug/lap_timer.h" 12 #include "cc/debug/lap_timer.h"
13 #include "cc/output/context_provider.h" 13 #include "cc/output/context_provider.h"
14 #include "cc/raster/bitmap_raster_buffer_provider.h" 14 #include "cc/raster/bitmap_raster_buffer_provider.h"
15 #include "cc/raster/gpu_raster_buffer_provider.h" 15 #include "cc/raster/gpu_raster_buffer_provider.h"
16 #include "cc/raster/gpu_rasterizer.h"
17 #include "cc/raster/one_copy_raster_buffer_provider.h" 16 #include "cc/raster/one_copy_raster_buffer_provider.h"
18 #include "cc/raster/raster_buffer_provider.h" 17 #include "cc/raster/raster_buffer_provider.h"
19 #include "cc/raster/synchronous_task_graph_runner.h" 18 #include "cc/raster/synchronous_task_graph_runner.h"
20 #include "cc/raster/zero_copy_raster_buffer_provider.h" 19 #include "cc/raster/zero_copy_raster_buffer_provider.h"
20 #include "cc/resources/platform_color.h"
21 #include "cc/resources/resource_pool.h" 21 #include "cc/resources/resource_pool.h"
22 #include "cc/resources/resource_provider.h" 22 #include "cc/resources/resource_provider.h"
23 #include "cc/resources/scoped_resource.h" 23 #include "cc/resources/scoped_resource.h"
24 #include "cc/test/fake_output_surface.h" 24 #include "cc/test/fake_output_surface.h"
25 #include "cc/test/fake_output_surface_client.h" 25 #include "cc/test/fake_output_surface_client.h"
26 #include "cc/test/fake_resource_provider.h" 26 #include "cc/test/fake_resource_provider.h"
27 #include "cc/test/test_context_support.h" 27 #include "cc/test/test_context_support.h"
28 #include "cc/test/test_gpu_memory_buffer_manager.h" 28 #include "cc/test/test_gpu_memory_buffer_manager.h"
29 #include "cc/test/test_shared_bitmap_manager.h" 29 #include "cc/test/test_shared_bitmap_manager.h"
30 #include "cc/test/test_web_graphics_context_3d.h" 30 #include "cc/test/test_web_graphics_context_3d.h"
31 #include "cc/tiles/tile_task_manager.h" 31 #include "cc/tiles/tile_task_manager.h"
32 #include "gpu/command_buffer/common/sync_token.h"
32 #include "testing/gtest/include/gtest/gtest.h" 33 #include "testing/gtest/include/gtest/gtest.h"
33 #include "testing/perf/perf_test.h" 34 #include "testing/perf/perf_test.h"
34 #include "third_party/khronos/GLES2/gl2.h" 35 #include "third_party/khronos/GLES2/gl2.h"
35 #include "third_party/skia/include/gpu/GrContext.h" 36 #include "third_party/skia/include/gpu/GrContext.h"
36 #include "third_party/skia/include/gpu/gl/GrGLInterface.h" 37 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
37 38
38 namespace cc { 39 namespace cc {
39 namespace { 40 namespace {
40 41
41 class PerfGLES2Interface : public gpu::gles2::GLES2InterfaceStub { 42 class PerfGLES2Interface : public gpu::gles2::GLES2InterfaceStub {
(...skipping 19 matching lines...) Expand all
61 void GenQueriesEXT(GLsizei n, GLuint* queries) override { 62 void GenQueriesEXT(GLsizei n, GLuint* queries) override {
62 for (GLsizei i = 0; i < n; ++i) 63 for (GLsizei i = 0; i < n; ++i)
63 queries[i] = 1u; 64 queries[i] = 1u;
64 } 65 }
65 void GetQueryObjectuivEXT(GLuint query, 66 void GetQueryObjectuivEXT(GLuint query,
66 GLenum pname, 67 GLenum pname,
67 GLuint* params) override { 68 GLuint* params) override {
68 if (pname == GL_QUERY_RESULT_AVAILABLE_EXT) 69 if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
69 *params = 1; 70 *params = 1;
70 } 71 }
72 void GenUnverifiedSyncTokenCHROMIUM(GLuint64 fence_sync, GLbyte* sync_token) {
73 // Copy the data over after setting the data to ensure alignment.
74 gpu::SyncToken sync_token_data(gpu::CommandBufferNamespace::GPU_IO, 0,
75 gpu::CommandBufferId(), fence_sync);
76 memcpy(sync_token, &sync_token_data, sizeof(sync_token_data));
77 }
71 }; 78 };
72 79
73 class PerfContextProvider : public ContextProvider { 80 class PerfContextProvider : public ContextProvider {
74 public: 81 public:
75 PerfContextProvider() : context_gl_(new PerfGLES2Interface) {} 82 PerfContextProvider() : context_gl_(new PerfGLES2Interface) {}
76 83
77 bool BindToCurrentThread() override { return true; } 84 bool BindToCurrentThread() override { return true; }
78 gpu::Capabilities ContextCapabilities() override { 85 gpu::Capabilities ContextCapabilities() override {
79 gpu::Capabilities capabilities; 86 gpu::Capabilities capabilities;
80 capabilities.image = true; 87 capabilities.image = true;
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 LapTimer timer_; 311 LapTimer timer_;
305 }; 312 };
306 313
307 class RasterBufferProviderPerfTest 314 class RasterBufferProviderPerfTest
308 : public RasterBufferProviderPerfTestBase, 315 : public RasterBufferProviderPerfTestBase,
309 public PerfRasterBufferProviderHelper, 316 public PerfRasterBufferProviderHelper,
310 public testing::TestWithParam<RasterBufferProviderType> { 317 public testing::TestWithParam<RasterBufferProviderType> {
311 public: 318 public:
312 // Overridden from testing::Test: 319 // Overridden from testing::Test:
313 void SetUp() override { 320 void SetUp() override {
314 std::unique_ptr<RasterBufferProvider> raster_buffer_provider;
315 switch (GetParam()) { 321 switch (GetParam()) {
316 case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY: 322 case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
317 Create3dOutputSurfaceAndResourceProvider(); 323 Create3dOutputSurfaceAndResourceProvider();
318 raster_buffer_provider = ZeroCopyRasterBufferProvider::Create( 324 raster_buffer_provider_ = ZeroCopyRasterBufferProvider::Create(
319 resource_provider_.get(), PlatformColor::BestTextureFormat()); 325 resource_provider_.get(), PlatformColor::BestTextureFormat());
320 break; 326 break;
321 case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY: 327 case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
322 Create3dOutputSurfaceAndResourceProvider(); 328 Create3dOutputSurfaceAndResourceProvider();
323 raster_buffer_provider = base::MakeUnique<OneCopyRasterBufferProvider>( 329 raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>(
324 task_runner_.get(), compositor_context_provider_.get(), 330 task_runner_.get(), compositor_context_provider_.get(),
325 worker_context_provider_.get(), resource_provider_.get(), 331 worker_context_provider_.get(), resource_provider_.get(),
326 std::numeric_limits<int>::max(), false, 332 std::numeric_limits<int>::max(), false,
327 std::numeric_limits<int>::max(), 333 std::numeric_limits<int>::max(), PlatformColor::BestTextureFormat(),
328 PlatformColor::BestTextureFormat()); 334 false);
329 break; 335 break;
330 case RASTER_BUFFER_PROVIDER_TYPE_GPU: 336 case RASTER_BUFFER_PROVIDER_TYPE_GPU:
331 Create3dOutputSurfaceAndResourceProvider(); 337 Create3dOutputSurfaceAndResourceProvider();
332 raster_buffer_provider = base::MakeUnique<GpuRasterBufferProvider>( 338 raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
333 compositor_context_provider_.get(), worker_context_provider_.get(), 339 compositor_context_provider_.get(), worker_context_provider_.get(),
334 resource_provider_.get(), false, 0); 340 resource_provider_.get(), false, 0, false);
335 break; 341 break;
336 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP: 342 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
337 CreateSoftwareOutputSurfaceAndResourceProvider(); 343 CreateSoftwareOutputSurfaceAndResourceProvider();
338 raster_buffer_provider = 344 raster_buffer_provider_ =
339 BitmapRasterBufferProvider::Create(resource_provider_.get()); 345 BitmapRasterBufferProvider::Create(resource_provider_.get());
340 break; 346 break;
341 } 347 }
342 348
343 DCHECK(raster_buffer_provider); 349 DCHECK(raster_buffer_provider_);
344 350
345 tile_task_manager_ = TileTaskManagerImpl::Create( 351 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner_.get());
346 std::move(raster_buffer_provider), task_graph_runner_.get());
347 } 352 }
348 void TearDown() override { 353 void TearDown() override {
349 tile_task_manager_->Shutdown(); 354 tile_task_manager_->Shutdown();
350 tile_task_manager_->CheckForCompletedTasks(); 355 tile_task_manager_->CheckForCompletedTasks();
356
357 raster_buffer_provider_->Shutdown();
351 } 358 }
352 359
353 // Overridden from PerfRasterBufferProviderHelper: 360 // Overridden from PerfRasterBufferProviderHelper:
354 std::unique_ptr<RasterBuffer> AcquireBufferForRaster( 361 std::unique_ptr<RasterBuffer> AcquireBufferForRaster(
355 const Resource* resource, 362 const Resource* resource,
356 uint64_t resource_content_id, 363 uint64_t resource_content_id,
357 uint64_t previous_content_id) override { 364 uint64_t previous_content_id) override {
358 return tile_task_manager_->GetRasterBufferProvider() 365 return raster_buffer_provider_->AcquireBufferForRaster(
359 ->AcquireBufferForRaster(resource, resource_content_id, 366 resource, resource_content_id, previous_content_id);
360 previous_content_id);
361 } 367 }
362 void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override { 368 void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override {
363 tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster( 369 raster_buffer_provider_->ReleaseBufferForRaster(std::move(buffer));
364 std::move(buffer));
365 } 370 }
366 371
367 void RunMessageLoopUntilAllTasksHaveCompleted() { 372 void RunMessageLoopUntilAllTasksHaveCompleted() {
368 task_graph_runner_->RunUntilIdle(); 373 task_graph_runner_->RunUntilIdle();
369 task_runner_->RunUntilIdle(); 374 task_runner_->RunUntilIdle();
370 } 375 }
371 376
372 void RunScheduleTasksTest(const std::string& test_name, 377 void RunScheduleTasksTest(const std::string& test_name,
373 unsigned num_raster_tasks, 378 unsigned num_raster_tasks,
374 unsigned num_image_decode_tasks) { 379 unsigned num_image_decode_tasks) {
375 TileTask::Vector image_decode_tasks; 380 TileTask::Vector image_decode_tasks;
376 RasterTaskVector raster_tasks; 381 RasterTaskVector raster_tasks;
377 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); 382 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
378 CreateRasterTasks(this, num_raster_tasks, image_decode_tasks, 383 CreateRasterTasks(this, num_raster_tasks, image_decode_tasks,
379 &raster_tasks); 384 &raster_tasks);
380 385
381 // Avoid unnecessary heap allocations by reusing the same graph. 386 // Avoid unnecessary heap allocations by reusing the same graph.
382 TaskGraph graph; 387 TaskGraph graph;
383 388
384 timer_.Reset(); 389 timer_.Reset();
385 do { 390 do {
386 graph.Reset(); 391 graph.Reset();
387 ResetRasterTasks(raster_tasks); 392 ResetRasterTasks(raster_tasks);
388 BuildTileTaskGraph(&graph, raster_tasks); 393 BuildTileTaskGraph(&graph, raster_tasks);
394 raster_buffer_provider_->OrderingBarrier();
389 tile_task_manager_->ScheduleTasks(&graph); 395 tile_task_manager_->ScheduleTasks(&graph);
390 tile_task_manager_->CheckForCompletedTasks(); 396 tile_task_manager_->CheckForCompletedTasks();
391 timer_.NextLap(); 397 timer_.NextLap();
392 } while (!timer_.HasTimeLimitExpired()); 398 } while (!timer_.HasTimeLimitExpired());
393 399
394 TaskGraph empty; 400 TaskGraph empty;
401 raster_buffer_provider_->OrderingBarrier();
395 tile_task_manager_->ScheduleTasks(&empty); 402 tile_task_manager_->ScheduleTasks(&empty);
396 RunMessageLoopUntilAllTasksHaveCompleted(); 403 RunMessageLoopUntilAllTasksHaveCompleted();
397 tile_task_manager_->CheckForCompletedTasks(); 404 tile_task_manager_->CheckForCompletedTasks();
398 405
399 perf_test::PrintResult("schedule_tasks", TestModifierString(), test_name, 406 perf_test::PrintResult("schedule_tasks", TestModifierString(), test_name,
400 timer_.LapsPerSecond(), "runs/s", true); 407 timer_.LapsPerSecond(), "runs/s", true);
401 } 408 }
402 409
403 void RunScheduleAlternateTasksTest(const std::string& test_name, 410 void RunScheduleAlternateTasksTest(const std::string& test_name,
404 unsigned num_raster_tasks, 411 unsigned num_raster_tasks,
(...skipping 10 matching lines...) Expand all
415 // Avoid unnecessary heap allocations by reusing the same graph. 422 // Avoid unnecessary heap allocations by reusing the same graph.
416 TaskGraph graph; 423 TaskGraph graph;
417 424
418 size_t count = 0; 425 size_t count = 0;
419 timer_.Reset(); 426 timer_.Reset();
420 do { 427 do {
421 graph.Reset(); 428 graph.Reset();
422 // Reset the tasks as for scheduling new state tasks are needed. 429 // Reset the tasks as for scheduling new state tasks are needed.
423 ResetRasterTasks(raster_tasks[count % kNumVersions]); 430 ResetRasterTasks(raster_tasks[count % kNumVersions]);
424 BuildTileTaskGraph(&graph, raster_tasks[count % kNumVersions]); 431 BuildTileTaskGraph(&graph, raster_tasks[count % kNumVersions]);
432 raster_buffer_provider_->OrderingBarrier();
425 tile_task_manager_->ScheduleTasks(&graph); 433 tile_task_manager_->ScheduleTasks(&graph);
426 tile_task_manager_->CheckForCompletedTasks(); 434 tile_task_manager_->CheckForCompletedTasks();
427 ++count; 435 ++count;
428 timer_.NextLap(); 436 timer_.NextLap();
429 } while (!timer_.HasTimeLimitExpired()); 437 } while (!timer_.HasTimeLimitExpired());
430 438
431 TaskGraph empty; 439 TaskGraph empty;
440 raster_buffer_provider_->OrderingBarrier();
432 tile_task_manager_->ScheduleTasks(&empty); 441 tile_task_manager_->ScheduleTasks(&empty);
433 RunMessageLoopUntilAllTasksHaveCompleted(); 442 RunMessageLoopUntilAllTasksHaveCompleted();
434 tile_task_manager_->CheckForCompletedTasks(); 443 tile_task_manager_->CheckForCompletedTasks();
435 444
436 perf_test::PrintResult("schedule_alternate_tasks", TestModifierString(), 445 perf_test::PrintResult("schedule_alternate_tasks", TestModifierString(),
437 test_name, timer_.LapsPerSecond(), "runs/s", true); 446 test_name, timer_.LapsPerSecond(), "runs/s", true);
438 } 447 }
439 448
440 void RunScheduleAndExecuteTasksTest(const std::string& test_name, 449 void RunScheduleAndExecuteTasksTest(const std::string& test_name,
441 unsigned num_raster_tasks, 450 unsigned num_raster_tasks,
442 unsigned num_image_decode_tasks) { 451 unsigned num_image_decode_tasks) {
443 TileTask::Vector image_decode_tasks; 452 TileTask::Vector image_decode_tasks;
444 RasterTaskVector raster_tasks; 453 RasterTaskVector raster_tasks;
445 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks); 454 CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
446 CreateRasterTasks(this, num_raster_tasks, image_decode_tasks, 455 CreateRasterTasks(this, num_raster_tasks, image_decode_tasks,
447 &raster_tasks); 456 &raster_tasks);
448 457
449 // Avoid unnecessary heap allocations by reusing the same graph. 458 // Avoid unnecessary heap allocations by reusing the same graph.
450 TaskGraph graph; 459 TaskGraph graph;
451 460
452 timer_.Reset(); 461 timer_.Reset();
453 do { 462 do {
454 graph.Reset(); 463 graph.Reset();
455 BuildTileTaskGraph(&graph, raster_tasks); 464 BuildTileTaskGraph(&graph, raster_tasks);
465 raster_buffer_provider_->OrderingBarrier();
456 tile_task_manager_->ScheduleTasks(&graph); 466 tile_task_manager_->ScheduleTasks(&graph);
457 RunMessageLoopUntilAllTasksHaveCompleted(); 467 RunMessageLoopUntilAllTasksHaveCompleted();
458 timer_.NextLap(); 468 timer_.NextLap();
459 } while (!timer_.HasTimeLimitExpired()); 469 } while (!timer_.HasTimeLimitExpired());
460 470
461 TaskGraph empty; 471 TaskGraph empty;
472 raster_buffer_provider_->OrderingBarrier();
462 tile_task_manager_->ScheduleTasks(&empty); 473 tile_task_manager_->ScheduleTasks(&empty);
463 RunMessageLoopUntilAllTasksHaveCompleted(); 474 RunMessageLoopUntilAllTasksHaveCompleted();
464 475
465 perf_test::PrintResult("schedule_and_execute_tasks", TestModifierString(), 476 perf_test::PrintResult("schedule_and_execute_tasks", TestModifierString(),
466 test_name, timer_.LapsPerSecond(), "runs/s", true); 477 test_name, timer_.LapsPerSecond(), "runs/s", true);
467 } 478 }
468 479
469 private: 480 private:
470 void Create3dOutputSurfaceAndResourceProvider() { 481 void Create3dOutputSurfaceAndResourceProvider() {
471 output_surface_ = FakeOutputSurface::Create3d(compositor_context_provider_, 482 output_surface_ = FakeOutputSurface::Create3d(compositor_context_provider_,
(...skipping 20 matching lines...) Expand all
492 case RASTER_BUFFER_PROVIDER_TYPE_GPU: 503 case RASTER_BUFFER_PROVIDER_TYPE_GPU:
493 return std::string("_gpu_raster_buffer_provider"); 504 return std::string("_gpu_raster_buffer_provider");
494 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP: 505 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
495 return std::string("_bitmap_raster_buffer_provider"); 506 return std::string("_bitmap_raster_buffer_provider");
496 } 507 }
497 NOTREACHED(); 508 NOTREACHED();
498 return std::string(); 509 return std::string();
499 } 510 }
500 511
501 std::unique_ptr<TileTaskManager> tile_task_manager_; 512 std::unique_ptr<TileTaskManager> tile_task_manager_;
513 std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
502 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; 514 TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
503 TestSharedBitmapManager shared_bitmap_manager_; 515 TestSharedBitmapManager shared_bitmap_manager_;
504 }; 516 };
505 517
506 TEST_P(RasterBufferProviderPerfTest, ScheduleTasks) { 518 TEST_P(RasterBufferProviderPerfTest, ScheduleTasks) {
507 RunScheduleTasksTest("1_0", 1, 0); 519 RunScheduleTasksTest("1_0", 1, 0);
508 RunScheduleTasksTest("32_0", 32, 0); 520 RunScheduleTasksTest("32_0", 32, 0);
509 RunScheduleTasksTest("1_1", 1, 1); 521 RunScheduleTasksTest("1_1", 1, 1);
510 RunScheduleTasksTest("32_1", 32, 1); 522 RunScheduleTasksTest("32_1", 32, 1);
511 RunScheduleTasksTest("1_4", 1, 4); 523 RunScheduleTasksTest("1_4", 1, 4);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 RunBuildTileTaskGraphTest("1_0", 1, 0); 592 RunBuildTileTaskGraphTest("1_0", 1, 0);
581 RunBuildTileTaskGraphTest("32_0", 32, 0); 593 RunBuildTileTaskGraphTest("32_0", 32, 0);
582 RunBuildTileTaskGraphTest("1_1", 1, 1); 594 RunBuildTileTaskGraphTest("1_1", 1, 1);
583 RunBuildTileTaskGraphTest("32_1", 32, 1); 595 RunBuildTileTaskGraphTest("32_1", 32, 1);
584 RunBuildTileTaskGraphTest("1_4", 1, 4); 596 RunBuildTileTaskGraphTest("1_4", 1, 4);
585 RunBuildTileTaskGraphTest("32_4", 32, 4); 597 RunBuildTileTaskGraphTest("32_4", 32, 4);
586 } 598 }
587 599
588 } // namespace 600 } // namespace
589 } // namespace cc 601 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698