Skip to content

Commit 56c6c18

Browse files
Create benchmarks for DisplayListBuilder (flutter#34910)
1 parent 98fc47b commit 56c6c18

File tree

9 files changed

+1652
-869
lines changed

9 files changed

+1652
-869
lines changed

BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ group("flutter") {
126126
if (enable_unittests && !is_win && !is_fuchsia) {
127127
public_deps += [
128128
"//flutter/display_list:display_list_benchmarks",
129+
"//flutter/display_list:display_list_builder_benchmarks",
129130
"//flutter/fml:fml_benchmarks",
130131
"//flutter/lib/ui:ui_benchmarks",
131132
"//flutter/shell/common:shell_benchmarks",

ci/licenses_golden/licenses_flutter

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ FILE: ../../../flutter/display_list/display_list_blend_mode.cc
5555
FILE: ../../../flutter/display_list/display_list_blend_mode.h
5656
FILE: ../../../flutter/display_list/display_list_builder.cc
5757
FILE: ../../../flutter/display_list/display_list_builder.h
58+
FILE: ../../../flutter/display_list/display_list_builder_benchmarks.cc
5859
FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.cc
5960
FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.h
6061
FILE: ../../../flutter/display_list/display_list_canvas_recorder.cc

display_list/BUILD.gn

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ if (enable_unittests) {
154154
[ "${fuchsia_sdk_path}/arch/${target_cpu}/sysroot/lib/libzircon.so" ]
155155
}
156156
}
157+
158+
executable("display_list_builder_benchmarks") {
159+
testonly = true
160+
161+
sources = [ "display_list_builder_benchmarks.cc" ]
162+
163+
deps = [
164+
":display_list",
165+
":display_list_fixtures",
166+
":display_list_testing",
167+
"//flutter/benchmarking",
168+
"//flutter/testing:testing_lib",
169+
]
170+
}
157171
}
158172

159173
fixtures_location("display_list_benchmarks_fixtures") {
Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "flutter/benchmarking/benchmarking.h"
6+
#include "flutter/display_list/display_list_test_utils.h"
7+
8+
namespace flutter {
9+
namespace {
10+
11+
static std::vector<testing::DisplayListInvocationGroup> allRenderingOps =
12+
testing::CreateAllRenderingOps();
13+
14+
enum class DisplayListBuilderBenchmarkType {
15+
kDefault,
16+
kBounds,
17+
kRtree,
18+
kBoundsAndRtree,
19+
};
20+
21+
static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
22+
for (auto& group : allRenderingOps) {
23+
for (size_t i = 0; i < group.variants.size(); i++) {
24+
auto& invocation = group.variants[i];
25+
invocation.Invoke(builder);
26+
}
27+
}
28+
}
29+
30+
static void Complete(DisplayListBuilder& builder,
31+
DisplayListBuilderBenchmarkType type) {
32+
auto display_list = builder.Build();
33+
switch (type) {
34+
case DisplayListBuilderBenchmarkType::kBounds:
35+
display_list->bounds();
36+
break;
37+
case DisplayListBuilderBenchmarkType::kRtree:
38+
display_list->rtree();
39+
break;
40+
case DisplayListBuilderBenchmarkType::kBoundsAndRtree:
41+
display_list->bounds();
42+
display_list->rtree();
43+
break;
44+
case DisplayListBuilderBenchmarkType::kDefault:
45+
break;
46+
}
47+
}
48+
49+
} // namespace
50+
51+
static void BM_DisplayListBuiderDefault(benchmark::State& state,
52+
DisplayListBuilderBenchmarkType type) {
53+
while (state.KeepRunning()) {
54+
DisplayListBuilder builder;
55+
InvokeAllRenderingOps(builder);
56+
Complete(builder, type);
57+
}
58+
}
59+
60+
static void BM_DisplayListBuiderWithScaleAndTranslate(
61+
benchmark::State& state,
62+
DisplayListBuilderBenchmarkType type) {
63+
while (state.KeepRunning()) {
64+
DisplayListBuilder builder;
65+
builder.scale(3.5, 3.5);
66+
builder.translate(10.3, 6.9);
67+
InvokeAllRenderingOps(builder);
68+
Complete(builder, type);
69+
}
70+
}
71+
72+
static void BM_DisplayListBuiderWithPerspective(
73+
benchmark::State& state,
74+
DisplayListBuilderBenchmarkType type) {
75+
while (state.KeepRunning()) {
76+
DisplayListBuilder builder;
77+
builder.transformFullPerspective(0, 1, 0, 12, 1, 0, 0, 33, 3, 2, 5, 29, 0,
78+
0, 0, 12);
79+
InvokeAllRenderingOps(builder);
80+
Complete(builder, type);
81+
}
82+
}
83+
84+
static void BM_DisplayListBuiderWithClipRect(
85+
benchmark::State& state,
86+
DisplayListBuilderBenchmarkType type) {
87+
SkRect clip_bounds = SkRect::MakeLTRB(6.5, 7.3, 90.2, 85.7);
88+
while (state.KeepRunning()) {
89+
DisplayListBuilder builder;
90+
builder.clipRect(clip_bounds, SkClipOp::kIntersect, true);
91+
InvokeAllRenderingOps(builder);
92+
Complete(builder, type);
93+
}
94+
}
95+
96+
static void BM_DisplayListBuiderWithSaveLayer(
97+
benchmark::State& state,
98+
DisplayListBuilderBenchmarkType type) {
99+
while (state.KeepRunning()) {
100+
DisplayListBuilder builder;
101+
for (auto& group : allRenderingOps) {
102+
for (size_t i = 0; i < group.variants.size(); i++) {
103+
auto& invocation = group.variants[i];
104+
builder.saveLayer(nullptr, false);
105+
invocation.Invoke(builder);
106+
builder.restore();
107+
}
108+
}
109+
Complete(builder, type);
110+
}
111+
}
112+
113+
static void BM_DisplayListBuiderWithSaveLayerAndImageFilter(
114+
benchmark::State& state,
115+
DisplayListBuilderBenchmarkType type) {
116+
DlPaint layer_paint;
117+
layer_paint.setImageFilter(&testing::kTestBlurImageFilter1);
118+
SkRect layer_bounds = SkRect::MakeLTRB(6.5, 7.3, 35.2, 42.7);
119+
while (state.KeepRunning()) {
120+
DisplayListBuilder builder;
121+
for (auto& group : allRenderingOps) {
122+
for (size_t i = 0; i < group.variants.size(); i++) {
123+
auto& invocation = group.variants[i];
124+
builder.saveLayer(&layer_bounds, &layer_paint);
125+
invocation.Invoke(builder);
126+
builder.restore();
127+
}
128+
}
129+
Complete(builder, type);
130+
}
131+
}
132+
133+
BENCHMARK_CAPTURE(BM_DisplayListBuiderDefault,
134+
kDefault,
135+
DisplayListBuilderBenchmarkType::kDefault)
136+
->Unit(benchmark::kMillisecond);
137+
BENCHMARK_CAPTURE(BM_DisplayListBuiderDefault,
138+
kBounds,
139+
DisplayListBuilderBenchmarkType::kBounds)
140+
->Unit(benchmark::kMillisecond);
141+
BENCHMARK_CAPTURE(BM_DisplayListBuiderDefault,
142+
kRtree,
143+
DisplayListBuilderBenchmarkType::kRtree)
144+
->Unit(benchmark::kMillisecond);
145+
BENCHMARK_CAPTURE(BM_DisplayListBuiderDefault,
146+
kBoundsAndRtree,
147+
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
148+
->Unit(benchmark::kMillisecond);
149+
150+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithScaleAndTranslate,
151+
kDefault,
152+
DisplayListBuilderBenchmarkType::kDefault)
153+
->Unit(benchmark::kMillisecond);
154+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithScaleAndTranslate,
155+
kBounds,
156+
DisplayListBuilderBenchmarkType::kBounds)
157+
->Unit(benchmark::kMillisecond);
158+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithScaleAndTranslate,
159+
kRtree,
160+
DisplayListBuilderBenchmarkType::kRtree)
161+
->Unit(benchmark::kMillisecond);
162+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithScaleAndTranslate,
163+
kBoundsAndRtree,
164+
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
165+
->Unit(benchmark::kMillisecond);
166+
167+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithPerspective,
168+
kDefault,
169+
DisplayListBuilderBenchmarkType::kDefault)
170+
->Unit(benchmark::kMillisecond);
171+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithPerspective,
172+
kBounds,
173+
DisplayListBuilderBenchmarkType::kBounds)
174+
->Unit(benchmark::kMillisecond);
175+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithPerspective,
176+
kRtree,
177+
DisplayListBuilderBenchmarkType::kRtree)
178+
->Unit(benchmark::kMillisecond);
179+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithPerspective,
180+
kBoundsAndRtree,
181+
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
182+
->Unit(benchmark::kMillisecond);
183+
184+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithClipRect,
185+
kDefault,
186+
DisplayListBuilderBenchmarkType::kDefault)
187+
->Unit(benchmark::kMillisecond);
188+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithClipRect,
189+
kBounds,
190+
DisplayListBuilderBenchmarkType::kBounds)
191+
->Unit(benchmark::kMillisecond);
192+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithClipRect,
193+
kRtree,
194+
DisplayListBuilderBenchmarkType::kRtree)
195+
->Unit(benchmark::kMillisecond);
196+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithClipRect,
197+
kBoundsAndRtree,
198+
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
199+
->Unit(benchmark::kMillisecond);
200+
201+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayer,
202+
kDefault,
203+
DisplayListBuilderBenchmarkType::kDefault)
204+
->Unit(benchmark::kMillisecond);
205+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayer,
206+
kBounds,
207+
DisplayListBuilderBenchmarkType::kBounds)
208+
->Unit(benchmark::kMillisecond);
209+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayer,
210+
kRtree,
211+
DisplayListBuilderBenchmarkType::kRtree)
212+
->Unit(benchmark::kMillisecond);
213+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayer,
214+
kBoundsAndRtree,
215+
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
216+
->Unit(benchmark::kMillisecond);
217+
218+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayerAndImageFilter,
219+
kDefault,
220+
DisplayListBuilderBenchmarkType::kDefault)
221+
->Unit(benchmark::kMillisecond);
222+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayerAndImageFilter,
223+
kBounds,
224+
DisplayListBuilderBenchmarkType::kBounds)
225+
->Unit(benchmark::kMillisecond);
226+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayerAndImageFilter,
227+
kRtree,
228+
DisplayListBuilderBenchmarkType::kRtree)
229+
->Unit(benchmark::kMillisecond);
230+
BENCHMARK_CAPTURE(BM_DisplayListBuiderWithSaveLayerAndImageFilter,
231+
kBoundsAndRtree,
232+
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
233+
->Unit(benchmark::kMillisecond);
234+
235+
} // namespace flutter

0 commit comments

Comments
 (0)