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

Commit 89e4620

Browse files
committed
add non-rendering operation culling to DisplayListBuilder
1 parent 9873ae7 commit 89e4620

18 files changed

+707
-257
lines changed

display_list/benchmarking/dl_complexity_unittests.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ TEST(DisplayListComplexity, DrawAtlas) {
423423
std::vector<SkRSXform> xforms;
424424
for (int i = 0; i < 10; i++) {
425425
rects.push_back(SkRect::MakeXYWH(0, 0, 10, 10));
426-
xforms.push_back(SkRSXform::Make(0, 0, 0, 0));
426+
xforms.push_back(SkRSXform::Make(1, 0, 0, 0));
427427
}
428428

429429
DisplayListBuilder builder;

display_list/display_list_unittests.cc

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "flutter/testing/testing.h"
2323

2424
#include "third_party/skia/include/core/SkPictureRecorder.h"
25+
#include "third_party/skia/include/core/SkRSXform.h"
2526
#include "third_party/skia/include/core/SkSurface.h"
2627

2728
namespace flutter {
@@ -2622,5 +2623,163 @@ TEST_F(DisplayListTest, DrawSaveDrawCannotInheritOpacity) {
26222623
ASSERT_FALSE(display_list->can_apply_group_opacity());
26232624
}
26242625

2626+
TEST_F(DisplayListTest, NopOperationsOmittedFromRecords) {
2627+
auto run_tests = [](const std::string& name,
2628+
void init(DisplayListBuilder & builder, DlPaint & paint),
2629+
uint32_t expected_op_count = 0u) {
2630+
auto run_one_test =
2631+
[init](const std::string& name,
2632+
void build(DisplayListBuilder & builder, DlPaint & paint),
2633+
uint32_t expected_op_count = 0u) {
2634+
DisplayListBuilder builder;
2635+
DlPaint paint;
2636+
init(builder, paint);
2637+
build(builder, paint);
2638+
auto list = builder.Build();
2639+
if (list->op_count() != expected_op_count) {
2640+
FML_LOG(ERROR) << *list;
2641+
}
2642+
ASSERT_EQ(list->op_count(), expected_op_count) << name;
2643+
ASSERT_TRUE(list->bounds().isEmpty()) << name;
2644+
};
2645+
run_one_test(
2646+
name + " DrawColor",
2647+
[](DisplayListBuilder& builder, DlPaint& paint) {
2648+
builder.DrawColor(paint.getColor(), paint.getBlendMode());
2649+
},
2650+
expected_op_count);
2651+
run_one_test(
2652+
name + " DrawPaint",
2653+
[](DisplayListBuilder& builder, DlPaint& paint) {
2654+
builder.DrawPaint(paint);
2655+
},
2656+
expected_op_count);
2657+
run_one_test(
2658+
name + " DrawRect",
2659+
[](DisplayListBuilder& builder, DlPaint& paint) {
2660+
builder.DrawRect({10, 10, 20, 20}, paint);
2661+
},
2662+
expected_op_count);
2663+
run_one_test(
2664+
name + " Other Draw Ops",
2665+
[](DisplayListBuilder& builder, DlPaint& paint) {
2666+
builder.DrawLine({10, 10}, {20, 20}, paint);
2667+
builder.DrawOval({10, 10, 20, 20}, paint);
2668+
builder.DrawCircle({50, 50}, 20, paint);
2669+
builder.DrawRRect(SkRRect::MakeRectXY({10, 10, 20, 20}, 5, 5), paint);
2670+
builder.DrawDRRect(SkRRect::MakeRectXY({5, 5, 100, 100}, 5, 5),
2671+
SkRRect::MakeRectXY({10, 10, 20, 20}, 5, 5),
2672+
paint);
2673+
builder.DrawPath(kTestPath1, paint);
2674+
builder.DrawArc({10, 10, 20, 20}, 45, 90, true, paint);
2675+
SkPoint pts[] = {{10, 10}, {20, 20}};
2676+
builder.DrawPoints(PointMode::kLines, 2, pts, paint);
2677+
builder.DrawVertices(TestVertices1, DlBlendMode::kSrcOver, paint);
2678+
builder.DrawImage(TestImage1, {10, 10}, DlImageSampling::kLinear,
2679+
&paint);
2680+
builder.DrawImageRect(TestImage1, {0, 0, 10, 10}, {10, 10, 25, 25},
2681+
DlImageSampling::kLinear, &paint);
2682+
builder.DrawImageNine(TestImage1, {10, 10, 20, 20},
2683+
{10, 10, 100, 100}, DlFilterMode::kLinear,
2684+
&paint);
2685+
SkRSXform xforms[] = {{1, 0, 10, 10}, {0, 1, 10, 10}};
2686+
SkRect rects[] = {{10, 10, 20, 20}, {10, 20, 30, 20}};
2687+
builder.DrawAtlas(TestImage1, xforms, rects, nullptr, 2,
2688+
DlBlendMode::kSrcOver, DlImageSampling::kLinear,
2689+
nullptr, &paint);
2690+
builder.DrawTextBlob(TestBlob1, 10, 10, paint);
2691+
2692+
// Dst mode eliminates most rendering ops except for
2693+
// the following two, so we'll prune those manually...
2694+
if (paint.getBlendMode() != DlBlendMode::kDst) {
2695+
builder.DrawDisplayList(TestDisplayList1, paint.getOpacity());
2696+
builder.DrawShadow(kTestPath1, paint.getColor(), 1, true, 1);
2697+
}
2698+
},
2699+
expected_op_count);
2700+
run_one_test(
2701+
name + " SaveLayer",
2702+
[](DisplayListBuilder& builder, DlPaint& paint) {
2703+
builder.SaveLayer(nullptr, &paint, nullptr);
2704+
builder.DrawRect({10, 10, 20, 20}, DlPaint());
2705+
builder.Restore();
2706+
},
2707+
expected_op_count);
2708+
run_one_test(
2709+
name + " inside Save",
2710+
[](DisplayListBuilder& builder, DlPaint& paint) {
2711+
builder.Save();
2712+
builder.DrawRect({10, 10, 20, 20}, paint);
2713+
builder.Restore();
2714+
},
2715+
expected_op_count);
2716+
};
2717+
run_tests("transparent color", //
2718+
[](DisplayListBuilder& builder, DlPaint& paint) {
2719+
paint.setColor(DlColor::kTransparent());
2720+
});
2721+
run_tests("0 alpha", //
2722+
[](DisplayListBuilder& builder, DlPaint& paint) {
2723+
// The transparent test above already tested transparent
2724+
// black (all 0s), we set White color here so we can test
2725+
// the case of all 1s with a 0 alpha
2726+
paint.setColor(DlColor::kWhite());
2727+
paint.setAlpha(0);
2728+
});
2729+
run_tests("BlendMode::kDst", //
2730+
[](DisplayListBuilder& builder, DlPaint& paint) {
2731+
paint.setBlendMode(DlBlendMode::kDst);
2732+
});
2733+
run_tests("Empty rect clip", //
2734+
[](DisplayListBuilder& builder, DlPaint& paint) {
2735+
builder.ClipRect(SkRect::MakeEmpty(), ClipOp::kIntersect, false);
2736+
});
2737+
run_tests("Empty rrect clip", //
2738+
[](DisplayListBuilder& builder, DlPaint& paint) {
2739+
builder.ClipRRect(SkRRect::MakeEmpty(), ClipOp::kIntersect,
2740+
false);
2741+
});
2742+
run_tests("Empty path clip", //
2743+
[](DisplayListBuilder& builder, DlPaint& paint) {
2744+
builder.ClipPath(SkPath(), ClipOp::kIntersect, false);
2745+
});
2746+
run_tests("Transparent SaveLayer", //
2747+
[](DisplayListBuilder& builder, DlPaint& paint) {
2748+
DlPaint save_paint;
2749+
save_paint.setColor(DlColor::kTransparent());
2750+
builder.SaveLayer(nullptr, &save_paint);
2751+
});
2752+
run_tests("0 alpha SaveLayer", //
2753+
[](DisplayListBuilder& builder, DlPaint& paint) {
2754+
DlPaint save_paint;
2755+
// The transparent test above already tested transparent
2756+
// black (all 0s), we set White color here so we can test
2757+
// the case of all 1s with a 0 alpha
2758+
save_paint.setColor(DlColor::kWhite());
2759+
save_paint.setAlpha(0);
2760+
builder.SaveLayer(nullptr, &save_paint);
2761+
});
2762+
run_tests("Dst blended SaveLayer", //
2763+
[](DisplayListBuilder& builder, DlPaint& paint) {
2764+
DlPaint save_paint;
2765+
save_paint.setBlendMode(DlBlendMode::kDst);
2766+
builder.SaveLayer(nullptr, &save_paint);
2767+
});
2768+
run_tests(
2769+
"Nop inside SaveLayer",
2770+
[](DisplayListBuilder& builder, DlPaint& paint) {
2771+
builder.SaveLayer(nullptr, nullptr);
2772+
paint.setBlendMode(DlBlendMode::kDst);
2773+
},
2774+
2u);
2775+
run_tests("DrawImage inside Culled SaveLayer", //
2776+
[](DisplayListBuilder& builder, DlPaint& paint) {
2777+
DlPaint save_paint;
2778+
save_paint.setColor(DlColor::kTransparent());
2779+
builder.SaveLayer(nullptr, &save_paint);
2780+
builder.DrawImage(TestImage1, {10, 10}, DlImageSampling::kLinear);
2781+
});
2782+
}
2783+
26252784
} // namespace testing
26262785
} // namespace flutter

0 commit comments

Comments
 (0)