Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 2a51c68

Browse files
authored
[DisplayList] benchmark DisplayList dispatch method (#54324)
We will be updating the DisplayList dispatching to support random access iteration through the records so we need a benchmark to set a baseline to track any impact on the default way to dispatch a DisplayList.
1 parent 6925ce3 commit 2a51c68

File tree

2 files changed

+107
-1
lines changed

2 files changed

+107
-1
lines changed

display_list/benchmarking/dl_builder_benchmarks.cc

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "flutter/benchmarking/benchmarking.h"
66
#include "flutter/display_list/testing/dl_test_snippets.h"
7+
#include "flutter/display_list/utils/dl_receiver_utils.h"
78

89
namespace flutter {
910

@@ -16,13 +17,22 @@ namespace {
1617
static std::vector<testing::DisplayListInvocationGroup> allRenderingOps =
1718
testing::CreateAllRenderingOps();
1819

20+
static std::vector<testing::DisplayListInvocationGroup> allOps =
21+
testing::CreateAllGroups();
22+
1923
enum class DisplayListBuilderBenchmarkType {
2024
kDefault,
2125
kBounds,
2226
kRtree,
2327
kBoundsAndRtree,
2428
};
2529

30+
enum class DisplayListDispatchBenchmarkType {
31+
kDefaultNoRtree,
32+
kDefaultWithRtree,
33+
kCulledWithRtree,
34+
};
35+
2636
static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
2737
DlOpReceiver& receiver = DisplayListBuilderBenchmarkAccessor(builder);
2838
for (auto& group : allRenderingOps) {
@@ -33,6 +43,21 @@ static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
3343
}
3444
}
3545

46+
static 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+
3661
static void Complete(DisplayListBuilder& builder,
3762
DisplayListBuilderBenchmarkType type) {
3863
auto display_list = builder.Build();
@@ -57,6 +82,10 @@ bool NeedPrepareRTree(DisplayListBuilderBenchmarkType type) {
5782
type == DisplayListBuilderBenchmarkType::kBoundsAndRtree;
5883
}
5984

85+
bool NeedPrepareRTree(DisplayListDispatchBenchmarkType type) {
86+
return type != DisplayListDispatchBenchmarkType::kDefaultNoRtree;
87+
}
88+
6089
} // namespace
6190

6291
static void BM_DisplayListBuilderDefault(benchmark::State& state,
@@ -171,6 +200,42 @@ static void BM_DisplayListBuilderWithSaveLayerAndImageFilter(
171200
}
172201
}
173202

203+
class DlOpReceiverIgnore : public IgnoreAttributeDispatchHelper,
204+
public IgnoreTransformDispatchHelper,
205+
public IgnoreClipDispatchHelper,
206+
public IgnoreDrawDispatchHelper {};
207+
208+
static void BM_DisplayListDispatchDefault(
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+
223+
static void BM_DisplayListDispatchCull(benchmark::State& state,
224+
DisplayListDispatchBenchmarkType type) {
225+
bool prepare_rtree = NeedPrepareRTree(type);
226+
DisplayListBuilder builder(prepare_rtree);
227+
for (int i = 0; i < 5; i++) {
228+
InvokeAllOps(builder);
229+
}
230+
auto display_list = builder.Build();
231+
SkRect rect = SkRect::MakeLTRB(0, 0, 100, 100);
232+
EXPECT_FALSE(rect.contains(display_list->bounds()));
233+
DlOpReceiverIgnore receiver;
234+
while (state.KeepRunning()) {
235+
display_list->Dispatch(receiver, rect);
236+
}
237+
}
238+
174239
BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault,
175240
kDefault,
176241
DisplayListBuilderBenchmarkType::kDefault)
@@ -290,4 +355,19 @@ BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayerAndImageFilter,
290355
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
291356
->Unit(benchmark::kMicrosecond);
292357

358+
BENCHMARK_CAPTURE(BM_DisplayListDispatchDefault,
359+
kDefaultNoRtree,
360+
DisplayListDispatchBenchmarkType::kDefaultNoRtree)
361+
->Unit(benchmark::kMicrosecond);
362+
363+
BENCHMARK_CAPTURE(BM_DisplayListDispatchDefault,
364+
kDefaultWithRtree,
365+
DisplayListDispatchBenchmarkType::kDefaultWithRtree)
366+
->Unit(benchmark::kMicrosecond);
367+
368+
BENCHMARK_CAPTURE(BM_DisplayListDispatchCull,
369+
kCulledWithRtree,
370+
DisplayListDispatchBenchmarkType::kCulledWithRtree)
371+
->Unit(benchmark::kMicrosecond);
372+
293373
} // namespace flutter

display_list/testing/dl_test_snippets.cc

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,15 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
5050
{"SetAntiAlias",
5151
{
5252
{0, 8, 0, [](DlOpReceiver& r) { r.setAntiAlias(true); }},
53+
54+
// Reset attribute to default as last entry
5355
{0, 0, 0, [](DlOpReceiver& r) { r.setAntiAlias(false); }},
5456
}},
5557
{"SetInvertColors",
5658
{
5759
{0, 8, 0, [](DlOpReceiver& r) { r.setInvertColors(true); }},
60+
61+
// Reset attribute to default as last entry
5862
{0, 0, 0, [](DlOpReceiver& r) { r.setInvertColors(false); }},
5963
}},
6064
{"SetStrokeCap",
@@ -63,6 +67,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
6367
[](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kRound); }},
6468
{0, 8, 0,
6569
[](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kSquare); }},
70+
71+
// Reset attribute to default as last entry
6672
{0, 0, 0,
6773
[](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kButt); }},
6874
}},
@@ -72,6 +78,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
7278
[](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kBevel); }},
7379
{0, 8, 0,
7480
[](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kRound); }},
81+
82+
// Reset attribute to default as last entry
7583
{0, 0, 0,
7684
[](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kMiter); }},
7785
}},
@@ -83,19 +91,25 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
8391
[](DlOpReceiver& r) {
8492
r.setDrawStyle(DlDrawStyle::kStrokeAndFill);
8593
}},
94+
95+
// Reset attribute to default as last entry
8696
{0, 0, 0,
8797
[](DlOpReceiver& r) { r.setDrawStyle(DlDrawStyle::kFill); }},
8898
}},
8999
{"SetStrokeWidth",
90100
{
91101
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeWidth(1.0); }},
92102
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeWidth(5.0); }},
103+
104+
// Reset attribute to default as last entry
93105
{0, 0, 0, [](DlOpReceiver& r) { r.setStrokeWidth(0.0); }},
94106
}},
95107
{"SetStrokeMiter",
96108
{
97109
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeMiter(0.0); }},
98110
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeMiter(5.0); }},
111+
112+
// Reset attribute to default as last entry
99113
{0, 0, 0, [](DlOpReceiver& r) { r.setStrokeMiter(4.0); }},
100114
}},
101115
{"SetColor",
@@ -104,6 +118,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
104118
[](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorGREEN)); }},
105119
{0, 8, 0,
106120
[](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorBLUE)); }},
121+
122+
// Reset attribute to default as last entry
107123
{0, 0, 0,
108124
[](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorBLACK)); }},
109125
}},
@@ -113,6 +129,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
113129
[](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kSrcIn); }},
114130
{0, 8, 0,
115131
[](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kDstIn); }},
132+
133+
// Reset attribute to default as last entry
116134
{0, 0, 0,
117135
[](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kSrcOver); }},
118136
}},
@@ -128,6 +146,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
128146
[](DlOpReceiver& r) { r.setColorSource(kTestSource4.get()); }},
129147
{0, 80 + 6 * 4, 0,
130148
[](DlOpReceiver& r) { r.setColorSource(kTestSource5.get()); }},
149+
150+
// Reset attribute to default as last entry
131151
{0, 0, 0, [](DlOpReceiver& r) { r.setColorSource(nullptr); }},
132152
}},
133153
{"SetImageFilter",
@@ -186,14 +206,16 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
186206
[](DlOpReceiver& r) { r.setImageFilter(&kTestCFImageFilter1); }},
187207
{0, 24, 0,
188208
[](DlOpReceiver& r) { r.setImageFilter(&kTestCFImageFilter2); }},
189-
{0, 0, 0, [](DlOpReceiver& r) { r.setImageFilter(nullptr); }},
190209
{0, 24, 0,
191210
[](DlOpReceiver& r) {
192211
r.setImageFilter(
193212
kTestBlurImageFilter1
194213
.makeWithLocalMatrix(SkMatrix::Translate(2, 2))
195214
.get());
196215
}},
216+
217+
// Reset attribute to default as last entry
218+
{0, 0, 0, [](DlOpReceiver& r) { r.setImageFilter(nullptr); }},
197219
}},
198220
{"SetColorFilter",
199221
{
@@ -219,6 +241,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
219241
[](DlOpReceiver& r) {
220242
r.setColorFilter(DlLinearToSrgbGammaColorFilter::kInstance.get());
221243
}},
244+
245+
// Reset attribute to default as last entry
222246
{0, 0, 0, [](DlOpReceiver& r) { r.setColorFilter(nullptr); }},
223247
}},
224248
{"SetMaskFilter",
@@ -238,6 +262,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
238262
{0, 32, 0,
239263
[](DlOpReceiver& r) { r.setMaskFilter(&kTestMaskFilter5); }, 0u,
240264
2u},
265+
266+
// Reset attribute to default as last entry
241267
{0, 0, 0, [](DlOpReceiver& r) { r.setMaskFilter(nullptr); }, 0u, 1u},
242268
}},
243269
};

0 commit comments

Comments
 (0)