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

Side by Side Diff: cc/surfaces/surface_aggregator_perftest.cc

Issue 2830203002: Remove SurfaceFactory in SurfaceAggregatorPerfTest (Closed)
Patch Set: Rebase Created 3 years, 8 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 | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/framesink_manager_client.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_factory.h"
13 #include "cc/surfaces/surface_manager.h" 12 #include "cc/surfaces/surface_manager.h"
14 #include "cc/surfaces/surface_resource_holder_client.h"
15 #include "cc/test/fake_output_surface_client.h" 13 #include "cc/test/fake_output_surface_client.h"
16 #include "cc/test/fake_resource_provider.h" 14 #include "cc/test/fake_resource_provider.h"
17 #include "cc/test/stub_surface_factory_client.h"
18 #include "cc/test/test_context_provider.h" 15 #include "cc/test/test_context_provider.h"
19 #include "cc/test/test_shared_bitmap_manager.h" 16 #include "cc/test/test_shared_bitmap_manager.h"
20 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
21 #include "testing/perf/perf_test.h" 18 #include "testing/perf/perf_test.h"
22 19
23 namespace cc { 20 namespace cc {
24 namespace { 21 namespace {
25 22
23 constexpr bool kIsRoot = true;
24 constexpr bool kIsChildRoot = false;
25 constexpr bool kHandlesFrameSinkIdInvalidation = true;
26 constexpr bool kNeedsSyncPoints = true;
27
26 static const base::UnguessableToken kArbitraryToken = 28 static const base::UnguessableToken kArbitraryToken =
27 base::UnguessableToken::Create(); 29 base::UnguessableToken::Create();
28 30
29 class StubSurfaceResourceHolderClient : public SurfaceResourceHolderClient {
30 public:
31 StubSurfaceResourceHolderClient() = default;
32 ~StubSurfaceResourceHolderClient() override = default;
33
34 void ReturnResources(const ReturnedResourceArray& resources) override {}
35 };
36
37 class SurfaceAggregatorPerfTest : public testing::Test { 31 class SurfaceAggregatorPerfTest : public testing::Test {
38 public: 32 public:
39 SurfaceAggregatorPerfTest() { 33 SurfaceAggregatorPerfTest() {
40 context_provider_ = TestContextProvider::Create(); 34 context_provider_ = TestContextProvider::Create();
41 context_provider_->BindToCurrentThread(); 35 context_provider_->BindToCurrentThread();
42 shared_bitmap_manager_.reset(new TestSharedBitmapManager); 36 shared_bitmap_manager_.reset(new TestSharedBitmapManager);
43 37
44 resource_provider_ = FakeResourceProvider::Create( 38 resource_provider_ = FakeResourceProvider::Create(
45 context_provider_.get(), shared_bitmap_manager_.get()); 39 context_provider_.get(), shared_bitmap_manager_.get());
46 } 40 }
47 41
48 void RunTest(int num_surfaces, 42 void RunTest(int num_surfaces,
49 int num_textures, 43 int num_textures,
50 float opacity, 44 float opacity,
51 bool optimize_damage, 45 bool optimize_damage,
52 bool full_damage, 46 bool full_damage,
53 const std::string& name) { 47 const std::string& name) {
54 std::vector<std::unique_ptr<SurfaceFactory>> child_factories(num_surfaces); 48 std::vector<std::unique_ptr<CompositorFrameSinkSupport>> child_supports(
55 for (int i = 0; i < num_surfaces; i++) 49 num_surfaces);
56 child_factories[i].reset(new SurfaceFactory( 50 for (int i = 0; i < num_surfaces; i++) {
57 FrameSinkId(1, i + 1), &manager_, &stub_surface_factory_client_, 51 child_supports[i] = CompositorFrameSinkSupport::Create(
58 &stub_surface_resource_holder_client_)); 52 nullptr, &manager_, FrameSinkId(1, i + 1), kIsChildRoot,
53 kHandlesFrameSinkIdInvalidation, kNeedsSyncPoints);
54 }
59 aggregator_.reset(new SurfaceAggregator(&manager_, resource_provider_.get(), 55 aggregator_.reset(new SurfaceAggregator(&manager_, resource_provider_.get(),
60 optimize_damage)); 56 optimize_damage));
61 for (int i = 0; i < num_surfaces; i++) { 57 for (int i = 0; i < num_surfaces; i++) {
62 LocalSurfaceId local_surface_id(i + 1, kArbitraryToken); 58 LocalSurfaceId local_surface_id(i + 1, kArbitraryToken);
63 std::unique_ptr<RenderPass> pass(RenderPass::Create()); 59 std::unique_ptr<RenderPass> pass(RenderPass::Create());
64 CompositorFrame frame; 60 CompositorFrame frame;
65 61
66 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); 62 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
67 for (int j = 0; j < num_textures; j++) { 63 for (int j = 0; j < num_textures; j++) {
68 TransferableResource resource; 64 TransferableResource resource;
69 resource.id = j; 65 resource.id = j;
70 resource.is_software = true; 66 resource.is_software = true;
71 frame.resource_list.push_back(resource); 67 frame.resource_list.push_back(resource);
72 68
73 TextureDrawQuad* quad = 69 TextureDrawQuad* quad =
74 pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); 70 pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
75 const gfx::Rect rect(0, 0, 1, 1); 71 const gfx::Rect rect(0, 0, 1, 2);
76 const gfx::Rect opaque_rect; 72 const gfx::Rect opaque_rect;
77 // Half of rects should be visible with partial damage. 73 // Half of rects should be visible with partial damage.
78 gfx::Rect visible_rect = 74 gfx::Rect visible_rect =
79 j % 2 == 0 ? gfx::Rect(0, 0, 1, 1) : gfx::Rect(1, 1, 1, 1); 75 j % 2 == 0 ? gfx::Rect(0, 0, 1, 2) : gfx::Rect(0, 1, 1, 1);
80 bool needs_blending = false; 76 bool needs_blending = false;
81 bool premultiplied_alpha = false; 77 bool premultiplied_alpha = false;
82 const gfx::PointF uv_top_left; 78 const gfx::PointF uv_top_left;
83 const gfx::PointF uv_bottom_right; 79 const gfx::PointF uv_bottom_right;
84 SkColor background_color = SK_ColorGREEN; 80 SkColor background_color = SK_ColorGREEN;
85 const float vertex_opacity[4] = {0.f, 0.f, 1.f, 1.f}; 81 const float vertex_opacity[4] = {0.f, 0.f, 1.f, 1.f};
86 bool flipped = false; 82 bool flipped = false;
87 bool nearest_neighbor = false; 83 bool nearest_neighbor = false;
88 quad->SetAll(sqs, rect, opaque_rect, visible_rect, needs_blending, j, 84 quad->SetAll(sqs, rect, opaque_rect, visible_rect, needs_blending, j,
89 gfx::Size(), premultiplied_alpha, uv_top_left, 85 gfx::Size(), premultiplied_alpha, uv_top_left,
90 uv_bottom_right, background_color, vertex_opacity, flipped, 86 uv_bottom_right, background_color, vertex_opacity, flipped,
91 nearest_neighbor, false); 87 nearest_neighbor, false);
92 } 88 }
93 sqs = pass->CreateAndAppendSharedQuadState(); 89 sqs = pass->CreateAndAppendSharedQuadState();
94 sqs->opacity = opacity; 90 sqs->opacity = opacity;
95 if (i >= 1) { 91 if (i >= 1) {
96 SurfaceDrawQuad* surface_quad = 92 SurfaceDrawQuad* surface_quad =
97 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 93 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
98 surface_quad->SetNew( 94 surface_quad->SetNew(
99 sqs, gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), 95 sqs, gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1),
100 SurfaceId(FrameSinkId(1, i), LocalSurfaceId(i, kArbitraryToken)), 96 SurfaceId(FrameSinkId(1, i), LocalSurfaceId(i, kArbitraryToken)),
101 SurfaceDrawQuadType::PRIMARY, nullptr); 97 SurfaceDrawQuadType::PRIMARY, nullptr);
102 } 98 }
103 99
104 frame.render_pass_list.push_back(std::move(pass)); 100 frame.render_pass_list.push_back(std::move(pass));
105 child_factories[i]->SubmitCompositorFrame( 101 child_supports[i]->SubmitCompositorFrame(local_surface_id,
106 local_surface_id, std::move(frame), SurfaceFactory::DrawCallback(), 102 std::move(frame));
107 SurfaceFactory::WillDrawCallback());
108 } 103 }
109 104
110 SurfaceFactory root_factory(FrameSinkId(1, num_surfaces + 1), &manager_, 105 std::unique_ptr<CompositorFrameSinkSupport> root_support =
111 &stub_surface_factory_client_, 106 CompositorFrameSinkSupport::Create(
112 &stub_surface_resource_holder_client_); 107 nullptr, &manager_, FrameSinkId(1, num_surfaces + 1), kIsRoot,
108 kHandlesFrameSinkIdInvalidation, kNeedsSyncPoints);
113 timer_.Reset(); 109 timer_.Reset();
114 do { 110 do {
115 std::unique_ptr<RenderPass> pass(RenderPass::Create()); 111 std::unique_ptr<RenderPass> pass(RenderPass::Create());
116 CompositorFrame frame; 112 CompositorFrame frame;
117 113
118 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); 114 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
119 SurfaceDrawQuad* surface_quad = 115 SurfaceDrawQuad* surface_quad =
120 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 116 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
121 surface_quad->SetNew( 117 surface_quad->SetNew(
122 sqs, gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 100, 100), 118 sqs, gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 100, 100),
123 SurfaceId(FrameSinkId(1, num_surfaces), 119 SurfaceId(FrameSinkId(1, num_surfaces),
124 LocalSurfaceId(num_surfaces, kArbitraryToken)), 120 LocalSurfaceId(num_surfaces, kArbitraryToken)),
125 SurfaceDrawQuadType::PRIMARY, nullptr); 121 SurfaceDrawQuadType::PRIMARY, nullptr);
126 122
127 if (full_damage) 123 if (full_damage)
128 pass->damage_rect = gfx::Rect(0, 0, 100, 100); 124 pass->damage_rect = gfx::Rect(0, 0, 100, 100);
129 else 125 else
130 pass->damage_rect = gfx::Rect(0, 0, 1, 1); 126 pass->damage_rect = gfx::Rect(0, 0, 1, 1);
131 127
132 frame.render_pass_list.push_back(std::move(pass)); 128 frame.render_pass_list.push_back(std::move(pass));
133 129
134 root_factory.SubmitCompositorFrame( 130 root_support->SubmitCompositorFrame(
135 LocalSurfaceId(num_surfaces + 1, kArbitraryToken), std::move(frame), 131 LocalSurfaceId(num_surfaces + 1, kArbitraryToken), std::move(frame));
136 SurfaceFactory::DrawCallback(), SurfaceFactory::WillDrawCallback());
137 132
138 CompositorFrame aggregated = aggregator_->Aggregate( 133 CompositorFrame aggregated = aggregator_->Aggregate(
139 SurfaceId(FrameSinkId(1, num_surfaces + 1), 134 SurfaceId(FrameSinkId(1, num_surfaces + 1),
140 LocalSurfaceId(num_surfaces + 1, kArbitraryToken))); 135 LocalSurfaceId(num_surfaces + 1, kArbitraryToken)));
141 timer_.NextLap(); 136 timer_.NextLap();
142 } while (!timer_.HasTimeLimitExpired()); 137 } while (!timer_.HasTimeLimitExpired());
143 138
144 perf_test::PrintResult("aggregator_speed", "", name, timer_.LapsPerSecond(), 139 perf_test::PrintResult("aggregator_speed", "", name, timer_.LapsPerSecond(),
145 "runs/s", true); 140 "runs/s", true);
146 for (int i = 0; i < num_surfaces; i++) 141 for (int i = 0; i < num_surfaces; i++)
147 child_factories[i]->EvictSurface(); 142 child_supports[i]->EvictFrame();
148 root_factory.EvictSurface(); 143 root_support->EvictFrame();
149 } 144 }
150 145
151 protected: 146 protected:
152 SurfaceManager manager_; 147 SurfaceManager manager_;
153 StubSurfaceResourceHolderClient stub_surface_resource_holder_client_;
154 StubSurfaceFactoryClient stub_surface_factory_client_;
155 scoped_refptr<TestContextProvider> context_provider_; 148 scoped_refptr<TestContextProvider> context_provider_;
156 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; 149 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
157 std::unique_ptr<ResourceProvider> resource_provider_; 150 std::unique_ptr<ResourceProvider> resource_provider_;
158 std::unique_ptr<SurfaceAggregator> aggregator_; 151 std::unique_ptr<SurfaceAggregator> aggregator_;
159 LapTimer timer_; 152 LapTimer timer_;
160 }; 153 };
161 154
162 TEST_F(SurfaceAggregatorPerfTest, ManySurfacesOpaque) { 155 TEST_F(SurfaceAggregatorPerfTest, ManySurfacesOpaque) {
163 RunTest(20, 100, 1.f, false, true, "many_surfaces_opaque"); 156 RunTest(20, 100, 1.f, false, true, "many_surfaces_opaque");
164 } 157 }
(...skipping 17 matching lines...) Expand all
182 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesDamageCalc) { 175 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesDamageCalc) {
183 RunTest(3, 1000, 1.f, true, true, "few_surfaces_damage_calc"); 176 RunTest(3, 1000, 1.f, true, true, "few_surfaces_damage_calc");
184 } 177 }
185 178
186 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesAggregateDamaged) { 179 TEST_F(SurfaceAggregatorPerfTest, FewSurfacesAggregateDamaged) {
187 RunTest(3, 1000, 1.f, true, false, "few_surfaces_aggregate_damaged"); 180 RunTest(3, 1000, 1.f, true, false, "few_surfaces_aggregate_damaged");
188 } 181 }
189 182
190 } // namespace 183 } // namespace
191 } // namespace cc 184 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698