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

[DisplayList] benchmark DisplayList dispatch method #54324

Merged
merged 1 commit into from
Aug 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions display_list/benchmarking/dl_builder_benchmarks.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "flutter/benchmarking/benchmarking.h"
#include "flutter/display_list/testing/dl_test_snippets.h"
#include "flutter/display_list/utils/dl_receiver_utils.h"

namespace flutter {

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

static std::vector<testing::DisplayListInvocationGroup> allOps =
testing::CreateAllGroups();

enum class DisplayListBuilderBenchmarkType {
kDefault,
kBounds,
kRtree,
kBoundsAndRtree,
};

enum class DisplayListDispatchBenchmarkType {
kDefaultNoRtree,
kDefaultWithRtree,
kCulledWithRtree,
};

static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
DlOpReceiver& receiver = DisplayListBuilderBenchmarkAccessor(builder);
for (auto& group : allRenderingOps) {
Expand All @@ -33,6 +43,21 @@ static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
}
}

static void InvokeAllOps(DisplayListBuilder& builder) {
DlOpReceiver& receiver = DisplayListBuilderBenchmarkAccessor(builder);
for (auto& group : allOps) {
// Save/restore around each group so that the clip and transform
// test ops do not walk us out to infinity or prevent any future
// rendering ops.
receiver.save();
for (size_t i = 0; i < group.variants.size(); i++) {
auto& invocation = group.variants[i];
invocation.Invoke(receiver);
}
receiver.restore();
}
}

static void Complete(DisplayListBuilder& builder,
DisplayListBuilderBenchmarkType type) {
auto display_list = builder.Build();
Expand All @@ -57,6 +82,10 @@ bool NeedPrepareRTree(DisplayListBuilderBenchmarkType type) {
type == DisplayListBuilderBenchmarkType::kBoundsAndRtree;
}

bool NeedPrepareRTree(DisplayListDispatchBenchmarkType type) {
return type != DisplayListDispatchBenchmarkType::kDefaultNoRtree;
}

} // namespace

static void BM_DisplayListBuilderDefault(benchmark::State& state,
Expand Down Expand Up @@ -171,6 +200,42 @@ static void BM_DisplayListBuilderWithSaveLayerAndImageFilter(
}
}

class DlOpReceiverIgnore : public IgnoreAttributeDispatchHelper,
public IgnoreTransformDispatchHelper,
public IgnoreClipDispatchHelper,
public IgnoreDrawDispatchHelper {};

static void BM_DisplayListDispatchDefault(
benchmark::State& state,
DisplayListDispatchBenchmarkType type) {
bool prepare_rtree = NeedPrepareRTree(type);
DisplayListBuilder builder(prepare_rtree);
for (int i = 0; i < 5; i++) {
InvokeAllOps(builder);
}
auto display_list = builder.Build();
DlOpReceiverIgnore receiver;
while (state.KeepRunning()) {
display_list->Dispatch(receiver);
}
}

static void BM_DisplayListDispatchCull(benchmark::State& state,
DisplayListDispatchBenchmarkType type) {
bool prepare_rtree = NeedPrepareRTree(type);
DisplayListBuilder builder(prepare_rtree);
for (int i = 0; i < 5; i++) {
InvokeAllOps(builder);
}
auto display_list = builder.Build();
SkRect rect = SkRect::MakeLTRB(0, 0, 100, 100);
EXPECT_FALSE(rect.contains(display_list->bounds()));
DlOpReceiverIgnore receiver;
while (state.KeepRunning()) {
display_list->Dispatch(receiver, rect);
}
}

BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault,
kDefault,
DisplayListBuilderBenchmarkType::kDefault)
Expand Down Expand Up @@ -290,4 +355,19 @@ BENCHMARK_CAPTURE(BM_DisplayListBuilderWithSaveLayerAndImageFilter,
DisplayListBuilderBenchmarkType::kBoundsAndRtree)
->Unit(benchmark::kMicrosecond);

BENCHMARK_CAPTURE(BM_DisplayListDispatchDefault,
kDefaultNoRtree,
DisplayListDispatchBenchmarkType::kDefaultNoRtree)
->Unit(benchmark::kMicrosecond);

