@@ -49,6 +49,12 @@ TEST_F(BackdropFilterLayerTest, EmptyFilter) {
4949 auto layer = std::make_shared<BackdropFilterLayer>(nullptr );
5050 layer->Add (mock_layer);
5151
52+ auto analysis_result = layer->Analyze ();
53+ EXPECT_FALSE (analysis_result.layer_reads_surface );
54+ EXPECT_TRUE (analysis_result.renders_to_save_layer );
55+ EXPECT_FALSE (analysis_result.child_reads_surface );
56+ EXPECT_FALSE (analysis_result.needs_screen_readback ());
57+
5258 layer->Preroll (preroll_context (), initial_transform);
5359 EXPECT_EQ (layer->paint_bounds (), child_bounds);
5460 EXPECT_TRUE (layer->needs_painting ());
@@ -75,6 +81,12 @@ TEST_F(BackdropFilterLayerTest, SimpleFilter) {
7581 auto layer = std::make_shared<BackdropFilterLayer>(layer_filter);
7682 layer->Add (mock_layer);
7783
84+ auto analysis_result = layer->Analyze ();
85+ EXPECT_TRUE (analysis_result.layer_reads_surface );
86+ EXPECT_TRUE (analysis_result.renders_to_save_layer );
87+ EXPECT_FALSE (analysis_result.child_reads_surface );
88+ EXPECT_TRUE (analysis_result.needs_screen_readback ());
89+
7890 layer->Preroll (preroll_context (), initial_transform);
7991 EXPECT_EQ (layer->paint_bounds (), child_bounds);
8092 EXPECT_TRUE (layer->needs_painting ());
@@ -91,6 +103,33 @@ TEST_F(BackdropFilterLayerTest, SimpleFilter) {
91103 MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
92104}
93105
106+ TEST_F (BackdropFilterLayerTest, EmptyFilterButChildReadback) {
107+ const SkRect child_bounds = SkRect::MakeLTRB (5 .0f , 6 .0f , 20 .5f , 21 .5f );
108+ const SkPath child_path = SkPath ().addRect (child_bounds);
109+ const SkPaint child_paint = SkPaint (SkColors::kYellow );
110+ auto mock_layer = std::make_shared<MockLayer>(
111+ child_path, child_paint, true /* fake_layer_reads_surface */ );
112+ auto layer = std::make_shared<BackdropFilterLayer>(nullptr );
113+ layer->Add (mock_layer);
114+
115+ auto analysis_result = layer->Analyze ();
116+ EXPECT_FALSE (analysis_result.layer_reads_surface );
117+ EXPECT_TRUE (analysis_result.renders_to_save_layer );
118+ EXPECT_TRUE (analysis_result.child_reads_surface );
119+ EXPECT_FALSE (analysis_result.needs_screen_readback ());
120+
121+ layer->Preroll (preroll_context (), SkMatrix ());
122+ layer->Paint (paint_context ());
123+ EXPECT_EQ (
124+ mock_canvas ().draw_calls (),
125+ std::vector ({MockCanvas::DrawCall{
126+ 0 , MockCanvas::SaveLayerData{child_bounds, SkPaint (),
127+ nullptr , 1 }},
128+ MockCanvas::DrawCall{
129+ 1 , MockCanvas::DrawPathData{child_path, child_paint}},
130+ MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
131+ }
132+
94133TEST_F (BackdropFilterLayerTest, MultipleChildren) {
95134 const SkMatrix initial_transform = SkMatrix::MakeTrans (0 .5f , 1 .0f );
96135 const SkRect child_bounds = SkRect::MakeLTRB (5 .0f , 6 .0f , 2 .5f , 3 .5f );
@@ -100,12 +139,19 @@ TEST_F(BackdropFilterLayerTest, MultipleChildren) {
100139 const SkPaint child_paint1 = SkPaint (SkColors::kYellow );
101140 const SkPaint child_paint2 = SkPaint (SkColors::kCyan );
102141 auto layer_filter = SkImageFilters::Paint (SkPaint (SkColors::kMagenta ));
103- auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
142+ auto mock_layer1 = std::make_shared<MockLayer>(
143+ child_path1, child_paint1, true /* fake_layer_reads_surface */ );
104144 auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
105145 auto layer = std::make_shared<BackdropFilterLayer>(layer_filter);
106146 layer->Add (mock_layer1);
107147 layer->Add (mock_layer2);
108148
149+ auto analysis_result = layer->Analyze ();
150+ EXPECT_TRUE (analysis_result.layer_reads_surface );
151+ EXPECT_TRUE (analysis_result.renders_to_save_layer );
152+ EXPECT_TRUE (analysis_result.child_reads_surface );
153+ EXPECT_TRUE (analysis_result.needs_screen_readback ());
154+
109155 SkRect children_bounds = child_path1.getBounds ();
110156 children_bounds.join (child_path2.getBounds ());
111157 layer->Preroll (preroll_context (), initial_transform);
@@ -142,13 +188,25 @@ TEST_F(BackdropFilterLayerTest, Nested) {
142188 auto layer_filter1 = SkImageFilters::Paint (SkPaint (SkColors::kMagenta ));
143189 auto layer_filter2 = SkImageFilters::Paint (SkPaint (SkColors::kDkGray ));
144190 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
145- auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
191+ auto mock_layer2 = std::make_shared<MockLayer>(
192+ child_path2, child_paint2, true /* fake_layer_reads_surface */ );
146193 auto layer1 = std::make_shared<BackdropFilterLayer>(layer_filter1);
147194 auto layer2 = std::make_shared<BackdropFilterLayer>(layer_filter2);
148195 layer2->Add (mock_layer2);
149196 layer1->Add (mock_layer1);
150197 layer1->Add (layer2);
151198
199+ auto analysis_result1 = layer1->Analyze ();
200+ EXPECT_TRUE (analysis_result1.layer_reads_surface );
201+ EXPECT_TRUE (analysis_result1.renders_to_save_layer );
202+ EXPECT_TRUE (analysis_result1.child_reads_surface );
203+ EXPECT_TRUE (analysis_result1.needs_screen_readback ());
204+ auto analysis_result2 = layer2->Analyze ();
205+ EXPECT_TRUE (analysis_result2.layer_reads_surface );
206+ EXPECT_TRUE (analysis_result2.renders_to_save_layer );
207+ EXPECT_TRUE (analysis_result2.child_reads_surface );
208+ EXPECT_TRUE (analysis_result2.needs_screen_readback ());
209+
152210 SkRect children_bounds = child_path1.getBounds ();
153211 children_bounds.join (child_path2.getBounds ());
154212 layer1->Preroll (preroll_context (), initial_transform);
0 commit comments