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/frame_sink_manager_client.h" |
10 #include "cc/surfaces/surface_aggregator.h" | 11 #include "cc/surfaces/surface_aggregator.h" |
| 12 #include "cc/surfaces/surface_aggregator_client.h" |
11 #include "cc/surfaces/surface_factory.h" | 13 #include "cc/surfaces/surface_factory.h" |
12 #include "cc/surfaces/surface_factory_client.h" | 14 #include "cc/surfaces/surface_factory_client.h" |
13 #include "cc/surfaces/surface_manager.h" | 15 #include "cc/surfaces/surface_manager.h" |
| 16 #include "cc/surfaces/surface_resource_holder_client.h" |
14 #include "cc/test/fake_output_surface_client.h" | 17 #include "cc/test/fake_output_surface_client.h" |
15 #include "cc/test/fake_resource_provider.h" | 18 #include "cc/test/fake_resource_provider.h" |
16 #include "cc/test/test_context_provider.h" | 19 #include "cc/test/test_context_provider.h" |
17 #include "cc/test/test_shared_bitmap_manager.h" | 20 #include "cc/test/test_shared_bitmap_manager.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
19 #include "testing/perf/perf_test.h" | 22 #include "testing/perf/perf_test.h" |
20 | 23 |
21 namespace cc { | 24 namespace cc { |
22 namespace { | 25 namespace { |
23 | 26 |
24 static const base::UnguessableToken kArbitraryToken = | 27 static const base::UnguessableToken kArbitraryToken = |
25 base::UnguessableToken::Create(); | 28 base::UnguessableToken::Create(); |
26 | 29 |
27 class EmptySurfaceFactoryClient : public SurfaceFactoryClient { | 30 class EmptyClient : public SurfaceFactoryClient, |
| 31 public FrameSinkManagerClient, |
| 32 public SurfaceAggregatorClient, |
| 33 public SurfaceResourceHolderClient { |
28 public: | 34 public: |
| 35 // SurfaceFactoryClient implementation. |
| 36 void ReferencedSurfacesChanged( |
| 37 const LocalSurfaceId& local_surface_id, |
| 38 const std::vector<SurfaceId>* active_referenced_surfaces) override {} |
| 39 |
| 40 // SurfaceResourceHolderClient implementation. |
29 void ReturnResources(const ReturnedResourceArray& resources) override {} | 41 void ReturnResources(const ReturnedResourceArray& resources) override {} |
| 42 |
| 43 // SurfaceAggregatorClient implementation. |
| 44 void WillDrawSurface(const LocalSurfaceId& local_surface_id, |
| 45 const gfx::Rect& damage_rect) override {} |
| 46 |
| 47 // FrameSinkManagerClient implementation. |
30 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {} | 48 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {} |
31 }; | 49 }; |
32 | 50 |
33 class SurfaceAggregatorPerfTest : public testing::Test { | 51 class SurfaceAggregatorPerfTest : public testing::Test { |
34 public: | 52 public: |
35 SurfaceAggregatorPerfTest() { | 53 SurfaceAggregatorPerfTest() { |
36 context_provider_ = TestContextProvider::Create(); | 54 context_provider_ = TestContextProvider::Create(); |
37 context_provider_->BindToCurrentThread(); | 55 context_provider_->BindToCurrentThread(); |
38 shared_bitmap_manager_.reset(new TestSharedBitmapManager); | 56 shared_bitmap_manager_.reset(new TestSharedBitmapManager); |
39 | 57 |
40 resource_provider_ = FakeResourceProvider::Create( | 58 resource_provider_ = FakeResourceProvider::Create( |
41 context_provider_.get(), shared_bitmap_manager_.get()); | 59 context_provider_.get(), shared_bitmap_manager_.get()); |
42 } | 60 } |
43 | 61 |
44 void RunTest(int num_surfaces, | 62 void RunTest(int num_surfaces, |
45 int num_textures, | 63 int num_textures, |
46 float opacity, | 64 float opacity, |
47 bool optimize_damage, | 65 bool optimize_damage, |
48 bool full_damage, | 66 bool full_damage, |
49 const std::string& name) { | 67 const std::string& name) { |
50 std::vector<std::unique_ptr<SurfaceFactory>> child_factories(num_surfaces); | 68 std::vector<std::unique_ptr<SurfaceFactory>> child_factories(num_surfaces); |
51 for (int i = 0; i < num_surfaces; i++) | 69 for (int i = 0; i < num_surfaces; i++) |
52 child_factories[i].reset( | 70 child_factories[i].reset( |
53 new SurfaceFactory(FrameSinkId(1, i + 1), &manager_, &empty_client_)); | 71 new SurfaceFactory(FrameSinkId(1, i + 1), &manager_, &empty_client_, |
| 72 &empty_client_, &empty_client_)); |
54 aggregator_.reset(new SurfaceAggregator(&manager_, resource_provider_.get(), | 73 aggregator_.reset(new SurfaceAggregator(&manager_, resource_provider_.get(), |
55 optimize_damage)); | 74 optimize_damage)); |
56 for (int i = 0; i < num_surfaces; i++) { | 75 for (int i = 0; i < num_surfaces; i++) { |
57 LocalSurfaceId local_surface_id(i + 1, kArbitraryToken); | 76 LocalSurfaceId local_surface_id(i + 1, kArbitraryToken); |
58 std::unique_ptr<RenderPass> pass(RenderPass::Create()); | 77 std::unique_ptr<RenderPass> pass(RenderPass::Create()); |
59 CompositorFrame frame; | 78 CompositorFrame frame; |
60 | 79 |
61 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 80 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
62 for (int j = 0; j < num_textures; j++) { | 81 for (int j = 0; j < num_textures; j++) { |
63 TransferableResource resource; | 82 TransferableResource resource; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 SurfaceId(FrameSinkId(1, i), LocalSurfaceId(i, kArbitraryToken)), | 114 SurfaceId(FrameSinkId(1, i), LocalSurfaceId(i, kArbitraryToken)), |
96 SurfaceDrawQuadType::PRIMARY, nullptr); | 115 SurfaceDrawQuadType::PRIMARY, nullptr); |
97 } | 116 } |
98 | 117 |
99 frame.render_pass_list.push_back(std::move(pass)); | 118 frame.render_pass_list.push_back(std::move(pass)); |
100 child_factories[i]->SubmitCompositorFrame( | 119 child_factories[i]->SubmitCompositorFrame( |
101 local_surface_id, std::move(frame), SurfaceFactory::DrawCallback()); | 120 local_surface_id, std::move(frame), SurfaceFactory::DrawCallback()); |
102 } | 121 } |
103 | 122 |
104 SurfaceFactory root_factory(FrameSinkId(1, num_surfaces + 1), &manager_, | 123 SurfaceFactory root_factory(FrameSinkId(1, num_surfaces + 1), &manager_, |
105 &empty_client_); | 124 &empty_client_, &empty_client_, &empty_client_); |
106 timer_.Reset(); | 125 timer_.Reset(); |
107 do { | 126 do { |
108 std::unique_ptr<RenderPass> pass(RenderPass::Create()); | 127 std::unique_ptr<RenderPass> pass(RenderPass::Create()); |
109 CompositorFrame frame; | 128 CompositorFrame frame; |
110 | 129 |
111 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 130 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
112 SurfaceDrawQuad* surface_quad = | 131 SurfaceDrawQuad* surface_quad = |
113 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 132 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
114 surface_quad->SetNew( | 133 surface_quad->SetNew( |
115 sqs, gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 100, 100), | 134 sqs, gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 100, 100), |
(...skipping 20 matching lines...) Expand all Loading... |
136 | 155 |
137 perf_test::PrintResult("aggregator_speed", "", name, timer_.LapsPerSecond(), | 156 perf_test::PrintResult("aggregator_speed", "", name, timer_.LapsPerSecond(), |
138 "runs/s", true); | 157 "runs/s", true); |
139 for (int i = 0; i < num_surfaces; i++) | 158 for (int i = 0; i < num_surfaces; i++) |
140 child_factories[i]->EvictSurface(); | 159 child_factories[i]->EvictSurface(); |
141 root_factory.EvictSurface(); | 160 root_factory.EvictSurface(); |
142 } | 161 } |
143 | 162 |
144 protected: | 163 protected: |
145 SurfaceManager manager_; | 164 SurfaceManager manager_; |
146 EmptySurfaceFactoryClient empty_client_; | 165 EmptyClient empty_client_; |
147 scoped_refptr<TestContextProvider> context_provider_; | 166 scoped_refptr<TestContextProvider> context_provider_; |
148 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; | 167 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
149 std::unique_ptr<ResourceProvider> resource_provider_; | 168 std::unique_ptr<ResourceProvider> resource_provider_; |
150 std::unique_ptr<SurfaceAggregator> aggregator_; | 169 std::unique_ptr<SurfaceAggregator> aggregator_; |
151 LapTimer timer_; | 170 LapTimer timer_; |
152 }; | 171 }; |
153 | 172 |
154 TEST_F(SurfaceAggregatorPerfTest, ManySurfacesOpaque) { | 173 TEST_F(SurfaceAggregatorPerfTest, ManySurfacesOpaque) { |
155 RunTest(20, 100, 1.f, false, true, "many_surfaces_opaque"); | 174 RunTest(20, 100, 1.f, false, true, "many_surfaces_opaque"); |
156 } | 175 } |
(...skipping 17 matching lines...) Expand all Loading... |
174 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesDamageCalc) { | 193 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesDamageCalc) { |
175 RunTest(3, 1000, 1.f, true, true, "few_surfaces_damage_calc"); | 194 RunTest(3, 1000, 1.f, true, true, "few_surfaces_damage_calc"); |
176 } | 195 } |
177 | 196 |
178 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesAggregateDamaged) { | 197 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesAggregateDamaged) { |
179 RunTest(3, 1000, 1.f, true, false, "few_surfaces_aggregate_damaged"); | 198 RunTest(3, 1000, 1.f, true, false, "few_surfaces_aggregate_damaged"); |
180 } | 199 } |
181 | 200 |
182 } // namespace | 201 } // namespace |
183 } // namespace cc | 202 } // namespace cc |
OLD | NEW |