Flutter Engine
 
Loading...
Searching...
No Matches
dl_builder_benchmarks.cc
Go to the documentation of this file.
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
8
9namespace flutter {
10
12 return builder.asReceiver();
13}
14
15namespace {
16
17static std::vector<testing::DisplayListInvocationGroup> allRenderingOps =
19
20static std::vector<testing::DisplayListInvocationGroup> allOps =
22
23enum class DisplayListBuilderBenchmarkType {
24 kDefault,
25 kBounds,
26 kRtree,
27 kBoundsAndRtree,
28};
29
30enum class DisplayListDispatchBenchmarkType {
31 kDefaultNoRtree,
32 kDefaultWithRtree,
33 kCulledWithRtree,
34};
35
36static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
37 DlOpReceiver& receiver = DisplayListBuilderBenchmarkAccessor(builder);
38 for (auto& group : allRenderingOps) {
39 for (size_t i = 0; i < group.variants.size(); i++) {
40 auto& invocation = group.variants[i];
41 invocation.Invoke(receiver);
42 }
43 }
44}
45
46static void InvokeAllOps(DisplayListBuilder& builder) {
47 DlOpReceiver& receiver = DisplayListBuilderBenchmarkAccessor(builder);
48 for (auto& group : allOps) {
49 // Save/restore around each group so that the clip and transform
50 // test ops do not walk us out to infinity or prevent any future
51 // rendering ops.
52 receiver.save();
53 for (size_t i = 0; i < group.variants.size(); i++) {
54 auto& invocation = group.variants[i];
55 invocation.Invoke(receiver);
56 }
57 receiver.restore();
58 }
59}
60
61static void Complete(DisplayListBuilder& builder,
62 DisplayListBuilderBenchmarkType type) {
63 auto display_list = builder.Build();
64 switch (type) {
65 case DisplayListBuilderBenchmarkType::kBounds:
66 display_list->GetBounds();
67 break;
68 case DisplayListBuilderBenchmarkType::kRtree:
69 display_list->rtree();
70 break;
71 case DisplayListBuilderBenchmarkType::kBoundsAndRtree:
72 display_list->GetBounds();
73 display_list->rtree();
74 break;
75 case DisplayListBuilderBenchmarkType::kDefault:
76 break;
77 }
78}
79
80bool NeedPrepareRTree(DisplayListBuilderBenchmarkType type) {
81 return type == DisplayListBuilderBenchmarkType::kRtree ||
82 type == DisplayListBuilderBenchmarkType::kBoundsAndRtree;
83}
84
85bool NeedPrepareRTree(DisplayListDispatchBenchmarkType type) {
86 return type != DisplayListDispatchBenchmarkType::kDefaultNoRtree;
87}
88
89} // namespace
90
91static void BM_DisplayListBuilderDefault(benchmark::State& state,
92 DisplayListBuilderBenchmarkType type) {
93 bool prepare_rtree = NeedPrepareRTree(type);
94 while (state.KeepRunning()) {
95 DisplayListBuilder builder(prepare_rtree);
96 InvokeAllRenderingOps(builder);
97 Complete(builder, type);
98 }
99}
100
102 benchmark::State& state,
103 DisplayListBuilderBenchmarkType type) {
104 bool prepare_rtree = NeedPrepareRTree(type);
105 while (state.KeepRunning()) {
106 DisplayListBuilder builder(prepare_rtree);
107 builder.Scale(3.5, 3.5);
108 builder.Translate(10.3, 6.9);
109 InvokeAllRenderingOps(builder);
110 Complete(builder, type);
111 }
112}
113
115 benchmark::State& state,
116 DisplayListBuilderBenchmarkType type) {
117 bool prepare_rtree = NeedPrepareRTree(type);
118 while (state.KeepRunning()) {
119 DisplayListBuilder builder(prepare_rtree);
120 builder.TransformFullPerspective(0, 1, 0, 12, 1, 0, 0, 33, 3, 2, 5, 29, 0,
121 0, 0, 12);
122 InvokeAllRenderingOps(builder);
123 Complete(builder, type);
124 }
125}
126
128 benchmark::State& state,
129 DisplayListBuilderBenchmarkType type) {
130 DlRect clip_bounds = DlRect::MakeLTRB(6.5, 7.3, 90.2, 85.7);
131 bool prepare_rtree = NeedPrepareRTree(type);
132 while (state.KeepRunning()) {
133 DisplayListBuilder builder(prepare_rtree);
134 builder.ClipRect(clip_bounds, DlClipOp::kIntersect, true);
135 InvokeAllRenderingOps(builder);
136 Complete(builder, type);
137 }
138}
139
141 benchmark::State& state,
142 DisplayListBuilderBenchmarkType type) {
143 bool prepare_rtree = NeedPrepareRTree(type);
144 while (state.KeepRunning()) {
145 DisplayListBuilder builder(prepare_rtree);
146 builder.Scale(3.5, 3.5);
147 builder.Translate(10.3, 6.9);
148 builder.SaveLayer(std::nullopt, nullptr);
149 builder.Translate(45.3, 27.9);
151 for (auto& group : allRenderingOps) {
152 for (size_t i = 0; i < group.variants.size(); i++) {
153 auto& invocation = group.variants[i];
154 invocation.Invoke(receiver);
155 }
156 }
157 builder.Restore();
158 Complete(builder, type);
159 }
160}
161
163 benchmark::State& state,
164 DisplayListBuilderBenchmarkType type) {
165 bool prepare_rtree = NeedPrepareRTree(type);
166 while (state.KeepRunning()) {
167 DisplayListBuilder builder(prepare_rtree);
169 for (auto& group : allRenderingOps) {
170 for (size_t i = 0; i < group.variants.size(); i++) {
171 auto& invocation = group.variants[i];
172 builder.SaveLayer(std::nullopt, nullptr);
173 invocation.Invoke(receiver);
174 builder.Restore();
175 }
176 }
177 Complete(builder, type);
178 }
179}
180
182 benchmark::State& state,
183 DisplayListBuilderBenchmarkType type) {
184 DlPaint layer_paint;
186 DlRect layer_bounds = DlRect::MakeLTRB(6.5, 7.3, 35.2, 42.7);
187 bool prepare_rtree = NeedPrepareRTree(type);
188 while (state.KeepRunning()) {
189 DisplayListBuilder builder(prepare_rtree);
191 for (auto& group : allRenderingOps) {
192 for (size_t i = 0; i < group.variants.size(); i++) {
193 auto& invocation = group.variants[i];
194 builder.SaveLayer(layer_bounds, &layer_paint);
195 invocation.Invoke(receiver);
196 builder.Restore();
197 }
198 }
199 Complete(builder, type);
200 }
201}
202
207
209 benchmark::State& state,
210 DisplayListDispatchBenchmarkType type) {
211 bool prepare_rtree = NeedPrepareRTree(type);
212 DisplayListBuilder builder(prepare_rtree);
213 for (int i = 0; i < 5; i++) {
214 InvokeAllOps(builder);
215 }
216 auto display_list = builder.Build();
217 DlOpReceiverIgnore receiver;
218 while (state.KeepRunning()) {
219 display_list->Dispatch(receiver);
220 }
221}
222
224 benchmark::State& state,
225 DisplayListDispatchBenchmarkType type) {
226 bool prepare_rtree = NeedPrepareRTree(type);
227 DisplayListBuilder builder(prepare_rtree);
228 for (int i = 0; i < 5; i++) {
229 InvokeAllOps(builder);
230 }
231 auto display_list = builder.Build();
232 DlOpReceiverIgnore receiver;
233 while (state.KeepRunning()) {
234 DlIndex end = display_list->GetRecordCount();
235 for (DlIndex i = 0u; i < end; i++) {
236 display_list->Dispatch(receiver, i);
237 }
238 }
239}
240
242 benchmark::State& state,
243 DisplayListDispatchBenchmarkType type) {
244 bool prepare_rtree = NeedPrepareRTree(type);
245 DisplayListBuilder builder(prepare_rtree);
246 for (int i = 0; i < 5; i++) {
247 InvokeAllOps(builder);
248 }
249 auto display_list = builder.Build();
250 DlOpReceiverIgnore receiver;
251 while (state.KeepRunning()) {
252 for (DlIndex i : *display_list) {
253 display_list->Dispatch(receiver, i);
254 }
255 }
256}
257
259 benchmark::State& state,
260 DisplayListDispatchBenchmarkType type) {
261 bool prepare_rtree = NeedPrepareRTree(type);
262 DisplayListBuilder builder(prepare_rtree);
263 for (int i = 0; i < 5; i++) {
264 InvokeAllOps(builder);
265 }
266 auto display_list = builder.Build();
267 DlOpReceiverIgnore receiver;
268 while (state.KeepRunning()) {
269 std::vector<DlIndex> indices =
270 display_list->GetCulledIndices(display_list->GetBounds());
271 for (DlIndex index : indices) {
272 display_list->Dispatch(receiver, index);
273 }
274 }
275}
276
277static void BM_DisplayListDispatchCull(benchmark::State& state,
278 DisplayListDispatchBenchmarkType type) {
279 bool prepare_rtree = NeedPrepareRTree(type);
280 DisplayListBuilder builder(prepare_rtree);
281 for (int i = 0; i < 5; i++) {
282 InvokeAllOps(builder);
283 }
284 auto display_list = builder.Build();
285 DlRect rect = DlRect::MakeLTRB(0, 0, 100, 100);
286 EXPECT_FALSE(rect.Contains(display_list->GetBounds()));
287 DlOpReceiverIgnore receiver;
288 while (state.KeepRunning()) {
289 display_list->Dispatch(receiver, rect);
290 }
291}
292
294 benchmark::State& state,
295 DisplayListDispatchBenchmarkType type) {
296 bool prepare_rtree = NeedPrepareRTree(type);
297 DisplayListBuilder builder(prepare_rtree);
298 for (int i = 0; i < 5; i++) {
299 InvokeAllOps(builder);
300 }
301 auto display_list = builder.Build();
302 DlRect rect = DlRect::MakeLTRB(0, 0, 100, 100);
303 EXPECT_FALSE(rect.Contains(display_list->GetBounds()));
304 DlOpReceiverIgnore receiver;
305 while (state.KeepRunning()) {
306 std::vector<DlIndex> indices = display_list->GetCulledIndices(rect);
307 for (DlIndex index : indices) {
308 display_list->Dispatch(receiver, index);
309 }
310 }
311}
312
314 kDefault,
315 DisplayListBuilderBenchmarkType::kDefault)
316 ->Unit(benchmark::kMicrosecond);
318 kBounds,
319 DisplayListBuilderBenchmarkType::kBounds)
320 ->Unit(benchmark::kMicrosecond);
322 kRtree,
323 DisplayListBuilderBenchmarkType::kRtree)
324 ->Unit(benchmark::kMicrosecond);
326 kBoundsAndRtree,
327 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
328 ->Unit(benchmark::kMicrosecond);
329
331 kDefault,
332 DisplayListBuilderBenchmarkType::kDefault)
333 ->Unit(benchmark::kMicrosecond);
335 kBounds,
336 DisplayListBuilderBenchmarkType::kBounds)
337 ->Unit(benchmark::kMicrosecond);
339 kRtree,
340 DisplayListBuilderBenchmarkType::kRtree)
341 ->Unit(benchmark::kMicrosecond);
343 kBoundsAndRtree,
344 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
345 ->Unit(benchmark::kMicrosecond);
346
348 kDefault,
349 DisplayListBuilderBenchmarkType::kDefault)
350 ->Unit(benchmark::kMicrosecond);
352 kBounds,
353 DisplayListBuilderBenchmarkType::kBounds)
354 ->Unit(benchmark::kMicrosecond);
356 kRtree,
357 DisplayListBuilderBenchmarkType::kRtree)
358 ->Unit(benchmark::kMicrosecond);
360 kBoundsAndRtree,
361 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
362 ->Unit(benchmark::kMicrosecond);
363
365 kDefault,
366 DisplayListBuilderBenchmarkType::kDefault)
367 ->Unit(benchmark::kMicrosecond);
369 kBounds,
370 DisplayListBuilderBenchmarkType::kBounds)
371 ->Unit(benchmark::kMicrosecond);
373 kRtree,
374 DisplayListBuilderBenchmarkType::kRtree)
375 ->Unit(benchmark::kMicrosecond);
377 kBoundsAndRtree,
378 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
379 ->Unit(benchmark::kMicrosecond);
380
382 kDefault,
383 DisplayListBuilderBenchmarkType::kDefault)
384 ->Unit(benchmark::kMicrosecond);
386 kBounds,
387 DisplayListBuilderBenchmarkType::kBounds)
388 ->Unit(benchmark::kMicrosecond);
390 kRtree,
391 DisplayListBuilderBenchmarkType::kRtree)
392 ->Unit(benchmark::kMicrosecond);
394 kBoundsAndRtree,
395 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
396 ->Unit(benchmark::kMicrosecond);
397
399 kDefault,
400 DisplayListBuilderBenchmarkType::kDefault)
401 ->Unit(benchmark::kMicrosecond);
403 kBounds,
404 DisplayListBuilderBenchmarkType::kBounds)
405 ->Unit(benchmark::kMicrosecond);
407 kRtree,
408 DisplayListBuilderBenchmarkType::kRtree)
409 ->Unit(benchmark::kMicrosecond);
411 kBoundsAndRtree,
412 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
413 ->Unit(benchmark::kMicrosecond);
414
416 kDefault,
417 DisplayListBuilderBenchmarkType::kDefault)
418 ->Unit(benchmark::kMicrosecond);
420 kBounds,
421 DisplayListBuilderBenchmarkType::kBounds)
422 ->Unit(benchmark::kMicrosecond);
424 kRtree,
425 DisplayListBuilderBenchmarkType::kRtree)
426 ->Unit(benchmark::kMicrosecond);
428 kBoundsAndRtree,
429 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
430 ->Unit(benchmark::kMicrosecond);
431
433 kDefaultNoRtree,
434 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
435 ->Unit(benchmark::kMicrosecond);
436
438 kDefaultWithRtree,
439 DisplayListDispatchBenchmarkType::kDefaultWithRtree)
440 ->Unit(benchmark::kMicrosecond);
441
443 kCulledWithRtree,
444 DisplayListDispatchBenchmarkType::kCulledWithRtree)
445 ->Unit(benchmark::kMicrosecond);
446
448 kDefaultNoRtree,
449 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
450 ->Unit(benchmark::kMicrosecond);
451
453 kDefaultNoRtree,
454 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
455 ->Unit(benchmark::kMicrosecond);
456
458 kDefaultNoRtree,
459 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
460 ->Unit(benchmark::kMicrosecond);
461
463 kCulledWithRtree,
464 DisplayListDispatchBenchmarkType::kCulledWithRtree)
465 ->Unit(benchmark::kMicrosecond);
466
467} // namespace flutter
GLenum type
void ClipRect(const DlRect &rect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void SaveLayer(const std::optional< DlRect > &bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr, std::optional< int64_t > backdrop_id=std::nullopt) override
void Scale(DlScalar sx, DlScalar sy) override
void Translate(DlScalar tx, DlScalar ty) override
sk_sp< DisplayList > Build()
Definition dl_builder.cc:66
void TransformFullPerspective(DlScalar mxx, DlScalar mxy, DlScalar mxz, DlScalar mxt, DlScalar myx, DlScalar myy, DlScalar myz, DlScalar myt, DlScalar mzx, DlScalar mzy, DlScalar mzz, DlScalar mzt, DlScalar mwx, DlScalar mwy, DlScalar mwz, DlScalar mwt) override
Internal API for rendering recorded display lists to backends.
DlPaint & setImageFilter(std::nullptr_t filter)
Definition dl_paint.h:167
std::vector< DisplayListInvocationGroup > CreateAllRenderingOps()
static const DlBlurImageFilter kTestBlurImageFilter1(5.0, 5.0, DlTileMode::kClamp)
std::vector< DisplayListInvocationGroup > CreateAllGroups()
static void BM_DisplayListDispatchByIndexDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
uint32_t DlIndex
static void BM_DisplayListDispatchByVectorCull(benchmark::State &state, DisplayListDispatchBenchmarkType type)
static void BM_DisplayListBuilderWithScaleAndTranslate(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithSaveLayer(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderDefault(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithClipRect(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListDispatchDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
static void BM_DisplayListDispatchCull(benchmark::State &state, DisplayListDispatchBenchmarkType type)
BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault, kDefault, DisplayListBuilderBenchmarkType::kDefault) -> Unit(benchmark::kMicrosecond)
static void BM_DisplayListDispatchByVectorDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
static void BM_DisplayListDispatchByIteratorDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
DlOpReceiver & DisplayListBuilderBenchmarkAccessor(DisplayListBuilder &builder)
static void BM_DisplayListBuilderWithSaveLayerAndImageFilter(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithGlobalSaveLayer(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithPerspective(benchmark::State &state, DisplayListBuilderBenchmarkType type)
constexpr bool Contains(const TPoint< Type > &p) const
Returns true iff the provided point |p| is inside the half-open interior of this rectangle.
Definition rect.h:231
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition rect.h:129
const size_t end