| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "base/memory/ptr_util.h" | 5 #include "base/memory/ptr_util.h" |
| 6 #include "cc/base/lap_timer.h" | 6 #include "cc/base/lap_timer.h" |
| 7 #include "cc/output/compositor_frame.h" | 7 #include "cc/output/compositor_frame.h" |
| 8 #include "cc/quads/surface_draw_quad.h" | 8 #include "cc/quads/surface_draw_quad.h" |
| 9 #include "cc/quads/texture_draw_quad.h" | 9 #include "cc/quads/texture_draw_quad.h" |
| 10 #include "cc/surfaces/compositor_frame_sink_support.h" | 10 #include "cc/surfaces/compositor_frame_sink_support.h" |
| 11 #include "cc/surfaces/surface_aggregator.h" | 11 #include "cc/surfaces/surface_aggregator.h" |
| 12 #include "cc/surfaces/surface_manager.h" | 12 #include "cc/surfaces/surface_manager.h" |
| 13 #include "cc/test/compositor_frame_helpers.h" |
| 13 #include "cc/test/fake_output_surface_client.h" | 14 #include "cc/test/fake_output_surface_client.h" |
| 14 #include "cc/test/fake_resource_provider.h" | 15 #include "cc/test/fake_resource_provider.h" |
| 15 #include "cc/test/test_context_provider.h" | 16 #include "cc/test/test_context_provider.h" |
| 16 #include "cc/test/test_shared_bitmap_manager.h" | 17 #include "cc/test/test_shared_bitmap_manager.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #include "testing/perf/perf_test.h" | 19 #include "testing/perf/perf_test.h" |
| 19 | 20 |
| 20 namespace cc { | 21 namespace cc { |
| 21 namespace { | 22 namespace { |
| 22 | 23 |
| 23 constexpr bool kIsRoot = true; | 24 constexpr bool kIsRoot = true; |
| 24 constexpr bool kIsChildRoot = false; | 25 constexpr bool kIsChildRoot = false; |
| 25 constexpr bool kHandlesFrameSinkIdInvalidation = true; | 26 constexpr bool kHandlesFrameSinkIdInvalidation = true; |
| 26 constexpr bool kNeedsSyncPoints = true; | 27 constexpr bool kNeedsSyncPoints = true; |
| 27 | 28 |
| 28 const base::UnguessableToken kArbitraryToken = base::UnguessableToken::Create(); | 29 const base::UnguessableToken kArbitraryToken = base::UnguessableToken::Create(); |
| 29 | 30 |
| 30 CompositorFrame MakeCompositorFrame() { | |
| 31 CompositorFrame frame; | |
| 32 frame.metadata.begin_frame_ack.source_id = BeginFrameArgs::kManualSourceId; | |
| 33 frame.metadata.begin_frame_ack.sequence_number = | |
| 34 BeginFrameArgs::kStartingFrameNumber; | |
| 35 return frame; | |
| 36 } | |
| 37 | |
| 38 class SurfaceAggregatorPerfTest : public testing::Test { | 31 class SurfaceAggregatorPerfTest : public testing::Test { |
| 39 public: | 32 public: |
| 40 SurfaceAggregatorPerfTest() { | 33 SurfaceAggregatorPerfTest() { |
| 41 context_provider_ = TestContextProvider::Create(); | 34 context_provider_ = TestContextProvider::Create(); |
| 42 context_provider_->BindToCurrentThread(); | 35 context_provider_->BindToCurrentThread(); |
| 43 shared_bitmap_manager_.reset(new TestSharedBitmapManager); | 36 shared_bitmap_manager_.reset(new TestSharedBitmapManager); |
| 44 | 37 |
| 45 resource_provider_ = FakeResourceProvider::Create( | 38 resource_provider_ = FakeResourceProvider::Create( |
| 46 context_provider_.get(), shared_bitmap_manager_.get()); | 39 context_provider_.get(), shared_bitmap_manager_.get()); |
| 47 } | 40 } |
| 48 | 41 |
| 49 void RunTest(int num_surfaces, | 42 void RunTest(int num_surfaces, |
| 50 int num_textures, | 43 int num_textures, |
| 51 float opacity, | 44 float opacity, |
| 52 bool optimize_damage, | 45 bool optimize_damage, |
| 53 bool full_damage, | 46 bool full_damage, |
| 54 const std::string& name) { | 47 const std::string& name) { |
| 55 std::vector<std::unique_ptr<CompositorFrameSinkSupport>> child_supports( | 48 std::vector<std::unique_ptr<CompositorFrameSinkSupport>> child_supports( |
| 56 num_surfaces); | 49 num_surfaces); |
| 57 for (int i = 0; i < num_surfaces; i++) { | 50 for (int i = 0; i < num_surfaces; i++) { |
| 58 child_supports[i] = CompositorFrameSinkSupport::Create( | 51 child_supports[i] = CompositorFrameSinkSupport::Create( |
| 59 nullptr, &manager_, FrameSinkId(1, i + 1), kIsChildRoot, | 52 nullptr, &manager_, FrameSinkId(1, i + 1), kIsChildRoot, |
| 60 kHandlesFrameSinkIdInvalidation, kNeedsSyncPoints); | 53 kHandlesFrameSinkIdInvalidation, kNeedsSyncPoints); |
| 61 } | 54 } |
| 62 aggregator_.reset(new SurfaceAggregator(&manager_, resource_provider_.get(), | 55 aggregator_.reset(new SurfaceAggregator(&manager_, resource_provider_.get(), |
| 63 optimize_damage)); | 56 optimize_damage)); |
| 64 for (int i = 0; i < num_surfaces; i++) { | 57 for (int i = 0; i < num_surfaces; i++) { |
| 65 LocalSurfaceId local_surface_id(i + 1, kArbitraryToken); | 58 LocalSurfaceId local_surface_id(i + 1, kArbitraryToken); |
| 59 |
| 66 std::unique_ptr<RenderPass> pass(RenderPass::Create()); | 60 std::unique_ptr<RenderPass> pass(RenderPass::Create()); |
| 67 CompositorFrame frame = MakeCompositorFrame(); | 61 pass->output_rect = gfx::Rect(0, 0, 1, 2); |
| 62 |
| 63 CompositorFrame frame = test::MakeEmptyCompositorFrame(); |
| 68 | 64 |
| 69 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 65 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
| 70 for (int j = 0; j < num_textures; j++) { | 66 for (int j = 0; j < num_textures; j++) { |
| 71 TransferableResource resource; | 67 TransferableResource resource; |
| 72 resource.id = j; | 68 resource.id = j; |
| 73 resource.is_software = true; | 69 resource.is_software = true; |
| 74 frame.resource_list.push_back(resource); | 70 frame.resource_list.push_back(resource); |
| 75 | 71 |
| 76 TextureDrawQuad* quad = | 72 TextureDrawQuad* quad = |
| 77 pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 73 pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 std::move(frame)); | 105 std::move(frame)); |
| 110 } | 106 } |
| 111 | 107 |
| 112 std::unique_ptr<CompositorFrameSinkSupport> root_support = | 108 std::unique_ptr<CompositorFrameSinkSupport> root_support = |
| 113 CompositorFrameSinkSupport::Create( | 109 CompositorFrameSinkSupport::Create( |
| 114 nullptr, &manager_, FrameSinkId(1, num_surfaces + 1), kIsRoot, | 110 nullptr, &manager_, FrameSinkId(1, num_surfaces + 1), kIsRoot, |
| 115 kHandlesFrameSinkIdInvalidation, kNeedsSyncPoints); | 111 kHandlesFrameSinkIdInvalidation, kNeedsSyncPoints); |
| 116 timer_.Reset(); | 112 timer_.Reset(); |
| 117 do { | 113 do { |
| 118 std::unique_ptr<RenderPass> pass(RenderPass::Create()); | 114 std::unique_ptr<RenderPass> pass(RenderPass::Create()); |
| 119 CompositorFrame frame = MakeCompositorFrame(); | 115 CompositorFrame frame = test::MakeEmptyCompositorFrame(); |
| 120 | 116 |
| 121 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 117 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
| 122 SurfaceDrawQuad* surface_quad = | 118 SurfaceDrawQuad* surface_quad = |
| 123 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 119 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
| 124 surface_quad->SetNew( | 120 surface_quad->SetNew( |
| 125 sqs, gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 100, 100), | 121 sqs, gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 100, 100), |
| 126 SurfaceId(FrameSinkId(1, num_surfaces), | 122 SurfaceId(FrameSinkId(1, num_surfaces), |
| 127 LocalSurfaceId(num_surfaces, kArbitraryToken)), | 123 LocalSurfaceId(num_surfaces, kArbitraryToken)), |
| 128 SurfaceDrawQuadType::PRIMARY, nullptr); | 124 SurfaceDrawQuadType::PRIMARY, nullptr); |
| 129 | 125 |
| 126 pass->output_rect = gfx::Rect(0, 0, 100, 100); |
| 127 |
| 130 if (full_damage) | 128 if (full_damage) |
| 131 pass->damage_rect = gfx::Rect(0, 0, 100, 100); | 129 pass->damage_rect = gfx::Rect(0, 0, 100, 100); |
| 132 else | 130 else |
| 133 pass->damage_rect = gfx::Rect(0, 0, 1, 1); | 131 pass->damage_rect = gfx::Rect(0, 0, 1, 1); |
| 134 | 132 |
| 135 frame.render_pass_list.push_back(std::move(pass)); | 133 frame.render_pass_list.push_back(std::move(pass)); |
| 136 | 134 |
| 137 root_support->SubmitCompositorFrame( | 135 root_support->SubmitCompositorFrame( |
| 138 LocalSurfaceId(num_surfaces + 1, kArbitraryToken), std::move(frame)); | 136 LocalSurfaceId(num_surfaces + 1, kArbitraryToken), std::move(frame)); |
| 139 | 137 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesDamageCalc) { | 180 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesDamageCalc) { |
| 183 RunTest(3, 1000, 1.f, true, true, "few_surfaces_damage_calc"); | 181 RunTest(3, 1000, 1.f, true, true, "few_surfaces_damage_calc"); |
| 184 } | 182 } |
| 185 | 183 |
| 186 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesAggregateDamaged) { | 184 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesAggregateDamaged) { |
| 187 RunTest(3, 1000, 1.f, true, false, "few_surfaces_aggregate_damaged"); | 185 RunTest(3, 1000, 1.f, true, false, "few_surfaces_aggregate_damaged"); |
| 188 } | 186 } |
| 189 | 187 |
| 190 } // namespace | 188 } // namespace |
| 191 } // namespace cc | 189 } // namespace cc |
| OLD | NEW |