BENCHMARK_CAPTURE(BM_DisplayListDispatchDefault,
kDefaultWithRtree,
DisplayListDispatchBenchmarkType::kDefaultWithRtree)
->Unit(benchmark::kMicrosecond);

BENCHMARK_CAPTURE(BM_DisplayListDispatchCull,
kCulledWithRtree,
DisplayListDispatchBenchmarkType::kCulledWithRtree)
->Unit(benchmark::kMicrosecond);

} // namespace flutter
28 changes: 27 additions & 1 deletion display_list/testing/dl_test_snippets.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,15 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
{"SetAntiAlias",
{
{0, 8, 0, [](DlOpReceiver& r) { r.setAntiAlias(true); }},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setAntiAlias(false); }},
}},
{"SetInvertColors",
{
{0, 8, 0, [](DlOpReceiver& r) { r.setInvertColors(true); }},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setInvertColors(false); }},
}},
{"SetStrokeCap",
Expand All @@ -63,6 +67,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kRound); }},
{0, 8, 0,
[](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kSquare); }},

// Reset attribute to default as last entry
{0, 0, 0,
[](DlOpReceiver& r) { r.setStrokeCap(DlStrokeCap::kButt); }},
}},
Expand All @@ -72,6 +78,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kBevel); }},
{0, 8, 0,
[](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kRound); }},

// Reset attribute to default as last entry
{0, 0, 0,
[](DlOpReceiver& r) { r.setStrokeJoin(DlStrokeJoin::kMiter); }},
}},
Expand All @@ -83,19 +91,25 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) {
r.setDrawStyle(DlDrawStyle::kStrokeAndFill);
}},

// Reset attribute to default as last entry
{0, 0, 0,
[](DlOpReceiver& r) { r.setDrawStyle(DlDrawStyle::kFill); }},
}},
{"SetStrokeWidth",
{
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeWidth(1.0); }},
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeWidth(5.0); }},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setStrokeWidth(0.0); }},
}},
{"SetStrokeMiter",
{
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeMiter(0.0); }},
{0, 8, 0, [](DlOpReceiver& r) { r.setStrokeMiter(5.0); }},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setStrokeMiter(4.0); }},
}},
{"SetColor",
Expand All @@ -104,6 +118,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorGREEN)); }},
{0, 8, 0,
[](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorBLUE)); }},

// Reset attribute to default as last entry
{0, 0, 0,
[](DlOpReceiver& r) { r.setColor(DlColor(SK_ColorBLACK)); }},
}},
Expand All @@ -113,6 +129,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kSrcIn); }},
{0, 8, 0,
[](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kDstIn); }},

// Reset attribute to default as last entry
{0, 0, 0,
[](DlOpReceiver& r) { r.setBlendMode(DlBlendMode::kSrcOver); }},
}},
Expand All @@ -128,6 +146,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) { r.setColorSource(kTestSource4.get()); }},
{0, 80 + 6 * 4, 0,
[](DlOpReceiver& r) { r.setColorSource(kTestSource5.get()); }},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setColorSource(nullptr); }},
}},
{"SetImageFilter",
Expand Down Expand Up @@ -186,14 +206,16 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) { r.setImageFilter(&kTestCFImageFilter1); }},
{0, 24, 0,
[](DlOpReceiver& r) { r.setImageFilter(&kTestCFImageFilter2); }},
{0, 0, 0, [](DlOpReceiver& r) { r.setImageFilter(nullptr); }},
{0, 24, 0,
[](DlOpReceiver& r) {
r.setImageFilter(
kTestBlurImageFilter1
.makeWithLocalMatrix(SkMatrix::Translate(2, 2))
.get());
}},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setImageFilter(nullptr); }},
}},
{"SetColorFilter",
{
Expand All @@ -219,6 +241,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
[](DlOpReceiver& r) {
r.setColorFilter(DlLinearToSrgbGammaColorFilter::kInstance.get());
}},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setColorFilter(nullptr); }},
}},
{"SetMaskFilter",
Expand All @@ -238,6 +262,8 @@ std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() {
{0, 32, 0,
[](DlOpReceiver& r) { r.setMaskFilter(&kTestMaskFilter5); }, 0u,
2u},

// Reset attribute to default as last entry
{0, 0, 0, [](DlOpReceiver& r) { r.setMaskFilter(nullptr); }, 0u, 1u},
}},
};
Expand Down